MT-Version Archiv. - Seite 4

 
Roman:

Können wir in diesem Zusammenhang nicht die Kontrolle übernehmen?

Leider hat diese Überprüfung nichts ergeben...

 
Roman:

Mit dem Beispiel IsStopped() habe ich nur versucht, den ersten Teil zu beantworten.
Manchmal ist es notwendig, die Bearbeitung eines Ereignisses im Voraus abzuschließen, und manchmal ist es dringend, wie in Ihrem Fall.
Lesen Sie die Beschreibung dieser Funktion IsStopped() in der Dokumentation, vielleicht bringt sie Sie auf einige Ideen.
Aber für Sie scheint es aus einer anderen Richtung zu kommen. Wenn ja, entschuldigen Sie bitte eine mögliche Vermutung.
Aber wie man in möglichen Vorschlägen sagt, und das Problem löst.
Definitive Lösung wird nicht sagen, jemand, weil niemand weiß, alle die Logik seines Codes, und wahrscheinlich nicht in sie zu vertiefen.

Roman, Sie zitieren wieder einmal nicht bis zum Ende. Und Sie haben es unter allen hervorgehobenen hervorgehoben.

Nun gut, nehmen wir an, eine Zwangsabschaltung wird eingeleitet. Was ich brauche, ist, dass das Ereignis, in dem diese Beendigung ausgelöst wird, bis zum Ende ausgeführt wird und die Komplexität der Berechnungen 3 Sekunden überschreitet. Und wie kann ich den Abbruch des Programms verhindern und es bis zum Ende laufen lassen? Genau das ist das Problem. In dem Gespräch ging es nicht darum, wie man kündigt, sondern wie man eine fälschlich ausgesprochene Kündigung verhindert. Oder nicht zu verhindern, sondern auf einen bestimmten Zeitpunkt zu verschieben, insbesondere bis die Ereignisverarbeitung abgeschlossen ist.

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

Hier ist eine Überprüfung Ihrer Option. Das Ergebnis war eine Meldung wie diese:

Es ist eine Sackgasse...

Die vorgeschlagene Option lautet also

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

werden auf genau dieselbe Weise berechnet. Und Sie werden wieder eine "Sackgasse" bekommen. Aber die Sackgasse liegt nicht in mql, sondern in Ihrem Kopf. So kann man nicht programmieren. Bevor Sie irgendetwas von dem Code erwarten, versetzen Sie sich in die Lage eines Idioten und gehen Sie blindlings, wie ein Computer, mehrmals durch den gesamten Code. Vergewissern Sie sich, wohin die Ausführung in einem bestimmten Fall übergeben werden muss. Welche Parameter in einem bestimmten Fall empfangen werden sollen. Starten Sie dann die Ausführung und prüfen Sie, ob Sie das erhalten, was Sie erwarten. Wenn nein, dann müssen wir herausfinden, woher das kommt, was wir während des Debugging-Prozesses sehen.

Es kann nicht anders sein. Und es ist absolut unmöglich, die Codefragmente zu debuggen.

 
Alexey Viktorov:

Roman, Sie zitieren wieder einmal nicht bis zum Ende. Und Sie haben unter all den Hervorgehobenen hervorgehoben.

Nun gut, nehmen wir an, es wird eine Zwangsbeendigung ausgelöst. Und ich brauche das Ereignis, in dem diese Beendigung ausgelöst wird, um bis zum Ende ausgeführt werden und die Komplexität der Berechnungen überschreitet 3 Sekunden. Und wie kann ich die Beendigung des Programms verhindern und es bis zum Ende laufen lassen? Genau das ist das Problem. Bei dem Gespräch ging es nicht darum, wie man kündigt, sondern wie man eine fälschlich ausgesprochene Kündigung verhindert. Oder nicht zu verhindern, sondern bis zu einem bestimmten Zeitpunkt zu verzögern, insbesondere bis die Ereignisverarbeitung abgeschlossen ist.

Wir müssen warten, bis die Berechnung abgeschlossen ist.

Leider gibt es in mql keine Funktionen wie await.
Wir können versuchen, mit Sleep() zu experimentieren, aber Slip ist kein explizites Zeichen für die Beendigung, daher ist es nicht sehr geeignet.
Versuchen Sie, eine weitere Bedingung zu erstellen, wenn (die Berechnung ausgeführt wird), dann werden wir bereits eine erzwungene Beendigung starten.

 
Alexey Viktorov:

