[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 347

 

Bitte helfen Sie mir, diesen Code zu verbessern, um einen einfachen Expert Advisor zu erhalten. Das Prinzip ist einfach: Wir eröffnen 2 Positionen Sell und Bui mit festgelegten Stopps zum aktuellen Kurs. Wenn dann eines oder beide auslösen, eröffnen wir neue Positionen. Das Prinzip scheint einfach zu sein, aber es funktioniert trotzdem nicht. Vielen Dank!

//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);


Dateien:
ala.mq4  3 kb
 
Reshetov >> :

Dies scheint nur scheinbar genau richtig zu sein, aber in der Maschinendarstellung kann das letzte Bit unterschiedliche Werte annehmen. D.h. 2,9999, 3 oder 3,00000001


Um solche Missverständnisse auszuräumen, gibt es in MQL die Funktion NormalizeDouble().

Ja, NormalizeDouble() hilft, danke.

Aber es ist immer noch unklar, wie das möglich ist, es scheint eine einfache Division zu sein, und wenn man 0,5 oder 0,9 oder sogar 0,31 durch 0,1 dividiert, ist alles in Ordnung.

und hier hat er eindeutig 2,9, es ist nicht klar... der Taschenrechner ist genauer :-)

Danke an Reshetov und splxgf für ihre Hilfe.

 
mukata >> :


Aber es ist immer noch nicht klar, wie das möglich ist, es scheint eine einfache Division zu sein. Und wenn man 0,5 oder 0,9 oder sogar 0,31 durch 0,1 dividiert, ist es in Ordnung.

und hier ist es 2,9, das ist nicht klar... der Taschenrechner ist genauer :-)


Taschenrechner haben Rundungsfunktionen eingebaut. Und sie lösen das Problem auf die gleiche Weise, weil sie den gleichen mathematischen Coprozessor zur Berechnung von Gleitkommazahlen verwenden.

 

Hallo!

Können Sie mir bitte einen Tipp geben?!!!

Ich weiß selbst nicht, wie ich es machen soll.

Aufgabe:

EA gibt einmal am Tag 1-2 Bestellungen auf.

Der Anfangswert der Variablen wird manuell festgelegt und kann einen Wert zwischen 1 und 10 annehmen.

Sie müssen die zuvor eingestellte Variable in 1er-Schritten auf einen Wert von - 10 ändern

an jedem Arbeitstag des EA, nur um 1, wenn an diesem Tag kein TP ausgeführt wird.

Wenn TP ausgeführt wird, gibt die Variable den Wert - 1 zurück.

Das Zählen von SL ist nicht geeignet, da es sich um einen oder zwei Werte handeln kann und der Wert nur einmal pro Tag geändert werden kann.

D.h.

Variable = 1

Tag 1 SL - Variable =2

Tag 2 SL - variabel =3

Tag 3 SL - variabel =4

Tag 4 TP - Variable =1

Tag 5 SL - Variable =2

... Und so weiter.

Hilfe!

Ich danke Ihnen.

 
Enter писал(а) >>

Bitte helfen Sie mir, diesen Code zu verbessern, um einen einfachen Expert Advisor zu erhalten. Die Idee ist einfach: Wir eröffnen 2 Positionen Sell und Bui mit festgelegten Stopps zum aktuellen Kurs. Wenn dann eines oder beide auslösen, eröffnen wir neue Positionen. Das Prinzip scheint einfach zu sein, aber es funktioniert trotzdem nicht. Vielen Dank!

Nun, für die Arbeit von Experten sollte das "Fleisch" des Beraters trotzdem in der Startfunktion platziert werden...
 

Kenner, bitte helfen Sie.

Es gibt einen Code, der ein Momentum für eine einzelne Periode berechnet und es mit einer großen Periode integriert, um es dann als Indikator auszugeben.

Ich muss einen Indikator mit einer bestimmten Periode schreiben, der den Durchschnitt der resultierenden Kurve findet und ihn als Indikator ausgibt.

Der Code ist beigefügt:

#property indicator_separate_window
#Eigenschaft indicator_buffers 1
#property indicator_color1 DodgerBlue
#Eigenschaft indicator_width1 2

//------- Externe Indikatorparameter ----------------------------------------+
extern int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;

//extern int Applied_Price = 0; // Verwendeter Preis:
// 0 - PREIS_SCHLIESSEN
// 1 - PREIS_OFFEN
// 2 - PREIS_HOCH
// 3 - PREIS_NIEDRIG
// 4 - PREIS_MEDIAN
// 5 - PREIS_TYPISCH
// 6 - PREIS_GEWICHTET
extern NumberOfBars = 1000; // Anzahl der Balken (0-all)

//------- Indikatorpuffer ---------------------------------------------------+
double buf0[];

//+----------------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+----------------------------------------------------------------------------+
void init() {
SetIndexPuffer (0, buf0);
SetIndexEmptyValue(0, 0);
SetIndexLabel (0, "i-mtm_integr");
SetIndexStyle (0, DRAW_LINE);
}

//+----------------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Deinitialisierungsfunktion |
//+----------------------------------------------------------------------------+
void deinit() {
Kommentar(");
}

//+----------------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3;
double mtm, mtmsum;

if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=AnzahlTakte;
LoopBegin=MathMin(LoopBegin, Bars-1);

for (i=LoopBegin; i>=0; i--) {
mtm=Schluss[i]-Schluss[MTM_Periode+i];
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Schluss[i]-Schluss[MTM_Periode+i];
mtmsum[i]=0+mtm;
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i];
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

Kenner, bitte helfen Sie.

Es gibt einen Code, der ein Momentum für eine einzelne Periode berechnet und es mit einer großen Periode integriert, um es dann als Indikator auszugeben.

Ich muss einen Indikator mit einer bestimmten Periode schreiben, der den Durchschnitt der resultierenden Kurve findet und ihn als Indikator ausgibt.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i, j, per=3;
  double mtm, mtmsum;

  if ( NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin= NumberOfBars;
  LoopBegin=MathMin( LoopBegin, Bars-1);

  for ( i= LoopBegin; i>=0; i--) {
    mtm=Close[ i]-Close[ MTM_Period+ i];
    mtmsum= mtmsum+ mtm;
    buf0[ i]= mtmsum;
  }
  for ( i= LoopBegin- per; i>= per; i--){
     MA[ i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Vielleicht ist diese Variante ausreichend. Ich habe den Code nicht überprüft, sondern ihn im Browser geschrieben.
 
Reshetov >> :

Dies scheint nur scheinbar genau richtig zu sein, aber in der Maschinendarstellung kann das letzte Bit unterschiedliche Werte annehmen. D.h. 2,9999, 3 oder 3,00000001

Um solche Missverständnisse auszuräumen, hat MQL die Funktion NormalizeDouble()


Warum wird die Funktion NormalizeDouble() nicht standardmäßig für alle Werte von Ask, Bid, Low usw. ausgeführt?

Jeder ist darauf hereingefallen und muss es dann "manuell" reparieren... Seltsam, dass MT nicht lesen kann, was es selbst hervorgebracht hat.

 
Silen >> :

Danke, gibt es eine Garantie, dass die Daten in start() verfügbar sind?

Sie können versuchen, RefreshRates() zu verwenden - siehe Beispiele in der Standardhilfe von MetaEditor

 

In der EA-Optimierung gibt es eine Option "Als Bericht speichern", aber die "Eingabeparameter" werden im Internet Explorer nicht angezeigt,

obwohl sie, dem html-Code nach zu urteilen, dort vorhanden sind. Im Allgemeinen wurde die Optimierung im Hinblick auf diese Parameter eingeleitet.

Weiß jemand, wie man sie in einem Explorer sehen kann?


(Es gibt auch die Möglichkeit, sie mit einem separaten Befehl in eine Textdatei zu kopieren, aber es ist besser, sie im IE zu sehen)

Grund der Beschwerde: