Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 176

 
mila.com:

Lesen, wäre aber nie auf die Idee gekommen, die Datei vor der Schleife zu öffnen )

Vielleicht habe ich ihn nicht sorgfältig gelesen.)
Es gibt sogar ein Beispiel für das Lesen einer Datei Zeile für Zeile vom Anfang bis zum Ende...
 

Es gibt einen Expert Advisor, der sich beim Handel an der Pinbar orientiert. Der Roboter arbeitet korrekt auf Währungen und völlig unberechenbar auf CFDs.

Können Sie mir bitte sagen, wie das passieren kann?

 
RichLux:

Ich habe einen Roboter geschrieben, der beim Handel auf Pinbar basiert. Der Roboter arbeitet korrekt auf Währungen und völlig unberechenbar auf CFDs.

Können Sie mir bitte sagen, wie das passieren kann?

Hier ist alles für Ihren Fall.
 

Hier ist die Pinbar-Definitionsfunktion

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Wenn ich sie in den Expert Advisor einfüge, funktioniert die Funktion einwandfrei (d. h. der Expert Advisor setzt die Geschäfte auf den nächsten Balken nach dem Balken, der den Bedingungen der Funktion entspricht) für Währungspaare. Der Handel mit CFD wird jedoch überall eröffnet.

Was ist der Unterschied zwischen CFDs und Währungspaaren für diese Funktion?

 
RichLux:

Hier ist die Pinbar-Definitionsfunktion

Wenn ich sie in den Expert Advisor einfüge, funktioniert die Funktion einwandfrei (d. h. der Expert Advisor setzt die Geschäfte auf den nächsten Balken nach dem Balken, der den Bedingungen der Funktion entspricht) für Währungspaare. Der Handel mit CFD wird jedoch überall eröffnet.

Was ist der Unterschied zwischen CFDs und Währungspaaren für diese Funktion?

Ersetzen Sie zunächst alle && durch {}, so dass jede der Bedingungen in einem eigenen Block steht - dann können Sie das getestete Ergebnis in jedem Block ausdrucken und sehen, welche Werte Sie im Protokoll erhalten.
 
Artyom Trishkin:
Ersetzen Sie zunächst alle && durch {}, so dass jede Bedingung in einem eigenen Block steht - dann können Sie in jedem Block das getestete Ergebnis abwickeln und im Protokoll sehen, welche Werte Sie erhalten.

Danke, ich habe die Ratschläge befolgt und verstanden, was ich falsch gemacht habe. Denn mein EA bewegte sich im 5-stelligen Bereich und der CFD ist nur 2-stellig und ich erwartete, dass der EA auf mindestens 50 Pips reagiert und bekam die Reaktion von 5 Pips. Ich habe es vermasselt.

Bitte helfen Sie mir bei diesem Aspekt.

Es gibt eine solche Stelle im Kodex:

MathAbs(Close1-Open1)/(High1-Low1)

Manchmal kommt es vor, dass High1=Low1. Das Prüfgerät meldet dann den kritischen Fehler, dass es nicht durch Null dividieren kann.

Wie kann man sie umgehen?

 
RichLux:

Danke, ich habe die Ratschläge befolgt und verstanden, was ich falsch gemacht habe. Denn mein EA bewegte sich im 5-stelligen Bereich und der CFD ist nur 2-stellig und ich erwartete, dass der EA auf mindestens 50 Pips reagiert und bekam die Reaktion von 5 Pips. Ich habe es vermasselt.

Bitte helfen Sie mir bei diesem Aspekt.

Es gibt eine solche Stelle im Kodex:

Manchmal kommt es vor, dass High1=Low1. Das Prüfgerät meldet dann den kritischen Fehler, dass es nicht durch Null dividieren kann.

Wie kann man sie umgehen?

Sie können es tun, ohne nachzudenken:

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

Hallo, beim Kompilieren ist ein Problem aufgetreten:


void OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

wenn (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

wenn (mp > maxprice)

maxprice = mp;

}

Comment("Mindestpreis: " + DoubleToString(minprice, 5) + "\n "+

"Höchstpreis: " + DoubleToString(maxprice, 5));

}


Der Quellcode enthält Funktionen, die der Compiler durch iLow und iHigh und die Variable Simbol() dort im String-Modus schwört, aber er löst ein anderes Problem im Beispiel. Was muss ich im obigen Code ändern? Ich komme nicht weiter und kann die Schleife nicht kompilieren, um sie zu überprüfen.

AUS DEM LEHRBUCH

Wenn Sie den Wert, der dem aktuellen unvollständigen Balken entspricht, abrufen möchten, dann

können Sie die erste Form des Aufrufs verwenden, wobei Sie start_pos=0 und count=1 angeben.

Beispiel:

#property copyright "2009, MetaQuotes Software Corp."

#property link "https://www.mql5.com"

#Eigenschaft Version "1.00"

#property description "Beispielhafte Ausgabe von High[i]- und Low[i]-Werten"

#property description "für zufällig ausgewählte Balken"

double High[],Low[];

//+------------------------------------------------------------------+

//| Tiefstwert für eine bestimmte Taktnummer ermitteln

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0;

ArraySetAsSeries(niedrig,wahr);

int copied=CopyLow(Symbol,Zeitrahmen,0,Bars(Symbol,Zeitrahmen),Low);

if(kopiert>0 && index<kopiert) low=Low[index];

zurück(niedrig);

}

//+------------------------------------------------------------------+

Hoch für die angegebene Taktnummer erhalten //|

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0;

ArraySetAsSeries(hoch,wahr);

int copied=CopyHigh(Symbol,Zeitrahmen,0,Bars(Symbol,Zeitrahmen),High);

if(kopiert>0 && index<kopiert) high=High[index];

zurück(hoch);

}

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Hallo, beim Kompilieren ist ein Problem aufgetreten:


void OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

wenn (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

wenn (mp > maxprice)

maxprice = mp;

}

Comment("Mindestpreis: " + DoubleToString(minprice, 5) + "\n "+

"Höchstpreis: " + DoubleToString(maxprice, 5))

}


Der Quellcode enthält Funktionen, die der Compiler auf iLow und iHigh b schwört. Die Variable Simbol() befindet sich dort im String-Modus, aber sie löst ein anderes Problem im Beispiel. Was muss ich im obigen Code ändern? Ich komme nicht weiter und kann die Schleife nicht kompilieren, um sie zu überprüfen.

AUS DEM LEHRBUCH

Wenn Sie den Wert, der dem aktuellen unvollständigen Balken entspricht, erhalten möchten, dann

können Sie die erste Form des Aufrufs verwenden, wobei Sie start_pos=0 und count=1 angeben.

Beispiel:

#property copyright "2009, MetaQuotes Software Corp."

#property link "https://www.mql5.com"

#Eigenschaft Version "1.00"

#property description "Beispielhafte Ausgabe von High[i]- und Low[i]-Werten"

#property description "für zufällig ausgewählte Balken"

double High[],Low[];

//+------------------------------------------------------------------+

//| Tiefstwert für eine bestimmte Taktnummer ermitteln

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0;

ArraySetAsSeries(niedrig,wahr);

int copied=CopyLow(Symbol,Zeitrahmen,0,Bars(Symbol,Zeitrahmen),Low);

if(kopiert>0 && index<kopiert) low=Low[index];

zurück(niedrig);

}

//+------------------------------------------------------------------+

Hoch für die angegebene Taktnummer erhalten //|

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0;

ArraySetAsSeries(hoch,wahr);

int copied=CopyHigh(Symbol,Zeitrahmen,0,Bars(Symbol,Zeitrahmen),High);

if(kopiert>0 && index<kopiert) high=High[index];

zurück(hoch);

}

//+------------------------------------------------------------------+


In diesem WortSimbol() ist ein Fehler enthalten, Sie sollten Symbol() oder _Symbol schreiben.
 
Sergey Gritsay:

Sie haben einen Fehler in diesem WortSimbol() - Symbol() oder _Symbol sollte geschrieben werden

Danke, der Fehler bei Simbol wurde durch die korrekte Schreibweise von Symbol korrigiert. Mit den Funktionen iLow und iHigh stimmt etwas nicht.

Derprozentuale Unterschied zwischen MQL4 und MQL5 ? sonst muss ich mich jedes Mal am Kopf kratzen, wenn ich die MQL4-Videotutorials durchsehe.

Dateien:
1.png  64 kb
Grund der Beschwerde: