MT-Version Archiv. - Seite 2

 
Сергей Таболин:

Die intelligente Annahme ist, dass die Übertragung sofort erfolgen soll, ohne dass der Rest des Codes ausgeführt wird. Oder?

Tatsächlich hält TesterStop() den Test aber gar nicht an!

Es wird erwartet, dass, wenn die weitere Codeausführung gestoppt werden muss, einfach return geschrieben wird und keine weitere Ausführung stattfindet. TesterStop(), sowie ExpertRemove()

Der Expert Advisor wird nicht sofort gestoppt, wenn ExpertRemove() aufgerufen wird, es wird lediglich ein Flag gesetzt, um die Arbeit des Expert Advisors zu stoppen. D.h., der Expert Advisor behandelt keinnachfolgendes Ereignis, sondern ruft OnDeinit() auf und entlädt ihn aus dem Chart.

Und der zweite beobachtete Fehler ist, dass

tester_stop = false;

sie ist überhaupt nicht vorhanden.

 
Alexey Viktorov:

Es wird erwartet, dass Sie, wenn Sie die weitere Ausführung des Codes stoppen wollen, einfach return schreiben und es wird keine weitere Ausführung geben. TesterStop() sowie ExpertRemove()

Und der zweite Fehler, der uns aufgefallen ist, ist, dass

ist überhaupt nicht vorhanden.

Das nächste Ereignis ist OnTick() ?

Wohin führt der Ausgang von OnTick()?

Warum ist sie fehl am Platz? Es wurde erwartet, dass die Ausführung diese Zeile nicht erreicht, wenn TesterStop() ausgelöst wurde.

 
Сергей Таболин:

Das nächste Ereignis ist OnTick() ?

Woher nimmt OnTick() die Ausgabe?

Warum ist dies nicht der Fall? Es wurde erwartet, dass die Ausführung diese Zeile nicht erreicht, wenn TesterStop() ausgelöst wurde.

Wo man aussteigt und womit man weitermacht, bleibt dem Entwickler überlassen.

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

Das Flag tester_stop in diesem Code wird auf false gesetzt, unabhängig davon, ob TesterStop() ausgeführt wird oder nicht

 
Alexey Viktorov:

Wohin die Reise geht und was fortgesetzt wird, bleibt dem Entwickler überlassen.

In diesem Code wird das Flag tester_stop auf false gesetzt, unabhängig davon, ob TesterStop() ausgeführt wird oder nicht

Das habe ich schon)))

Die Frage ist, was zu tun ist? Wie kann der Test abgebrochen werden? Um genau zu sein. Entwickler fluchen fast, wenn sieINIT_PARAMETERS_INCORRECT in OnInit() verwenden, und es bläst die Genetik weg.

Ich habe einen Ausweg gefunden und hatte bis vor kurzem keine Probleme. Und jetzt ... Oh, liebe ))))

Und wo kann ich noch aus OnTick() herauskommen?

 
Сергей Таболин:

Das habe ich schon verstanden)))

Die Frage ist, was zu tun ist? Wie kann ich den Test abbrechen? Um genau zu sein. Entwickler fluchen fast, wenn sieINIT_PARAMETERS_INCORRECT in OnInit() verwenden, und es bläst die Genetik weg.

Ich habe einen Ausweg gefunden, aber es gab in letzter Zeit keine Probleme. Und jetzt ... Oh, liebe ))))

Nun, wenn Sie verstehen, was das Problem ist?

         TesterStop();
      tester_stop = false;
      return;

Der gesamte Code nach der Ausführung von TesterStop wird nicht ausgeführt. Das heißt, es wird sofort aufhören zu funktionieren. Darüber hinaus können wir das Flag tester_stop anpassen...

Eine weitere Frage: Wie lautet diese Zahl? Ist ein Minus von vielen Neunen ein Versuch, zusätzliche Schmerzen zu bekommen? Das ist der Punkt, an dem es wirklich hässlich wird...

 
Alexey Viktorov:

Nun, wenn Sie verstehen, was das Problem ist links?

Der gesamte Code nach der Ausführung von TesterStop wird nicht ausgeführt. Mit anderen Worten: Es wird sofort aufhören zu funktionieren. Von dort aus können wir mit dem Flag tester_stop regulieren...

Eine weitere Frage: Wie lautet diese Zahl? Ist ein Minus von vielen Neunen ein Versuch, zusätzliche Schmerzen zu bekommen? Das ist der Punkt, an dem es wirklich hässlich wird...

Minus eine Menge Neunen ist, um festzustellen, dass die Ausgabe genau durch TesterStop() erfolgte. Ich verwende es nur als Ersatz fürINIT_PARAMETERS_INCORRECT. Deshalb brauche ich alles andere danach nicht. Nun wird aber der gesamte Code ausgeführt und der Programmierer erhält den Fehler "Division durch Null". Klar, wenn ein Array die Größe 1 hat, ist der Wert des Letzteren minus dem Wert des Ersteren immer Null! Und ich hatte mich nicht gegen diesen Fehler oder, oh, entschuldigen Sie, dieses Missverständnis versichert.

Ich habe versucht, Return einzufügen... Nur ein bisschen falsch ))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

Ich habe es geschafft:

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Einfach großartig ))))

Großes DANKESCHÖN!!!

 
Сергей Таболин:

Minus eine Menge Neunen ist, um festzustellen, dass die Ausgabe genau durch TesterStop() erfolgte. Ich verwende es nur als Ersatz fürINIT_PARAMETERS_INCORRECT. Deshalb brauche ich alles andere danach nicht. Nun wird aber der gesamte Code ausgeführt und der Programmierer erhält den Fehler "Division durch Null". Klar, wenn ein Array die Größe 1 hat, ist der Wert des Letzteren minus dem Wert des Ersteren immer Null! Und ich hatte mich nicht gegen diesen Fehler oder, oh, entschuldigen Sie, dieses Missverständnis versichert.

Ich habe versucht, Return einzufügen... Nur ein bisschen falsch ))) :

Ich habe es geschafft:

Einfach großartig ))))

EIN RIESIGES DANKESCHÖN!!!

Sergej Tabolin:

Danke, das habe ich schon verstanden. Aber das Problem ist damit nicht gelöst. Es kann entweder durch die KonstanteMQL_TESTER_STOP oder durch Änderung des Rückgabewerts von void zu bool gelöst werden.

Eine unerwartete Lösung wurde vonAlexey Viktorov vorgeschlagen: Wenn return nach TesterStop() verwendet wird, scheint alles in Ordnung zu sein. Wie und warum das passiert, kann ich persönlich nicht herausfinden. Trotzdem...

Fügen Sie daher entweder diesen Punkt in die Dokumentation ein oder ändern Sievoid in bool.

P.S. Dieses Problem ist bei mir in Build 2085 aufgetreten. Davor gab es keine Probleme. Sagt mir das etwas? )))

Sergey, das ist nichts Unerwartetes. Im Gegenteil, sie ist logisch und konsequent. Es gibt verschiedene Fälle. Manchmal müssen Sie die Verarbeitung des Ereignisses beenden, bevor der Expert Advisor fertig ist, und manchmal, wie in Ihrem Fall, müssen Sie es sofort beenden. Die Entwickler stehen vor der Frage, ob es richtig ist, sofort anzuhalten und damit die Unzufriedenheit derjenigen zu verursachen, die die Verarbeitung des Ereignisses abschließen müssen, oder nach Abschluss der Ereignisverarbeitung anzuhalten. Jeder Programmierer hat einen Return-Operator in seinem Arsenal, während es im Falle eines erzwungenen Abbruchs nichts gibt.

Und warum müssen Sie den Typ void bei bool ändern, denn auch hier gibt es im Arsenal des Programmierers statische Variablen, die vor oder nach TesterStop () geändert werden können, und im Prinzip wird alles so sein, wie Sie wollen. Und das haben Sie aus irgendeinem Grund in meinem Beispiel ausgelassen.

 
Alexey Viktorov:

Sergey, das ist nichts Unerwartetes. Im Gegenteil, alles ist logisch und konsequent. Es gibt verschiedene Fälle. Manchmal müssen Sie die Verarbeitung des Ereignisses beenden, bevor der Expert Advisor fertig ist, und manchmal, wie in Ihrem Fall, müssen Sie es sofort beenden. Die Entwickler stehen vor der Frage, ob es richtig ist, sofort anzuhalten und damit die Unzufriedenheit derjenigen zu verursachen, die die Verarbeitung des Ereignisses abschließen müssen, oder nach Abschluss der Ereignisverarbeitung anzuhalten. Jeder Programmierer hat einen Return-Operator in seinem Arsenal, während es im Falle eines erzwungenen Abbruchs nichts gibt.

Und warum müssen Sie den Typ void bei bool ändern, denn auch hier gibt es im Arsenal des Programmierers statische Variablen, die vor oder nach TesterStop () geändert werden können, und im Prinzip wird alles so sein, wie Sie wollen. Und das haben Sie aus irgendeinem Grund in meinem Beispiel ausgelassen.

Alexey, vielen Dank für deine Hilfe.

Ich verstehe das Problem, mit dem die Entwickler konfrontiert sind, und deshalb schlage ich eine solche Lösung vor. Um in der Lage zu sein, auf die Situation richtig zu reagieren.

Was die statischen Variablen und Ihr Beispiel betrifft, das ich "verworfen" habe... Entschuldigung, aber ich verstehe nicht ganz, wovon ich spreche. Erklären Sie es mir, wenn es Ihnen nichts ausmacht.

Und bitten Sie um etwas Nachsicht und Geduld. Ich habe eine sehr schlechte Lebenssituation, die mich sehr reizbar (ich verstehe es, kann aber nichts dagegen tun) und rücksichtslos macht.

Ich verstehe das überhaupt nicht. Mir schwirrt der Kopf...

Hier ist ein Beispiel:

Mein Code zeigt, dass das Ergebnis -99999999999,88 sein muss, wenn der letzte Array-Wert minus dem ersten Array-Wert vor Null ist.

Aber während der Optimierung erhalte ich dieses Ergebnis:

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 ist auf keinen Fall gleich Null und das Ergebnis ist -9999999999999,88. Wie?!?!? Ich bekomme schon einen Hänger...

 
Сергей Таболин:

Alexey, vielen Dank für deine Hilfe.

Ich verstehe das Problem, mit dem die Entwickler konfrontiert sind, und deshalb schlage ich eine solche Lösung vor. Um in der Lage zu sein, auf die Situation richtig zu reagieren.

Was die statischen Variablen und Ihr Beispiel betrifft, das ich "verworfen" habe... Tut mir leid, aber ich verstehe nicht ganz, worüber wir hier reden. Erklären Sie es mir, wenn es Ihnen nichts ausmacht.

Und bitten Sie um etwas Nachsicht und Geduld. Ich habe eine sehr schlechte Lebenssituation, die mich sehr reizbar (ich bin mir dessen bewusst, kann aber nichts dagegen tun) und unaufmerksam machen kann.

Ich verstehe das überhaupt nicht. Mir schwirrt der Kopf...

Hier ist ein Beispiel:

Mein Code zeigt, dass das Ergebnis -99999999999,88 sein muss, wenn der letzte Array-Wert minus dem ersten Array-Wert vor Null ist.

Aber während der Optimierung erhalte ich dieses Ergebnis:

9587 - 10000 ist auf keinen Fall gleich Null und das Ergebnis ist -9999999999999,88. Wie?!?!? Ich bekomme einen Hänger...

Ich weiß nicht, ob das gut oder schlecht ist, aber ich schaue mir nie den ganzen Code an, deshalb habe ich von einer statischen Variablen gesprochen. Und da das Flag tester_stop in verschiedenen Teilen des Programms verwendet wird, muss dieses Flag auf der Ebene der globalen Variablen deklariert werden.

Es bestätigt, dass Sie die Änderung des Wertes der Flagge in meinem Beispiel unangemessenerweise "verworfen" haben.

Dies ist die Verwendung von

   if(tester_stop) return(-99999999999.99);

Und anscheinend ändert sich dieses Kennzeichen entweder überhaupt nicht, oder es ändert sich nicht, weil die Änderung nicht an der richtigen Stelle vorgenommen wird.

 
Alexey Viktorov:
Manchmal ist es notwendig, die Ereignisverarbeitung vor der Beendigung des Beraters zu beenden.

Jeder Programmierer hat den Return-Operator in seinem Arsenal, aber es gibt nichts in der erzwungenen Beendigung.


Können wir in diesem Zusammenhang nicht eine Kontrolle durchführen?

if(IsStopped())
if(!IsStopped())