Errori, bug, domande - pagina 2437

 
Alexey Navoykov:

Quindi OnTesterPass viene chiamato senza la presenza di fotogrammi? Bene, allora questo è un errore evidente. Questo evento significa ricevere un fotogramma, non la fine di un passaggio.

Tutti i frame dovrebbero arrivare a OnTesterPass prima che venga chiamato l'evento OnTesterDeinit. Questa è una logica normale e sana. A meno che, di nuovo, non si tratti di un'interruzione forzata del test.

OnTesterPass viene chiamato quando è arrivato almeno un frame. Può venire in un pacchetto di cornici. Pertanto, OnTesterPass dovrebbe accettare i frame in un ciclo, non un frame alla volta. Ma se "dopo l'ultima volta - mai", OnTesterPass non viene chiamato.

L'ottimizzazione si ferma quando è arrivato l'ultimo risultato. I fotogrammi possono arrivare più tardi, specialmente se una grande quantità di dati viene passata in un fotogramma, o se diversi fotogrammi vengono passati contemporaneamente in un unico passaggio. Pertanto, abbiamo bisogno di organizzare la ricezione dei fotogrammi rimanenti in OnTesterDeinit, che viene lanciato dopo che l'ottimizzazione è finita - anche nel ciclo.

Questa è una logica normale e sana.

Ho dato ripetutamente esempi di ricezione di frame esattamente in OnTesterDeinit, non solo in OnTesterPass. Ed è la ricezione di cornici complesse di diversi tipi

 
Slava:

se diversi fotogrammi vengono passati contemporaneamente in un solo passaggio.

L'ho provato una volta e non ha funzionato. Solo un FrameAdd ha funzionato.

 
Slava:

L'ottimizzazione si ferma quando l'ultimo risultato è arrivato. I fotogrammi possono arrivare più tardi, specialmente se una grande quantità di dati viene trasferita in un fotogramma o se diversi fotogrammi vengono trasferiti contemporaneamente in un unico passaggio. Pertanto, è necessario organizzare la ricezione dei fotogrammi rimanenti in OnTesterDeinit, che viene lanciato quando l'ottimizzazione è finita - anche nel ciclo.

Se i frame possono arrivare più tardi, non c'è garanzia che arriveranno anche in una sola volta in OnTesterDeinit? Cioè, bisogna fare un ciclo per aspettare quanto tempo?

Ho pensato prima che la situazione è la seguente: OnTesterPass è chiamato solo per quei fotogrammi che sono arrivati dalla fine del precedente OnTesterPass, ma se un nuovo fotogramma è arrivato mentre OnTesterPass era in corso, e in particolare - dall'ultima chiamata di FrameNext e prima del completamento della funzione, questo fotogramma si blocca, finché non arriva un nuovo fotogramma che genera l'evento. Questo è il motivo per cui OnTesterDeinit è richiesto per ricevere questi frame dormienti.

 
Alexey Navoykov:

Se i frame possono arrivare più tardi, allora non c'è garanzia che saranno immediatamente disponibili in OnTesterDeinit? Cioè bisogna fare un ciclo di attesa? E quanto tempo bisogna aspettare?

Ho pensato prima che la situazione è la seguente: OnTesterPass è chiamato solo per quei fotogrammi che sono arrivati dalla fine del precedente OnTesterPass, ma se un nuovo fotogramma è arrivato mentre OnTesterPass era in corso, e in particolare - dall'ultima chiamata di FrameNext e prima del completamento della funzione, questo fotogramma si blocca, finché non arriva un nuovo fotogramma che genera l'evento. Questo è il motivo per cui OnTesterDeinit è necessario per raccogliere questi frame dormienti.

FrameNext è una stupida lettura di file mqd e nient'altro.

FrameFirst è FileSeek.
 
fxsaber:

Ho provato una volta, ma non ha funzionato. Solo un FrameAdd ha funzionato.

Ho mostrato un esempio qui.
 

Grazie.


PS FrameFirst è ridondante qui

Forum sul trading, sistemi di trading automatico e test di strategia

Testare le strategie sulla tabella di marcia con l'autosostituzione del risultato a Expert Advisor

Slava, 2013.04.10 15:04

Ecco un esempio. In OnTester, l'Expert Advisor invia due frame - la storia delle operazioni e la storia su cui stava lavorando.

In OnTesterDeinit, riceve ed elabora tutti i frame del primo e del secondo tipo

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 è superfluo qui.

No. Non superfluo - puramente metodologico. Un blocco completo di codice senza alcun difetto

Questo codice è stato strappato da un codice più complesso. Sono stati trasmessi quattro diversi tipi di frame. Allo stesso tempo leggiamo anche OnTesterPass. Ecco il codice "raffinato".

 
Slava:

No. Non è ridondante - puramente metodologico. Un blocco completo di codice senza alcun difetto

Questo codice è stato strappato da un codice più complesso. Sono stati trasmessi quattro diversi tipi di frame. Allo stesso tempo leggiamo anche OnTesterPass. Qui presentiamo il codice "raffinato".

About FrameFirst è sempre superfluo se chiamato prima di FrameFilter.

Non consiglierei di trasferire i dati attraverso più di un frame.

 
fxsaber:

About FrameFirst è sempre ridondante se chiamato prima di FrameFilter.

Non consiglierei di passare i dati attraverso più di un frame.

1. Sì, può essere superfluo.

2. un tipo di frame viene letto in OnTesterPass e finito in OnTesterDeinit. Gli altri frame sono letti in OnTesterDeinit

Questa possibilità di inviare e ricevere diversi tipi di frame ci ha permesso di correggere diversi errori che erano difficili da riprodurre nel tester. E i fotogrammi venivano trasmessi solo se c'era una differenza con qualche valore di riferimento.

 
Slava:

Aprirà l'opt-format?