Fehler, Irrtümer, Fragen - Seite 2438

 
Slava:

2. ein Typ von Frames wird in OnTesterPass gelesen, in OnTesterDeinit beendet. Andere Frames werden in OnTesterDeinit gelesen

Diese Funktion erlaubt es uns nicht, in Echtzeit mit den Ergebnissen der berechneten Durchgänge zu arbeiten, wenn es mehrere Bilder pro Durchgang gibt.

 
Es scheint sich hier um einen rein methodischen Fehler zu handeln

Forum für Handel, automatisierte Handelssysteme und Strategietests

Prüfung von Strategiefahrplänen mit automatischer Substitution der Ergebnisse in EAs

Slawa, 2013.04.10 15:04

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);
        }
     }
//---
  }
Vor FrameNext in der Schleife wäre es gut, ArrayFree bei jedem Durchlauf der Schleife aufzurufen.
 
Slava:

1. Ja. Kann überflüssig sein.

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

Diese Fähigkeit, verschiedene Arten von Frames zu senden und zu empfangen, ermöglichte es uns, einige schwer zu reproduzierende Fehler im Testgerät zu korrigieren. Und Rahmen wurden nur dann übertragen, wenn es eine Differenz zu einem Referenzwert gab.

Ich erwähnte bereits den Verlust von Einzelbildern. Wenn viele Einzelbilder in einem Durchgang übergeben werden und es Probleme mit dem Agenten gibt - die Verbindung wird unterbrochen - wird dann etwas dagegen unternommen?

 
fxsaber:

Werden Sie das Opt-Format öffnen?

Ja.

Als Gegenleistung für die Veröffentlichung des Codes zum Lesen der opt-Datei

 
fxsaber:

Mit dieser Funktion können Sie nicht in Echtzeit mit den Ergebnissen gezählter Durchgänge arbeiten, wenn es mehrere Bilder pro Durchgang gibt.

Ja.

Deshalb müssen wir Frames vom Typ "Non-Core" nach Abschluss der Optimierung lesen.

 
Aleksey Vyazmikin:

Ich habe vorhin über den Verlust von Einzelbildern gesprochen. Wenn viele Einzelbilder in einem Durchgang übertragen werden und es eine Störung beim Agenten gibt - eine Unterbrechung der Kommunikation - wird dann etwas dagegen unternommen?

Was können Sie tun?

Das Optimierungsergebnis wird auf jeden Fall früher und schneller als sein Rahmen verlassen. Wenn der Agent abgewürgt wurde (Computer heruntergefahren, Dienst gestoppt), kann definitiv nichts unternommen werden.

Wir könnten versuchen, Folgendes zu tun: Solange der Rahmen nicht gesendet wurde, wird das Ergebnis nicht gesendet. Aber es ist nicht abzusehen, wann wir das Problem lösen werden.

 
fxsaber:
Dies scheint ein rein methodischer Fehler zu sein.
Vor FrameNext in der Schleife ist es eine gute Idee, ArrayFree bei jedem Schleifendurchlauf aufzurufen.

Wir vermeiden eine unnötige Neuzuweisung von Speicherplatz.

In diesem Fall besteht eine 99%ige Wahrscheinlichkeit, dass der Array-Puffer einmal zugewiesen wird

 
Slava:

Was können Sie tun?

Das Ergebnis der Optimierung wird auf jeden Fall früher und schneller als sein Rahmen verlassen. Wenn der Agent abgewürgt wurde (Computer heruntergefahren, Dienst gestoppt), können Sie nichts dagegen tun.

Wir könnten Folgendes versuchen: Solange ein Frame nicht gesendet wurde, wird das Ergebnis nicht gesendet. Aber es ist nicht bekannt, wann wir sie korrigieren werden.

Vielleicht können Sie vor der Übertragung von Frames sagen, wie viele Frames erwartet werden, und wenn es weniger als erwartet sind und der Agent nicht verfügbar ist, dann geben Sie den Pass an einen anderen Agenten und überschreiben Sie die bereits empfangenen Frames?

Oder in den Körper eines jeden Rahmens schreiben die Gesamtzahl und seine Sequenznummer in dieser Zahl, und in der gleichen Weise, wenn alle nicht kommen, neu zu optimieren.
 
Slava:

Ja.

Als Gegenleistung für die Veröffentlichung des Codes zum Lesen der opt-Datei

Ich bin sogar noch mehr an der Aufnahme interessiert. Ich werde die Lektüre übernehmen, wenn das Format bekannt ist.

 
Aleksey Vyazmikin:

Können Sie feststellen, wie viele Frames erwartet werden, bevor Sie mit der Übertragung beginnen, und wenn weniger als die erwarteten Frames ankommen und der Agent nicht verfügbar ist, geben Sie den Pass an einen anderen Agenten und überschreiben Sie die bereits empfangenen Frames?

Oder in den Körper eines jeden Rahmens, um die Gesamtzahl und seine Sequenznummer in dieser Menge zu schreiben, und die gleiche Weise, wenn alle nicht kommen, neu zu optimieren.

Was ist, wenn nicht jeder Durchlauf ein Bild ergibt?

Ich habe oben ein Beispiel für das Abfangen von Fehlern im Prüfprogramm gegeben. Frames wurden nur dann gesendet, wenn ein Ergebniswert nicht mit der Benchmark übereinstimmte