Die von mir vorgeschlagene Option lautet also

wird auf genau dieselbe Weise berechnet. Und wieder werden Sie eine "Sackgasse" bekommen. Aber die Sackgasse liegt nicht in mql, sondern in Ihrem Kopf. Sie können nicht einfach so programmieren. Bevor Sie irgendetwas von dem Code erwarten, versetzen Sie sich in die Lage eines Idioten und gehen Sie blindlings, wie ein Computer, mehrmals durch den gesamten Code. Vergewissern Sie sich, wohin die Ausführung in einem bestimmten Fall übergeben werden muss. Welche Parameter in einem bestimmten Fall empfangen werden sollen. Starten Sie dann die Ausführung und prüfen Sie, ob Sie das erhalten, was Sie erwarten. Wenn nein, dann müssen wir herausfinden, woher das kommt, was wir während des Debugging-Prozesses sehen.

Es kann nicht anders sein. Aber Sie können den Code nicht Fragment für Fragment debuggen.

Nun, das ist der Punkt ist, dass alles vor dem Update funktionierte und jetzt weiß ich einfach nicht, was ich tun soll.

Außerdem ist der gesamte Code im Prinzip offen.

Außerdem wollte ich einen Thread eröffnen, um die Verbesserung meiner Version von OnTester() zu diskutieren und hier ist er...

Wie sich herausstellte, liegt das Problem nicht darin, sondern in der geänderten Ausführung von TesterStop(). Es hat eigentlich keinen direkten Zusammenhang mit OnTester(), aber es hat mir die Laune verdorben...

Ich werde jetzt etwas anderes ausprobieren...

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

Das ist es ja, vor dem Update hat alles funktioniert, aber jetzt weiß ich einfach nicht, was ich tun soll.

Außerdem ist der gesamte Code im Prinzip offen.

Außerdem wollte ich bereits einen Thread eröffnen, um die Verbesserung meiner Version von OnTester() zu diskutieren, und hier ist er...

Wie sich herausstellte, liegt das Problem nicht darin, sondern in der geänderten Ausführung von TesterStop(). Es hat eigentlich keinen direkten Zusammenhang mit OnTester(), aber es hat mir die Laune verdorben...

Ich werde jetzt etwas anderes ausprobieren...

Sie haben einen Link zu früheren Builds angegeben. Ersetzen Sie die Dateien und überprüfen Sie sie. Dann können Sie allen mitteilen, welcher Build jetzt funktioniert. Wenn es nicht funktioniert, bedeutet das, dass die Parameter, die nicht zu diesem Teil des Codes führten, in dem jetzt die Probleme auftraten, einfach dieselben waren.

 
Alexey Viktorov:

Deshalb habe ich Ihnen einen Link zu früheren Builds gegeben. Ersetzen Sie die Dateien und überprüfen Sie sie. Dann können Sie allen mitteilen, welcher Build jetzt funktioniert. Wenn es nicht funktioniert, bedeutet das, dass die Parameter, die nicht zu diesem Teil des Codes führen, wo die Probleme jetzt auftraten, einfach die gleichen waren.

So habe ich es ausprobiert. Stellen Sie die 2007er Version ein, und alle diese Probleme sind verschwunden. Ich habe mir das gesamte Protokoll nach der Optimierung genau angesehen. Ich habe 4 (nur 4!) Fehler bei der Division durch Null gefunden. Das waren diejenigen, die auftraten, als es noch keinen Handel gab. Natürlich musste dies behoben werden, aber es hatte keinen Einfluss auf das Gesamtergebnis der Optimierung! Aber die neue Version hat eine alarmierende Anzahl von Fehlern verursacht und eine Optimierung unmöglich gemacht.

Nun zum Tipp von @Roman.

Vielen Dank, das war ein guter Beitrag. Aber in meinem Fall schien es für TesterStop() nutzlos zu sein, weil TesterStop() voraussetzt, dass der Test bereits einen unbekannten Prozentsatz bestanden hat. Und in der Dokumentation findet sich kein Wort darüber.

Es funktionierte aber gut mit ExsprtRemove(). Für diese Funktion spielt es keine Rolle, wie viele Tests dort bestanden wurden. Aber wir mussten den gesamten Arbeitscode in den if-Code einpacken

   if(!IsStopped())
   {
      тут рабочий код
   }

Nun, ich habe es geschafft, den Code mit Krücken zu reparieren. Nochmals vielen Dank.

