Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 441

 

Können Sie mir bitte sagen, was ich falsch mache?

Ich muss berechnen, wie viele Balken seit dem letzten Überschreiten des MA durch den Kurs vergangen sind - ohne den Null-Balken.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

Können Sie mir bitte sagen, was ich falsch mache?

Sie müssen - zählen, wie viele Balken seit dem letzten Überschreiten des MA vergangen sind - den Null-Balken nicht mitgerechnet.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

Soweit ich das verstanden habe, wird der Zyklus sofort verlassen, sobald Sie die Kreuzung identifiziert und Stop=1 gesetzt haben. Ok, dann müssen Sie noch weiter gehen und sich die Nummer der Kerze merken, bei der der Übergang stattgefunden hat. D.h.

Es ist einfacher, sie selbst zu schreiben:

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

Das heißt, Sie haben die Nummer der Kerze ermittelt. Wenn die Zahl = 2 und berücksichtigen Sie nicht die aktuelle, dann seit der Kreuzung eine Kerze gebildet wurde (oder interpretieren Sie es, wie Sie wollen).

 
Tapochun:

Soweit ich das verstanden habe, wird der Zyklus sofort verlassen, sobald Sie den Crossover identifiziert und Stop=1 gesetzt haben. OK, dann müssen Sie weiter gehen und sich die Nummer der Kerze merken, bei der der Crossover aufgetreten ist. D.h.

Es ist einfacher, sie selbst zu schreiben:

Das heißt, Sie haben die Nummer der Kerze ermittelt. Wenn die Zahl = 2 und ignorieren Sie die aktuelle, dann eine Kerze hat sich seit der Kreuzung (gut, oder interpretieren Sie es, wie Sie wollen).

Danke, so hat es bei mir funktioniert.


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
Können Sie mir sagen, ob dies eine realistische Testerfigur ist? Und ist das ein gutes oder schlechtes Ergebnis für ein Jahr mit einem 3.000-Dollar-Depo?
Die Antwort ist einfach: Die Leistung des Testers ist NICHT ECHT, wenn Sie einen EA testen. Der Strategy Tester wird von Händlern verwendet, um die Leistung des ATC zu überprüfen oder um manuelle Strategien online zu testen.
 
-Aleks-:

Danke, so hat es bei mir auch funktioniert.


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

Sie sollten es nicht so schreiben, denn wenn es während der letzten 1000 Takte keinen Crossover gab, wird erstens die Schleife fortgesetzt, und zweitens kann es zu einer Schleife/einem Fehler kommen, denn wenn die Geschichte endet und es keinen Crossover gibt, gibt es keinen Ausstieg aus der Schleife, weil Stop = 0. Es ist besser, es so zu schreiben, wie ich es oben erwähnt habe.

 
Tapochun:

Sie sollten es nicht so schreiben, denn wenn es während der letzten 1000 Takte keinen Crossover gab, wird erstens der Zyklus fortgesetzt und zweitens kann es zu einer Schleife/Fehler kommen, denn wenn die Geschichte endet und kein Crossover auftritt, gibt es keinen Ausstieg aus dem Zyklus, weil Stop = 0. Es ist besser, es so zu schreiben, wie ich es oben erwähnt habe.

Das "oder"-Zeichen funktioniert nicht - je nach Ausdruck wird die Schleife entweder um 1000 Takte überschritten oder sie wird beendet, sobald das gewünschte Ergebnis gefunden wurde. Oder wird es vor 1000 Balken vorbei sein, wenn das gewünschte Ergebnis, d.h. der MA-Durchgang, erreicht wird?
 
-Aleks-:
Funktioniert das "oder"-Zeichen nicht - die Bedingung besagt, dass entweder 1000 Balken erreicht oder das Programm beendet wird, sobald das gewünschte Ergebnis gefunden wird. Oder wird es vor 1000 Balken vorbei sein, wenn das gewünschte Ergebnis, d.h. das Kreuzen des MA?
|| bedeutet, dass sich der Zyklus wiederholt, wenn mindestens eine der Bedingungen in den Klammern zutrifft. Daher wird der Zyklus auch dann fortgesetzt, wenn i >= 1000, aber stop = 0 ist, und i wird weiter erhöht, was zu falschen MA-Werten führt (falls er außerhalb der Historie liegt). Und der Break-Operator ist für die Beendigung der Schleife zuständig, wenn das gewünschte Ergebnis gefunden wurde;
 
Tapochun:
|| bedeutet, dass die Schleife wiederholt wird, wenn mindestens eine der Bedingungen in den Klammern wahr ist, d. h. selbst wenn i >= 1000, aber stop = 0 ist, wird die Schleife fortgesetzt, i wird weiter erhöht, was zu einem falschen MA-Wert führt (falls es einen Ausreißer in der Historie gibt). Und der Break-Operator ist für die Beendigung der Schleife zuständig, wenn das gewünschte Ergebnis gefunden wurde;
Verstanden, danke für die Klarstellung! Ich dachte, dass eine der Bedingungen falsch sein würde und die Schleife dann aufhören würde...
 

Hallo 2015.09.19_02:13AM MSC. In der Funktion ArrayResize() schreibt der Compiler ohnehin

gegenüber der Größe des Arrays - Komma erwartet, ob Sie int schreiben oder nicht. Wenn Sie nicht int schreiben, heißt es: "-.

Ich habe es ohne Schrift geändert. Und ich habe & Referenz und eckige Klammern entfernt - es hat funktioniert!
Warnungen: wenn es normal geschrieben wurde, -- Compiler schrieb: versteckt Bezeichner

Erklärung auf globaler Ebene. Und als ich die Bezeichner-Deklaration auf globaler Ebene entfernte, - schrieb

schreibt er: "Fehler, nicht deklarierter Bezeichner. Und ich habe die Arrays High[] und Low[] in HighP[] und LowP[] geändert. Nicht

geholfen. Der Compiler schreibt dasselbe. 02:27 MSC. Ich hänge eine Screenshot-Datei an.

 
Николай Никитюк:

Hallo 2015.09.19_02:13AM MSC. In der Funktion ArrayResize() schreibt der Compiler ohnehin

gegenüber der Größe des Arrays - Komma erwartet, ob Sie int schreiben oder nicht. Wenn Sie nicht int schreiben, heißt es: "-.

"ohne Typ. Und ich habe & Referenz und eckige Klammern entfernt - das hat geholfen!
Warnungen: wenn es normal geschrieben wurde, -- Compiler schrieb: versteckt Bezeichner

Erklärung auf globaler Ebene. Und als ich die Bezeichner-Deklaration auf globaler Ebene entfernte, - schrieb

schreibt er: "Fehler, nicht deklarierter Bezeichner. Und ich habe die Arrays High[] und Low[] in HighP[] und LowP[] geändert. Nicht

geholfen. Der Compiler schreibt dasselbe. 02:27 MSC. Ich hänge die Screenshot-Datei an.

  1. Bilder sollten wie folgt eingefügt werden:Forum: how to insert an image
  2. Lesen Sie denn überhaupt nicht, was Ihnen geraten wird?

    Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

    Fragen von Anfängern

    Karputov Vladimir, 2015.09.17 18:46

    1. Falsche Schreibweise von ArrayResize. Das sollte so sein:
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. Und das Setzen des Zeitreihen-Flags für das Array sieht dann so aus:
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);


Grund der Beschwerde: