Risultati del test esperto multivaluta - pagina 4

 
tol64:
E potresti mostrare un esempio simile a quello che ho fatto all'inizio del ramo. Includere il trading su un solo simbolo, ma testarlo su un altro. Fate uno screenshot e testatelo sul simbolo su cui sta girando il test. Ci sarà una divergenza come quella mostrata all'inizio del ramo? Anche se se la formazione della barra è tracciata su tutti i simboli, dovrebbe essere identica. Ma devi comunque controllare tutto...

Beh, non lo testerò. Posso postare il codice e tu lo testi ;-):

string Instruments[] = ...
int SymbolCount = ArraySize(Instruments);

void RefreshRates(string symbol)
{
  MqlTick tick;
  SymbolInfoTick(symbol, tick);
  SymbolInfoDouble(symbol, SYMBOL_BID);
}

bool Synchronization()
{
  static bool Sync = true;

  string StrUnsync;
  int u = 0;

  datetime dt0 = (datetime)SeriesInfoInteger(_Symbol, Period(), SERIES_LASTBAR_DATE);
  
  for(int j = 0; j < SymbolCount; j++)
  {
    RefreshRates(Instruments[j]);
    datetime dt = (datetime)SeriesInfoInteger(Instruments[j], Period(), SERIES_LASTBAR_DATE);
    if(dt != dt0)
    {
      StrUnsync = StrUnsync + Instruments[j] + " ";
      u++;
    }
  }
  if(u > 0)
  {
    Print("Some symbols are unsynchonized:", StrUnsync);
    Sync = false;
    return(false);
  }
  else
  {
    if(!Sync)
    {
      Print("Synchronization done");
    }
    Sync = true;
  }
  return(true);
}

void OnTick()
{
  if(!Synchronization()) return;
  ...
}
 
marketeer:

Beh, non lo testerò. Posso postare il codice e tu lo testi ;-):

)) Grazie per la variante data. Ora controllerò solo il mio suggerimento, che è stato generato segnalando il possibile errore dei partecipanti al forum Yedelkin e Interesting, e poi sarò felice di testare la tua variante. Riporterò i risultati in dettaglio. ))
 

Yedelkin 

Notate la parte del codice:

Qui si può vedere che si "incardina" una specie di indicatore "Spy Control panel MCM" su due caratteri diversi. Cioè, avete diversi simboli come fonti di segnale. Ma tu affermi che "facciamo trading su EURUSD", cioè la fonte del segnale è uno stesso simbolo. Cerchiamo di essere chiari.

Facciamo trading solo su EURUSD.

Nei miei test, considero lo schema scritto da Konstantin Gruzdev -Implementation of the Multicurrency Mode in MetaTrader 5. ))) Tutto è definito. I file allegati contengono l'indicatore Spy Control panel MCM e l'Expert Advisor exSpy Control panel MCM. Installando l'Expert Advisor su un grafico, puoi vedere come funziona. Il registro mostra chiaramente gli eventi specificati ricevuti dall'Expert Advisor da diversi simboli. Tutto è chiaro, niente è mescolato.

Ora ho provato a specificare in OnChartEvent() il simbolo da cui viene ricevuto l'ID, ma questo non ha cambiato i risultati. Ho rimosso il secondo carattere da OnInit() per eliminare qualsiasi possibilità di ricevere gli eventi sbagliati. Il test è stato ora eseguito utilizzando questa variante:

enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO         = 0,          // События отключены
   CHARTEVENT_INIT       = 0,          // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1  = 0x00000001, // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2  = 0x00000002, // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3  = 0x00000004, // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4  = 0x00000008, // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5  = 0x00000010, // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6  = 0x00000020, // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10 = 0x00000040, // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12 = 0x00000080, // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15 = 0x00000100, // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20 = 0x00000200, // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30 = 0x00000400, // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1  = 0x00000800, // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2  = 0x00001000, // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3  = 0x00002000, // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4  = 0x00004000, // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6  = 0x00008000, // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8  = 0x00010000, // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12 = 0x00020000, // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1  = 0x00040000, // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1  = 0x00080000, // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1 = 0x00100000, // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK       = 0x00200000, // Событие "новый тик"
   
   CHARTEVENT_ALL        = 0xFFFFFFFF, // Все события включены
  };

...

int OnInit()
{
 if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}

 return(0);
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if(id >= CHARTEVENT_CUSTOM)
   {
    if(sparam == Symbol_01)
      {
       // Получение торговых сигналов
       TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
      
       // Совершение торговых операций
       TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
      }
   }
}

Un test sul simbolo EURUSD dal grafico EURUSD:

Test sullo strumento EURUSD dal grafico GBPUSD:

I risultati non sono coerenti.

Interessante

A giudicare da questo codice, i segnali provengono effettivamente da due simboli ma l'Expert Advisor può elaborare uno di questi segnali con un ritardo.

Il secondo simbolo non è più presente, i segnali provengono solo daEURUSD. Ma purtroppo questo non risolve il problema.

 
marketeer:

Beh, non lo testerò. Posso postare il codice e tu lo testi ;-):

Testato la tua versione. )) I risultati sono quasi identici. Può essere abbastanza buono per i test preliminari (rapidi). Useremo la funzione OnTimer() per ottenere risultati assolutamente identici.

Ecco i risultati dei test:

Test sullo strumento EURUSD dal grafico EURUSD:

Test sullo strumento EURUSD dal grafico GBPUSD:

 
MetaDriver:

Penso che 10 secondi siano un intervallo troppo breve. Se solo le barre formate sono di interesse, l'intervallo dovrebbe essere di almeno un minuto.

Non ha senso accorciarlo, un minuto è l' intervallo minimo ragionevole...

Ha fatto un'altra serie di test per mostrare l'inconsistenza dei risultati sopra i 10 secondi. Ci confronteremo con lo stesso "benchmark", che è stato fornito all'inizio dell'argomento. Cioè, dalla funzione OnTick() dalle barre giornaliere formate quando l'Expert Advisor è sul simbolo in esame. Ecco qui:

Allora tutti i risultati saranno dalla funzione OnTimer(). L'Expert Advisor è sul simbolo GBPUSD:

Test sul simbolo EURUSD dal grafico GBPUSD. L'intervallo del timer è di 10 secondi:

Questo è il risultato più accurato.

Test sul simbolo EURUSD dal grafico GBPUSD. L'intervallo del timer è di 1 minuto:

Questo non è vero. Il risultato è stato anche significativamente migliore, il che è anche scorretto e fuorviante.

Un test su EURUSD dal grafico GBPUSD. L'intervallo del timer era di 60 minuti:

Il risultato non coincide con il benchmark in molti punti.

Test su EURUSD dal grafico GBPUSD. L'intervallo del timer è di 1 giorno:

Il risultato è più che altro non identico.

-------------------------

In generale, per essere completamente sicuri dei risultati corretti, gli Expert Advisors multivaluta dovrebbero essere testati attraverso la funzione OnTimer(), impostando l'intervallo minimo.

 
tol64:

Ha fatto un'altra serie di test per mostrare l'inconsistenza dei risultati sopra i 10 secondi. Ci confronteremo con lo stesso "benchmark", che è stato fornito all'inizio dell'argomento. Cioè, dalla funzione OnTick() dalle barre giornaliere formate quando l'Expert Advisor è sul simbolo in esame. Ecco qui:

Allora tutti i risultati saranno dalla funzione OnTimer(). L'Expert Advisor è sul simbolo GBPUSD:

Test sul simbolo EURUSD dal grafico GBPUSD. L'intervallo del timer è di 10 secondi:

Questo è il risultato più accurato.

Test sul simbolo EURUSD dal grafico GBPUSD. L'intervallo del timer è di 1 minuto:

Non è corretto. Il risultato è anche significativamente migliore, il che è anche sbagliato e fuorviante.

Un test su EURUSD dal grafico GBPUSD. L'intervallo del timer è di 60 minuti:

Il risultato non coincide con il benchmark in molti punti.

Test su EURUSD dal grafico GBPUSD. L'intervallo del timer è di 1 giorno:

Il risultato è più che altro non identico.

-------------------------

In generale, per essere completamente sicuri dei risultati corretti, gli Expert Advisors multivaluta dovrebbero essere testati attraverso la funzione OnTimer() impostando l'intervallo minimo.

Non capisco bene. Avete fatto un paragone sbagliato.

Il primo test è corretto: confronto di due modi di testare - sul "tuo" strumento e su un altro. E poi hai preso questo primo risultato come punto di riferimento e hai confrontato tutti gli altri risultati con esso.

Questo non è corretto. Dovresti confrontare il resto delle corse dell'identità non con il primo risultato, ma con corse della stessa frequenza di ticchettio sul "tuo" strumento.

Saranno diversi dai "10 secondi", è naturale, l'importante è che siano identici a coppie.

Si prega di completare il test.

Altrimenti si scoprirà che hai solo perso tempo, riuscendo stranamente a confermare la tua illusione iniziale "sui vantaggi del test dei 10 secondi".

 
tol64:

Testato la tua opzione. )) I risultati sono quasi identici. È abbastanza buono per i test preliminari (rapidi). Per ottenere risultati completamente identici, useremo la funzione OnTimer().

Per quanto ho capito, non è il mio modo di sincronizzazione che stai testando ora, ma il generatore di tick di MetaTrader. Il punto è che quando si esegue il test, sono state generate diverse basi di tick - sotto il nome di eurusd e sotto il nome di gbpusd, e i risultati non sono quasi mai uguali. In realtà, se si eseguono due EA con il blocco di sincronizzazione specificato su simboli diversi, la differenza dovrebbe essere trascurabile o nulla.
 
MetaDriver:

Non ho capito bene. Qualcosa che hai paragonato in modo errato.

Il primo test è corretto: confrontare due modi di fare i test - sul "tuo" strumento e su un altro. E poi hai preso quel primo risultato come punto di riferimento e hai confrontato tutti gli altri risultati con esso.

Questo non è corretto. Dovresti confrontare il resto delle corse dell'identità non con il primo risultato, ma con corse della stessa frequenza di ticchettio sul "tuo" strumento.

Saranno diversi dai "10 secondi", è naturale, l'importante è che siano identici a coppie.

Si prega di completare il test.

Altrimenti si rivelerà una perdita di tempo, perché stranamente riesce a confermare la sua illusione iniziale dei "vantaggi del test di 10 secondi".

Bene. Ora ho già iniziato un altro lungo test. Sarà finita quando mi sveglierò. Ma posso già dirvi che sono identici in coppia, perché l'ho visto. Non mi resta che mostrarvelo. Ma potresti fare lo stesso test da solo. È un aspetto importante per testare i sistemi di trading. Forse sto facendo qualcosa di sbagliato)).

P.S. La cosa principale era che non devono essere identici in coppia, perché quando si prova attraverso la funzione OnTimer() sembrano essere identici in ogni caso. L'obiettivo era inizialmente quello di renderli identici al risultato ottenuto nel modo normale usando la funzione OnTick() con controllo esplicito delle barre. Gli Expert Advisors che fanno trading su un simbolo lo fanno perfettamente. Ma nella modalità multivaluta era necessario scoprirlo. Il risultato è ovvio.

 
marketeer:
Per quanto ho capito, non è il mio modo di sincronizzazione che hai testato, ma il generatore di tick di MetaTrader. Il punto è che quando hai eseguito i test hai generato diverse basi di tick - sotto il nome eurusd e sotto il nome gbpusd, e i risultati per loro non saranno quasi mai uguali. In realtà, se si eseguono due EA con il blocco di sincronizzazione specificato su simboli diversi, la differenza dovrebbe essere trascurabile o nulla.
Di quale realtà stai parlando? Test in tempo reale? Se è così, allora sono d'accordo, naturalmente. Se appendi due EAs ai loro simboli, tutto sarà corretto. Ma sto testando la modalità multi-valuta. E un risultato identico viene mostrato solo usando OnTimer() (10 secondi).
 
tol64:

Il trading è solo su EURUSD.

Cominciamo con le parole corrette. Nell'esempio iniziale vorresti avere "trade on EURUSD". Infatti, gli eventi personalizzati sono stati ricevuti da due simboli, e nel gestore di eventi TradeSignalCounter()+TradePerformer() sono stati chiamati quando gli eventi sono stati ricevuti da uno di questi due simboli. Possiamo supporre che la coda degli eventi fosse sempre piena.

Ora hai rimosso una delle fonti di segnale ma hai inserito il controllo"if(sparam == Symbol_01)" nel gestore di eventi per qualche motivo. Ma la prossima domanda è diversa. Secondo il codice, lo schema di Lizar è usato in modalità "All ticks" e ad ogni tick della fonte del segnale (EURUSD) vengono chiamate le funzioni TradeSignalCounter()+TradePerformer(). Interessante ha già accennato ad un possibile overflow della coda degli eventi. Ma voglio sapere quale strumento viene usato come parametro Symbol_01 di queste due funzioni, e se hai provato a cambiare la periodicità degli eventi nello schema di Lizar.