P.S. Eigentlich musste ich eine Krücke für eine andere Krücke machen. Lustig ))))

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

P.S. Eigentlich musste ich eine Krücke für die andere Krücke machen. Das ist witzig ))))

Ich glaube nicht, dass es keine Optionen gibt. Wenn Sie gerne Krücken auf Krücken programmieren, habe ich kein Recht, das zu verhindern. Slawa antwortete zu diesem Thema.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Slava, 2019.06.16 14:04

Ein sofortiges Anhalten des Expert Advisors bedeutet eine Beschädigung des Speichers. Nach einem sofortigen Stopp des Expert Advisors können nicht freigegebene Speicherblöcke vorhanden sein. Daher wird das sofortige Anhalten des Expert Advisors nur verwendet, wenn das Client-Terminal oder der Tester-Agent beendet wird, und nur dann, wenn der Expert Advisor das Stopp-Flag nicht verarbeitet und die Ausführung fortsetzt.

TesterStop gibt den Befehl zum Beenden der Prüfung. Das bedeutet, dass nach Beendigung des aktuellen Handlers OnInit, OnTick, OnTimer, OnChartEvent keine weiteren Ereignisse des Testers mehr behandelt werden, da der Verarbeitungszyklus beendet ist. Stattdessen werden OnTester und OnDeinit aufgerufen.

Vielleicht haben Sie einen Fehler in der vorherigen Version verwendet. Jetzt wurde dieser Fehler behoben und wir müssen nach einer geeigneten Lösung suchen.
 
Сергей Таболин:

So habe ich es ausprobiert. Stellen Sie die 2007er Version ein, und alle diese Probleme sind verschwunden. Ich habe mir das gesamte Protokoll nach der Optimierung genau angesehen. Ich habe 4 (nur 4!) Fehler bei der Division durch Null gefunden. Das waren diejenigen, die auftraten, als es noch keinen Handel gab. Natürlich musste dies behoben werden, aber es hatte keinen Einfluss auf das Gesamtergebnis der Optimierung! Aber die neue Version hat eine alarmierende Anzahl von Fehlern verursacht und eine Optimierung unmöglich gemacht.

Nun zum Tipp von @Roman.

Vielen Dank, das war ein guter Beitrag. Aber in meinem Fall schien es für TesterStop() nutzlos zu sein, weil TesterStop() voraussetzt, dass der Test bereits einen unbekannten Prozentsatz bestanden hat. Und in der Dokumentation findet sich kein Wort darüber.

Es funktionierte aber gut mit ExsprtRemove(). Für diese Funktion spielt es keine Rolle, wie viele Tests dort bestanden wurden. Aber wir mussten den gesamten Arbeitscode in den if-Code einpacken

Nun, ich habe es geschafft, den Code mit Krücken zu reparieren. Nochmals vielen Dank.

P.S. Eigentlich musste ich eine Krücke für eine andere Krücke machen. Lustig ))))

Dies ist keine Krücke, sondern eine von den Entwicklern empfohlene Praxis.
Ich habe diese Funktion in der Beschreibung der while-Schleife gefunden

while(!IsStopped())
{

}

Deshalb hatte ich eine Idee: Wenn diese Funktiondie Tatsache eines erzwungenen Programmabbruchs prüft, warum sollte sie nicht für TesterStop() verwendet werden.
Es ist schade, dass es nicht für TesterStop() funktioniert, wir werden es jetzt wissen.
Aber es ist fair, die Entwickler zu fragen, ob die FunktionIsStopped() für die Funktion TesterStop() funktionieren muss?
Vielleicht ist es ein Fehler?

Aber das Wichtigste ist die Lösung des Problems.

 
Alexey Viktorov:

Ich glaube nicht, dass es keine Optionen gibt. Wenn Sie gerne Krücken für Krücken programmieren, habe ich kein Recht, mich einzumischen. Slava antwortete zu diesem Thema

Vielleicht haben Sie einen Fehler genutzt, den die Entwickler in der vorherigen Version begangen haben. Nun ist dieser Fehler behoben und wir müssen nach einer geeigneten Lösung suchen.

Ich verstehe alles, und ich brauche keine Krücken. Und ich musste hier nach einer Krücke suchen , um zu lesen, worum es geht.

Vielleicht. Aber ich kann mich nicht erinnern, dass sich jemand darüber beschwert hätte.

Grund der Beschwerde: