MT-Version Archiv. - Seite 3

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

Ich glaube, dass TesterStop() undExpertRemove() true zurückgeben sollten, wenn sie die Kontrolle nicht sofort an OnTester() übergeben können. Damit kann man zum Beispiel wie folgt reagieren:

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);

In diesem Fall können wir genau das Ergebnis erhalten, das logischerweise erwartet wird, anstatt herumzutanzen und alle Fehler vorherzusehen, die theoretisch als Folge des Abbruchs des Tests auftreten können.

Und das ist die Option, die Sie sehen wollten.

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

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

Und wie lässt sich die erzwungene Beendigung verhindern/abbrechen, wenn sie bereits läuft? Ihre Beispiele sind ein wenig anders.
 
Alexey Viktorov:
Und wie kann man die erzwungene Beendigung verhindern/abbrechen, wenn sie bereits läuft? Ihre Beispiele sind ein wenig anders.

Lösen Sie keine Zwangsbeendigung aus. Dann ist es nicht nötig, sie zu stornieren.

Wahrscheinlich ist es wegen möglicher Softwarefehler nicht sinnvoll, einen bereits laufenden Abschluss zu erzwingen und ihn abzubrechen.
Aus diesem Grund ist es wahrscheinlich, dass es diese Möglichkeit nicht gibt. Das kann ich nicht mit Sicherheit sagen.
Das bedeutet, dass wir unseren Code logisch so anordnen sollten, dass wir nicht wieder zum laufenden Code zurückkehren müssen, wenn der erzwungene Abbruch eingeleitet wird.
Wenn wir aufhören, hören wir ausdrücklich auf.

 
Roman:

Es ist unwahrscheinlich, dass es sinnvoll ist, eine bereits laufende Zwangsbeendigung wegen möglicher Softwarefehler abzubrechen.
Daher gibt es wahrscheinlich keine solche Option. Das kann ich nicht mit Sicherheit sagen.
Das bedeutet, dass wir unseren Code logisch so anordnen sollten, dass wir bei einem erzwungenen Abbruch nicht wieder zum laufenden Code zurückkehren müssen.
Wenn wir aufhören, hören wir ausdrücklich auf.

Irgendwie habe ich den Eindruck, dass Sie nicht alles zu diesem Thema gelesen haben. Irgendetwas stimmt nicht ganz mit Ihrer Meinung über das vorliegende Problem überein.

ps; Obwohl nein. In Ihrem ersten Beitrag zu diesem Thema schienen Sie genau meine Worte zu zitieren, aber nicht vollständig. Vielleicht hat sich dadurch die ganze Idee des Problems verschoben.
 
Wie auch immer die Fragen lauten, so lauten auch die Antworten. Sprechen Sie also mit sich selbst. Man versucht, sich mit dem Problem zu befassen, und die Leute mögen es trotzdem nicht. Viel Glück bei der Suche nach dem Problem.
 
Alexey Viktorov:

Und das ist die Version, die Sie sehen wollten.

Das ist richtig.

Aber ist nicht

if(недопустимый параметр)          tester_stop = TesterStop();

Einfacher und klarer als...

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Aber jetzt habe ich genau das getan, was Sie mir geraten haben.

 
Roman:
Solche Fragen und solche Antworten. Ihr könnt es mit euch selbst besprechen. Man versucht, ein Problem zu lösen, und die Leute mögen es trotzdem nicht. Viel Glück bei der Suche nach dem Problem.

Sie sollten nicht beleidigt sein. Man musste den ganzen Satz lesen, um ihn zu verstehen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT-Version Archiv.

Alexey Viktorov, 2019.06.16 15:25

Sergey, es gibt nichts Unerwartetes. Im Gegenteil, alles ist logisch und konsequent. Es gibt verschiedene Fälle. Manchmal müssen Sie die Ereignisverarbeitung abschließen, bevor der Expert Advisor seine Arbeit beendet hat, manchmal, wie in Ihrem Fall, müssen Sie sie dringend 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. Aber Sie haben es aus irgendeinem Grund in meinem Beispiel ausgelassen.

und Sie haben nur den zweiten Teil aus dem Zusammenhang gerissen, ohne dem ersten Teil Beachtung zu schenken.
 
Сергей Таболин:

Das ist richtig.

Aber ist es nicht

Einfacher und klarer als...

?

Aber jetzt habe ich genau das getan, was Sie mir geraten haben.

Es mag einfacher und klarer sein, aber von den Entwicklern etwas zu verlangen, was man leicht selbst schreiben kann, ist falsch. Aus irgendeinem Grund glaube ich nicht, dass irgendwelche Zusätze zur Sprache über C++ geschrieben und gefordert werden. Und ich bin sicher, dass diese Bemerkungen für viele ausreichen.

 
Alexey Viktorov:

Es mag einfacher und klarer sein, aber es ist falsch, von den Entwicklern etwas zu verlangen, was sie leicht selbst schreiben können. Aus irgendeinem Grund glaube ich nicht, dass irgendwelche Zusätze zur Sprache über C++ geschrieben und gefordert werden. Und ich bin sicher, dass diese Bemerkungen für viele ausreichen.

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

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

Es ist eine Sackgasse...

 
Alexey Viktorov:

Sie sollten nicht beleidigt sein. Man musste den ganzen Satz haben, um ihn zu verstehen.

und Sie haben nur den zweiten Teil aus dem Zusammenhang gerissen, ohne dem ersten Teil Beachtung zu schenken.

Mit dem Beispiel IsStopped() habe ich versucht, den ersten Teil zu beantworten.
Manchmal ist es notwendig, die Verarbeitung des Ereignisses abzuschließen, bevor ein EA abgeschlossen wird, 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.