Fehler, Irrtümer, Fragen - Seite 2437

 
Alexey Navoykov:

OnTesterPass wird also aufgerufen, ohne dass Frames vorhanden sind? Nun, dann ist das ein offensichtlicher Fehler. Dieses Ereignis bedeutet, dass ein Frame empfangen wird, nicht das Ende eines Durchgangs.

Alle Frames sollten bei OnTesterPass ankommen, bevor das Ereignis OnTesterDeinit aufgerufen wird. Das ist eine normale, gesunde Logik. Es sei denn, es handelt sich um eine erzwungene Testunterbrechung.

OnTesterPass wird aufgerufen, wenn mindestens ein Frame eingetroffen ist. Er kann in einer Packung mit Rahmen geliefert werden. Daher sollte OnTesterPass Frames in einer Schleife akzeptieren, nicht ein Frame nach dem anderen. Aber wenn "nach dem letzten Mal - nie", OnTesterPass wird nicht aufgerufen.

Die Optimierung endet, wenn das letzte Ergebnis vorliegt. Frames können später eintreffen, insbesondere wenn eine große Datenmenge in einem Frame übertragen wird oder wenn mehrere Frames auf einmal in einem Durchgang übertragen werden. Daher müssen wir den Empfang der verbleibenden Frames in OnTesterDeinit regeln, das nach Abschluss der Optimierung gestartet wird - ebenfalls in der Schleife.

Dies ist eine normale, gesunde Logik.

Ich habe wiederholt Beispiele für den Empfang von Frames genau in OnTesterDeinit genannt, nicht nur in OnTesterPass. Und es ist der Empfang von komplexen Rahmen verschiedener Typen

 
Slava:

wenn mehrere Bilder auf einmal in einem Durchgang durchlaufen werden.

Ich habe das einmal versucht, es hat nicht funktioniert. Nur ein FrameAdd hat funktioniert.

 
Slava:

Die Optimierung stoppt, wenn das letzte Ergebnis eingetroffen ist. Frames können später ankommen, vor allem wenn eine große Datenmenge in einem Frame übertragen wird oder wenn mehrere Frames in einem Durchgang übertragen werden. Daher ist es notwendig, den Empfang der verbleibenden Frames in OnTesterDeinit zu regeln, das nach Abschluss der Optimierung - ebenfalls in der Schleife - gestartet wird.

Wenn Frames später eintreffen können, gibt es keine Garantie dafür, dass sie auch sofort in OnTesterDeinit ankommen... Das bedeutet, dass wir eine Warteschleife machen müssen, also wie lange sollten wir warten?

Ich dachte früher, dass die Situation wie folgt ist: OnTesterPass wird nur für die Frames aufgerufen, die seit dem Ende des vorherigen OnTesterPass eingetroffen sind, aber wenn ein neues Frame eingetroffen ist, während OnTesterPass im Gange war, und zwar seit dem letzten Aufruf von FrameNext und vor der Beendigung der Funktion, wird dieses Frame hängen, bis ein neues Frame, das das Ereignis erzeugt, eintrifft. Aus diesem Grund ist OnTesterDeinit erforderlich, um diese ruhenden Frames zu empfangen.

 
Alexey Navoykov:

Wenn Frames später eintreffen können, gibt es keine Garantie, dass sie sofort in OnTesterDeinit verfügbar sind, d.h. Sie müssen einen Wartezyklus durchführen, und wie lange sollten Sie warten?

Ich dachte früher, dass die Situation wie folgt ist: OnTesterPass wird nur für die Frames aufgerufen, die seit dem Ende des vorherigen OnTesterPass eingetroffen sind, aber wenn ein neues Frame eintrifft, während OnTesterPass im Gange ist, und zwar seit dem letzten Aufruf von FrameNext und vor der Beendigung der Funktion, bleibt dieses Frame hängen, bis ein neues Frame eintrifft, das das Ereignis erzeugt. Aus diesem Grund ist OnTesterDeinit erforderlich, um diese ruhenden Rahmen aufzufangen.

FrameNext ist ein dummer mqd-Datei-Leser und sonst nichts.

FrameFirst ist FileSeek.
 
fxsaber:

Ich habe das einmal versucht, es hat nicht funktioniert. Nur ein FrameAdd hat funktioniert.

Ich habe hier ein Beispiel gezeigt.
 

Ich danke Ihnen.


PS FrameFirst ist hier überflüssig

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Testen von Strategien nach Zeitplan mit automatischer Substitution des Ergebnisses in Expert Advisor

Slawa, 2013.04.10 15:04

Hier ist ein Beispiel. In OnTester sendet der Expert Advisor zwei Frames - den Verlauf der Geschäfte und den Verlauf, an dem er gearbeitet hat.

In OnTesterDeinit werden alle Rahmen des ersten und zweiten Typs empfangen und verarbeitet

void OnTesterDeinit()
  {
   string        name;
   ulong         pass;
   long          id;
   double        value;
   int           handle,i;
   BalanceInTime balance[];
   MqlRates      rates[];
//---
   FrameFirst();
   FrameFilter("",1);
   while(FrameNext(pass,name,id,value,balance))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(balance); i++)
            FileWrite(handle,balance[i].date,EnumToString(balance[i].entry),DoubleToString(balance[i].price,5),DoubleToString(balance[i].balance,2));
         FileClose(handle);
        }
     }
//---
   FrameFirst();
   FrameFilter("",2);
   while(FrameNext(pass,name,id,value,rates))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(rates); i++)
            FileWrite(handle,rates[i].time,DoubleToString(rates[i].open,5),DoubleToString(rates[i].high,5),DoubleToString(rates[i].low,5),DoubleToString(rates[i].close,5),string(rates[i].tick_volume));
         FileClose(handle);
        }
     }
//---
  }
 
fxsaber:


PS FrameFirst ist hier überflüssig.

Nein. Nicht überflüssig - rein methodisch gesehen. Ein kompletter Code-Block ohne Voreinstellungen

Dieser Code wurde aus einem komplexeren Code herausgerissen. Es wurden vier verschiedene Rahmentypen übertragen. Gleichzeitig lesen wir auch OnTesterPass. Hier ist der "verfeinerte" Code.

 
Slava:

Nein. Nicht redundant - rein methodisch gesehen. Ein kompletter Codeblock ohne Voreinstellungen

Dieser Code wurde aus einem komplexeren Code herausgerissen. Es wurden vier verschiedene Rahmentypen übertragen. Gleichzeitig lesen wir auch OnTesterPass. Hier stellen wir den "verfeinerten" Code vor.

About FrameFirst ist immer überflüssig, wenn es vor FrameFilter aufgerufen wird.

Ich würde nicht empfehlen, die Daten über mehr als einen Rahmen zu übertragen.

 
fxsaber:

About FrameFirst ist immer redundant, wenn es vor FrameFilter aufgerufen wird.

Es wird nicht empfohlen, Daten über mehr als einen Rahmen zu übertragen.

1. Ja, sie kann überflüssig sein.

2. ein Typ von Frames wird in OnTesterPass gelesen und in OnTesterDeinit beendet. Die anderen Frames werden in OnTesterDeinit gelesen

Diese Möglichkeit, verschiedene Arten von Frames zu senden und zu empfangen, ermöglichte es uns, mehrere Fehler zu beheben, die im Testgerät schwer zu reproduzieren waren. Und die Bilder wurden nur übertragen, wenn eine Differenz zu einem Referenzwert bestand.

 
Slava:

Werden Sie das Opt-Format öffnen?