28 !!! coppie di valute, 1 esperto. Un altro graal, ma questo credo che nessuno l'abbia mai mostrato. + ACCOUNT DEMO - pagina 12

 
Rosh:
Ho testato "EURUSD sull'intervallo 2007.07.10 a 2007.07.14, e separatamente sull'intervallo 2007.07.09 a 2007.07.14" come hai chiesto, non c'è differenza.


Anche io ho dovuto aggiornare all'ultima build. :-) In effetti, i problemi con il tempo sono scomparsi, che bello. Tuttavia, come si scopre, la storia non finisce qui.

Ho eseguito l'EA sullo stesso periodo - nessuna differenza tra alto e basso su M1 e su H1/D1. Nota - ho eseguito il test sui miei dati normali, non danneggiati. Nessuna sincronizzazione, ecc. Quindi non può essere la ragione della discrepanza.

Poi ho deciso di provarlo su un altro intervallo per sicurezza (beh, brutto carattere il mio). E si scopre che non è ancora finita.

Prova l'intervallo dal 2007.08.06 al 2007.08.11, che è effettivamente l'ultima settimana. E il confronto non è con D1, ma con H1. Ci sono 4 operatori nel testo dell'Expert Advisor che dovrebbero essere commentati, e 4 operatori che non dovrebbero essere commentati. Non è che la possibilità di spiare il futuro sia stata dimostrata, no. Ma il difetto è presente.

E poiché è apparso che l'assenza di problemi su un intervallo settimanale non è una garanzia che non ci siano problemi, forse dovremmo eseguire il test su un intervallo molto più lungo, per esempio, un anno o sei mesi?

 
Ho rivisto il codice del vostro EA di Prospettiva Semplice. Sfortunatamente, non era impeccabile, quindi l'ho sistemato un po':

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
Il fatto di un nuovo giorno è fissato troppo tardi nel vostro codice, infatti, il secondo giorno, mentre il controllo della correttezza della simulazione inizia subito dopo l'inizio del test. Per escludere questa asimmetria, ho introdotto una variabile booleana start, con la quale ho fissato tutti i valori del test all'inizio del test.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Come potete vedere, funziona solo una volta e non influenza più l'EA. In seguito, tutto avviene secondo il vostro algoritmo. Se non fate l'inizializzazione primaria, allora controllate le stringhe

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
darà il valore curLo=0, mentre curHi non è uguale a zero. La spiegazione è semplice: entrambe le variabili curLo e curHi sono inizialmente uguali a zero, poiché non sono inizializzate. Al primo segno di spunta, la condizione

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
viene attivato e curHi differisce già da zero, perché il Bid corrente è maggiore di zero. Allo stesso tempo, la corrente Bid non può essere inferiore a zero (curLo non è stato inizializzato e quindi è zero), e quindi la condizione

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
non può cambiare curLo in alcun modo. Esegui tu stesso la mia versione dell'Expert Advisor e controlla che il file di errore Fu.xls contenga solo una riga: l'ora dell'ultima quotazione simulata nel tester.

Il codice completo è allegato al post, meglio scaricarlo perché non entra nel post.
 

Grazie, naturalmente, a Rosh per la sua revisione, ma non credo che fosse necessario.

Forse non l'avete notato, ma nel mio codice nella funzione init() c'è il seguente blocco:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Come risultato dell'esecuzione di questo blocco, nessuna delle condizioni non può essere soddisfatta all'inizio dell'esecuzione dell'EA.

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

Pertanto, non importa in quale punto della storia l'EA inizia, sarà sempre un nuovo minuto, una nuova ora o un nuovo giorno. E la prima coppia di operatori del blocco menzionato spiega il perché della tua affermazione: "Si spiega semplicemente: entrambe le variabili curLo e curHi sono inizialmente uguali a zero, perché non sono inizializzate. Dato che il Bid del primo tick è maggiore di zero, ma minore di 1000, entrambe le dichiarazioni condizionali corrispondenti sono necessariamente attivate e le variabili curLo e curHi ottengono gli stessi valori iniziali che gli assegnate nel blocco if (start) {...}.

La tua versione funziona altrettanto bene, ma non influenza l'algoritmo in alcun modo. Quindi questa alterazione non avrà alcun effetto sulla presenza o assenza di errori.

Nota di nuovo il mio post precedente. Il problema si verifica non al passaggio a un nuovo giorno e non all'inizio dell'EA ma quando si testa il t/f H1. Il problema si verifica solo una volta in questo intervallo, il 10.08.2007 e dura 3 minuti dalle 17:00 alle 17:03. Durante questo periodo vengono generati 28 tick con divergenza di valori alti per M1 e H1. Vi sto mostrando l'immagine appropriata.

Se non ti è difficile, esegui l'EA (il codice che hai corretto) su quell'intervallo che ti ho chiesto. Basta correggere l'uso dei commenti. Ora nel vostro codice si confronta con t/f D1 e non ci sono errori in questo modo. Ho bisogno di confrontarlo con H1.

 

Ho cambiato un po' il codice, per mantenere la correttezza in casi particolarmente patologici (ho solo una candela su M1 per il 2007.01.01, lo stesso per H1 e D1). Ho eseguito il test dal 2007.01.01 al 2007.08.11. Ho ottenuto 4 casi errati per D1 e 2 per H1. Tutti gli errori si verificano nel passaggio a una nuova candela su un TF superiore. Quelli che vogliono vedere da soli.

Non ci dà la possibilità di guardare al futuro. Almeno nella variante peeping che ho controllato.

File:
future-2h.mq4  4 kb
 
Yurixx:

Grazie, naturalmente, a Rosh per la sua revisione, ma non credo che fosse necessario.

Forse non l'avete notato, ma nel mio codice nella funzione init() c'è il seguente blocco:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Se non ti è difficile, esegui l'EA (il codice che hai corretto) sull'intervallo che ti ho chiesto. Basta correggere l'uso dei commenti. Ora nel vostro codice si confronta con t/f D1 e non ci sono errori in questo modo. Ho bisogno di confrontarlo con H1.


Faresti meglio a postare tu stesso il codice. se hai notato, quando provo il mio codice su H1 i valori non vengono inizializzati:
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Cioè, sarà esattamente come ho scritto. Se è difficile per te esporre il codice in modo che io non indovini di cosa si tratta, allora dovresti capirlo tu stesso, io ho altre cose da fare, oltre a praticare la telepatia.
 

Davvero, non capisco perché ti infastidisca.

Come ho scritto nell'ultima pagina quando ho postato l'EA con i risultati, è destinato ai test esclusivamente sulla M1. Allo stesso tempo confronta l'Alto e il Basso che genera da solo, con l'Alto e il Basso del t/f superiore, che potrebbe essere H1 o D1, a seconda, come sono disposti i commenti nel testo della procedura start().

Francamente, ho pensato che return(-1); nella procedura init() fermerà il lavoro dell'EA e quindi sarà possibile avviarlo solo su M1. Tuttavia, ora, grazie al tuo post, sono convinto che può essere eseguito su qualsiasi TF: L'idea alla base di questo EA è di provare a spiare il futuro da un t/f inferiore (in particolare M1) a un t/f superiore (in particolare H1 o D1). Pertanto dovrebbe essere eseguito solo su M1. Cosa potrebbero dimostrare i test su H1 non lo so nemmeno io.

Ho postato il codice EA appena prima del tuo post. Questo codice può essere usato direttamente per confrontare i dati M1 con i dati H1. Nel testo dell'EA ci sono chiare indicazioni dei cambiamenti (elementari) che devono essere fatti per confrontare i dati M1 con i dati D1. Quindi, anche qui, non sono sicuro di cosa tu sia infelice.

Un'ultima cosa. Il tuo codice è adatto a un tester come il mio. Si tratta solo di farlo.

Se hai altre cose da fare, non ti disturberò. Non mi stavo rivolgendo a te come richiesta personale, ma come rappresentante di MQ in relazione alla possibile scoperta di alcuni difetti nel tester.

 
Yurixx:

Davvero, non capisco perché ti infastidisca.

Come ho scritto nell'ultima pagina quando ho postato l'EA con i risultati, è destinato ai test esclusivamente sulla M1. Allo stesso tempo confronta l'Alto e il Basso che genera da solo, con l'Alto e il Basso del t/f superiore, che potrebbe essere H1 o D1, a seconda, come sono disposti i commenti nel testo della procedura start().

Francamente, ho pensato che return(-1); nella procedura init() fermerà il lavoro dell'EA e quindi sarà possibile avviarlo solo su M1. Tuttavia, ora, grazie al tuo post, sono convinto che può essere eseguito su qualsiasi TF: L'idea alla base di questo EA è di provare a spiare il futuro da un t/f inferiore (in particolare M1) a un t/f superiore (in particolare H1 o D1). Pertanto dovrebbe essere eseguito solo su M1. Cosa potrebbero dimostrare i test su H1 non lo so nemmeno io.

Ho postato il codice EA appena prima del tuo post. Questo codice può essere usato direttamente per confrontare i dati M1 con i dati H1. Nel testo dell'EA ci sono chiare indicazioni dei cambiamenti (elementari) che devono essere fatti per confrontare i dati M1 con i dati D1. Quindi, anche qui, non sono sicuro di cosa tu sia infelice.

Un'ultima cosa. Il tuo codice è adatto a un tester come il mio. Si tratta solo di farlo.

Se hai altre cose da fare, non ti disturberò. Non mi stavo rivolgendo a te come richiesta personale, ma come rappresentante di MQ in relazione alla possibile scoperta di alcuni difetti nel tester.

Non capisco quale timeframe dovrei usare per eseguire questo test. L'ho eseguito su tre timeframe senza intervenire nel codice.

2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: Lavoro finito
2007.08.14 16:29:03 2007.08.10 23:59 future-2h EURUSD,Daily: 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,Daily: 2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59:59 EURUSD,Daily: 2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59:59 EURUSD,Daily: 2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59:59 EURUSD,Daily: 2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59:59 EURUSD,Daily: 2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Daily: Il periodo di prova non è appropriato
2007.08.14 16:29:01 future-2h avviato per i test
2007.08.14 16:28:34 2007.08.10 22:59 future-2h EURUSD,H1: Lavoro finito
2007.08.14 16:28:32 2007.07.02 00:00 future-2h EURUSD,H1: Il periodo di prova non è appropriato
2007.08.14 16:28:32 future-2h avviato per i test
2007.08.14 16:28:22 2007.08.10 22:59 future-2h EURUSD,M1: Lavoro finito
2007.08.14 16:28:19 2007.07.02 00:00 future-2h EURUSD,M1: Periodo di test di 1 minuto
2007.08.14 16:28:19 future-2h avviato per i test
2007.08.14 16:24:28 2007.08.10 22:59 future-2h EURUSD,M1: Lavoro finito
2007.08.14 16:24:28 2007.08.06 00:00 future-2h EURUSD,M1: Periodo di test di 1 minuto
 
Ora cambia
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1

a

  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
e l'ho testato di nuovo per tre periodi dello stesso intervallo di tempo dal 2007.07.01 al 2007.08.11:
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 future-2h EURUSD,Daily: Work Finished
2007.08.14 16:32:03 2007.07.27 23:59 future-2h EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 future-2h EURUSD,Daily: The testing period is not appropriate
2007.08.14 16:32:01 future-2h started for testing
2007.08.14 16:31:56 2007.08.10 22:59 future-2h EURUSD,H1: Lavoro finito
2007.08.14 16:31:54 2007.07.02 00:00 future-2h EURUSD,H1: Il periodo di test non è conforme al compito
2007.08.14 16:31:54 future-2h iniziato per il test
2007.2007.08.14 16:31:48 2007.08.10 22:59 future-2h EURUSD,M1: Lavoro completato
2007.08.14 16:31:46 2007.07.02 00:00 future-2h EURUSD,M1: Periodo di test 1 minuto
2007.08.14 16:31:46 future-2h iniziato per il test
Cosa c'è scritto? Devo analizzare di nuovo il codice per la presenza/assenza di errori.
 

Capisco. Avete fatto tutto bene. E questo EA deve essere eseguito solo su M1. L'Expert Advisor viene eseguito su M1 e verificherà la coincidenza dei dati alti e bassi del periodo M1 con il periodo H1 o D1. Se ci fosse una sbirciata nel futuro, allora i dati t/f senior ti permetterebbero di sapere High e Low prima che questi High e Low siano raggiunti su M1. Questo è tutto.

Il risultato del tuo test D1 corrisponde al mio, su questo intervallo per D1 non ho anche ottenuto errori. Ma il test H1 non conferma quello che ho ottenuto e postato un po' prima. Non c'è bisogno di analizzare il codice. Come vedete conferma il normale funzionamento del tester.

Se pensate che sia sufficiente, potete fermarvi qui. Se volete essere sicuri che non sia per caso, non perché il periodo è troppo piccolo, allora eseguite gli stessi due test su un periodo più lungo. In un anno, per esempio, o dall'inizio del 2007.

PS

Per sicurezza, lo ripeterò. Test solo nel periodo M1. Solo in modalità tutte le zecche.

Grazie per la vostra partecipazione.

 
Grazie per gli EAs di prova, a volte è difficile crearne uno proprio, dato che ci sono così tante opzioni di prova e non sempre si sa cosa testare. E il fastidio... Ci si irrita più spesso con la propria gente, perché ci si aspetta che capiscano. Si diventa involontariamente più duri, e dove si perdonano gli altri, si diventa frustrati con i propri. Mi dispiace.

Questi test aiutano davvero a migliorare il tester di MetaTrader 4. Soprattutto con il codice sorgente.