Risultati del test esperto multivaluta - pagina 5

 
tol64:
Di quale realtà stai parlando? Test in tempo reale? Se è così, allora sono d'accordo, naturalmente. Se appendi due EAs ai tuoi simboli, tutto sarà corretto. Ma sto testando la modalità multi-valuta. E un risultato identico viene mostrato solo usando OnTimer() (10 secondi).

Sto parlando di una corsa reale in modalità multicurrency (trading su N simboli in EAs (in ogni EA) impostati su ciascuno dei simboli) - che dà una stima reale, e nel caso del tester si stanno principalmente confrontando le modalità di test, non la correttezza di ciascuno dei metodi di elaborazione dei tick multicurrency. Che senso ha confrontare diverse modalità se sono tutte basate sull'ambiente artificiale del tester? L'identità dei risultati delle corse non dà una ragione per affermare che dà i risultati più corretti in termini di trading, è l'ottimale in termini di funzionamento interno del tester.

 
Yedelkin:

Cominciamo con le parole corrette. Nell'esempio originale avresti voluto "trading in eurodollari". Infatti, gli eventi personalizzati provenivano da due simboli e nel gestore di eventi TradeSignalCounter()+TradePerformer() venivano chiamati quando venivano ricevuti eventi 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. A giudicare dal codice, lo schema di Lizar è usato in modalità "All ticks" e le funzioni TradeSignalCounter()+TradePerformer() sono chiamate ad ogni tick dalla fonte del segnale (EURUSD). 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.

Sì, è quello che volevo fare. Dopo tutto, ogni azione che facciamo è innescata dal nostro desiderio. In questo caso, ho ottenuto esattamente quello che volevo. Cioè, abbiamo fatto trading solo su EURUSD, perché la funzione TradePerformer() controlla se è permesso fare trading per ogni simbolo nell'array di simboli. Questa opzione si trova in variabili esterne e a quel tempo il trading con il simboloGBPUSD era proibito. Gli eventi utente provenivano da due simboli, ma nel gestore dell'evento, di nuovo, la funzione TradePerformer() permetteva il trading solo sul simbolo EURUSD. La funzioneTradePerformer() contiene anche una funzione che determina se si è verificata una nuova barra su un particolare simbolo, in questo caso EURUSD. La tua supposizione che la coda degli eventi sia sempre piena è corretta, ma in questo caso tutto è stato processato separatamente e un ritardo di un tick non è significativo quando si testa su barre giornaliere.

La rimozione di una fonte di segnale, quella che non dovrebbe essere coinvolta nel test, ha solo confermato che tutto era stato fatto correttamente prima. Il controllo"if(sparam == Symbol_01)" è rimasto da quando ho controllato i risultati senza cancellare la sorgente di segnale sulla quale il test non dovrebbe avvenire, ma dalla quale dovrebbe avvenire. Questo controllo si è rivelato in realtà addirittura superfluo. I risultati non sono cambiati. Il simbolo EURUSD è usato come parametro Symbol_01. Ho provato a cambiare la frequenza degli eventi ma non è cambiato nulla. Più precisamente, posso dire che la modalità tutte le zecche è la più precisa.

 
marketeer:

Sto parlando di una corsa reale in modalità multicurrency (trading su N simboli in EAs (in ogni EA) impostati su ciascuno dei simboli) - che dà una stima reale, e nel caso del tester si stanno principalmente confrontando le modalità di test, non la correttezza di ciascuno dei metodi di elaborazione dei tick multicurrency. Che senso ha confrontare diverse modalità se sono tutte basate sull'ambiente artificiale del tester? I risultati identici delle corse non ci permettono di affermare che dà i risultati più corretti dal punto di vista del trading, è l'ottimale dal punto di vista dei meccanismi interni del tester.

Ora capisco. Ma la discussione era originariamente incentrata sui test nel tester. Prima di iniziare a fare trading, è necessario testare il sistema. Più il test è accurato, più vi sentirete sicuri nel trading reale. I risultati dei test qui presentati mostrano che i test possono essere fatti bene e male. Ora ognuno ha una scelta e può decidere da solo cosa è giusto o sbagliato. Un trader ha giustamente detto (se non mi sbaglio, è Van Tharp): "Noi commerciamo con le nostre percezioni". Posso aggiungere qualcosa. Non scambiamo solo le nostre idee. Viviamo anche secondo le nostre percezioni. ))

Se colleghiamo un Expert Advisor separatamente ad ogni simbolo nel trading reale o nei test, sarà il più accurato. Naturalmente, sono d'accordo con questo. Ma non c'è bisogno della sincronizzazione delle barre per questo. La precisione sarà accompagnata dalla durata. È possibile stimare lunghi periodi storici nel tester. E personalmente preferisco vedere i risultati corretti dei test.

Voglio anche sottolineare un altro punto: non escludo mai la possibilità di sbagliare da qualche parte e controllo sempre tutto. Ma anche dopo i test più duri, quando a prima vista tutto sembra corretto, non escludo ancora la possibilità che ci sia un errore da qualche parte. A questo punto, se qualcuno non è d'accordo con la valutazione dei risultati di quei metodi di prova che sono presentati, è necessario fornire i propri risultati di prova in confronto. Dopo tutto, lo scopo di questo thread è quello di scoprire come fare la cosa giusta o, per essere più precisi, come testare correttamente gli Expert Advisors multivaluta, non chi ha ragione o torto solo a parole. I fatti, solo i fatti e nient'altro che i fatti! )))

Che senso ha confrontare diverse modalità se sono tutte basate su un ambiente di tester artificiale?

Il punto è prendere una decisione corretta in base ai risultati. E certamente non vedo l'utilità di analizzare dati distorti. Dopo tutto, si raccoglie ciò che si semina).

 
tol64:

La rimozione di una fonte di segnale, quella che non dovrebbe essere coinvolta nel test, ha solo confermato che tutto era stato fatto bene prima.

"...tutto era stato fatto bene prima" appartiene alla categoria della compiacenza. Era sbagliato per cominciare. Non sembra dare importanza a un fenomeno come il "sovraffollamento delle code degli eventi". Soprattutto quando si tratta di trasmissione post-itica degli eventi. Date un'occhiata al materiale di riferimento e al forum sull'argomento. La parola chiave è "coda".

tol64:

... Ho fatto trading solo su EURUSD perché la funzione TradePerformer() controlla se è permesso fare trading per ogni simbolo nell'array dei simboli. Questa opzione si trova in variabili esterne, e a quel tempo il trading sul simboloGBPUSD era proibito. Gli eventi utente provenivano da due simboli, ma nel gestore dell'evento, di nuovo, la funzione TradePerformer() permetteva il trading solo sul simbolo EURUSD. La funzione TradePerformer() contiene anche una funzione che determina se si è verificata una nuova barra su un particolare simbolo, in questo caso EURUSD. La tua supposizione che la coda degli eventi sia sempre piena è corretta, ma in questo caso tutto è stato processato separatamente e un ritardo di un tick non è significativo quando si testa su barre giornaliere.

Poiché TradeSignalCounter()+TradePerformer() hanno processato eventi da una sola sorgente di segnale, lo stato della coda e il suo possibile overflow non sono cambiati affatto. In altre parole, il "divieto di elaborare eventi per simbolo GBRUSD" non ha affatto rimosso gli eventi appropriati dalla coda. Per la terza volta, segnalo il problema: "Un possibile overflow nella coda degli eventi era già stato accennato" :) Se pensate che si tratti solo di "un tick di ritardo", su cosa si basano tali conclusioni?

"...In questo caso tutto è stato gestito separatamente". Il problema è che nella versione originale, il gestore di eventi chiamava le funzioni quando gli eventi venivano ricevuti da entrambe le fonti di segnale, e poi quelle funzioni già filtravano il segnale dalla fonte "non necessaria". Ma le funzioni venivano chiamate ogni (!) volta.

tol64:

Un ritardo di un tick non è significativo se testato su barre giornaliere.

Non importa in quale periodo viene testato il gestore dell'evento. Se lo schema di Lizar genera segnali tick-by-tick, allora anche loro stanno segnando la coda degli eventi tick-by-tick, non una volta al giorno.

"Ho provato a cambiare la periodicità degli eventi, ma non ha fatto alcuna differenza. Più precisamente, posso dire che la modalità tutti i tick è la più accurata". Potresti per favore fornire degli screenshot comparativi sulle modalità non tick di Lizar?

 
tol64:

Se metti un EA su ogni simbolo separatamente nel trading reale o nei test, questa sarebbe l'opzione più accurata. Naturalmente, sono d'accordo con questo. Ma non c'è bisogno di sincronizzare le barre. La precisione sarà accompagnata dalla durata. È possibile stimare lunghi periodi storici nel tester. E personalmente preferisco vedere i risultati corretti dei test.

Com'è che non c'è bisogno di fare la sincronizzazione delle barre online! Tutti questi esperimenti nel tester sono necessari per valutare il trading online, e la questione di questo argomento non riguarda il tester (che emula il trading online), ma il trading online, e prima di tutto la sincronizzazione delle barre online è necessaria (per Expert Advisors appropriati).
Tol64:

Il punto è prendere una decisione corretta in base ai risultati. Ma non vedo assolutamente il senso di analizzare dati distorti. Dopo tutto, si raccoglie ciò che si semina).

Quello che sto cercando di sottolineare è che la categoria della "correttezza" è stata ora sostituita dall'identità delle corse dei tester, ma questo non significa che tali dati siano meno distorti. In particolare, avete scelto un intervallo di 10 secondi, che è senza dubbio più distorsivo di un intervallo di 5 secondi o di 1 secondo, per esempio. Cioè, state sfruttando qualche caratteristica nelle condizioni operative del tester che vi dà il metodo preferito con il timer da 10 secondi. Infatti, si sta cercando di "catturare" il momento dell'arrivo dei tick delle nuove barre su tutti gli strumenti con eventi timer, ed è abbastanza ovvio che il modo migliore per farlo è con l'evento OnTick.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

Non perdere tempo. Non avrai mai una corrispondenza perfetta con le zecche. Il tempo di chiusura di una barra è diverso per i diversi strumenti.

Per uno strumento il tempo corrente è il tempo di chiusura della barra, per un altro la barra non si è ancora formata, e per il terzo si è formata diversi tick fa.

Guarda la storia dei tick, il volume dei tick differisce molte volte da strumento a strumento.

Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
  • 2010.05.21
  • MetaQuotes Software Corp.
  • www.mql5.com
MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.
 

Yedelkin 2011.08.25 08:16 #

"...tutto è stato fatto bene prima" appartiene alla categoria dell'autocompiacimento.

---

Buongiorno! ))

Oltre a questa frase strappata separatamente, ho anche scritto: ".Non escludo mai di sbagliare da qualche parte e controllo sempre tutto. Ma anche dopo i controlli più duri, quando a prima vista tutto sembra giusto, non posso ancora escludere la possibilità che ci sia un errore da qualche parte". Devo aggiungere che non sono il tipo di persona che pensa di avere sempre ragione su tutto. )))

---

Yedelkin:
In origine era sbagliato. A quanto pare, non date importanza a un fenomeno come il "sovraffollamento delle code degli eventi". Soprattutto quando si tratta di trasmissione post-itica degli eventi. Date un'occhiata al materiale di riferimento e al forum sull'argomento. La parola chiave è "coda".

---

Ho dato un'occhiata all'argomento Timer. I punti chiave che ho evidenziato sono:

1. Mentre un evento viene elaborato, gli altri non possono essere elaborati.

2. Se lo stack degli eventi si riempie, i vecchi eventi vengono rimossi dalla coda senza essere processati.

Prendiamoli in ordine. C'è un'enumerazione di eventi:

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, // Все события включены
  };

Durante l'inizializzazione, specificate da quale simbolo accetteremo l'evento e quale evento accetteremo:

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

 return(0);
}

Cioè, accetteremo l'evento CHARTEVENT_TICK solo dal simbolo EURUSD. Non ci sono altri simboli.

Il test è iniziato. Quando si verifica un qualsiasi evento, il programma entra nella funzione OnChartEvent(), dichiara gli array di variabili per i segnali di trading e controlla l'evento. Se questo è un evento personalizzato, il programma determina il segnale in TradeSignalCounter(), poi controlla se si è verificata una nuova barra nella funzione TradePerformer() e poi decide su altre condizioni a seconda di questo. La funzione finisce il suo lavoro e lo inizia solo quando si verifica un evento sul grafico EURUSD. In altre parole, una zecca in questo caso.

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)
   {
    // Получение торговых сигналов
    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);
   }
}

Yedelkin:
Dal fatto che TradeSignalCounter()+TradePerformer() ha gestito eventi da una sola fonte di segnale, lo stato della coda di eventi e il suo possibile overflow non è cambiato in alcun modo. In altre parole, il "divieto di elaborare eventi per simbolo GBRUSD" non ha rimosso affatto gli eventi appropriati dalla coda. Per la terza volta, richiamo l'attenzione sul problema: "Si è già accennato a un possibile overflow nella coda degli eventi" :) Se credete che si tratti solo di "un tick di ritardo", su che cosa si basano queste conclusioni?

---

L'esecuzione delle funzioni elencate è molto veloce. Nessuna coda di eventi trabocca e nessun evento significativo viene perso. E se la coda addirittura trabocca e gli eventi vengono persi, cosa ci perdiamo? Una zecca, due zecche, tre? E allora? È insignificante sulle barre diurne.

---

Yedelkin:
Il problema è che nella versione originale, il gestore di eventi chiamava le funzioni quando gli eventi provenivano da entrambe le fonti di segnale, e poi quelle funzioni già filtravano il segnale dalla fonte "non necessaria". Ma le funzioni venivano chiamate ogni (!) volta.

---
Perché ti aggrappi a questa seconda fonte?) Non c'è più una seconda fonte. Ce n'è uno - EURUSD, ma l'Expert Advisor scambia dal grafico GBPUSD a EURUSD. E i risultati sono identicamente sbagliati. Una copia. Cioè, sono gli stessi come se fosse presente la seconda fonte. )))

-----------

Meglio fare il test da soli, mostrare i risultati del test e scrivere (brevemente) cosa avete fatto per ottenere i risultati corretti del test, se ovviamente ci riuscite. L'esperto più semplice andrà bene per questo test. Entrata da qualsiasi condizione, Stop Loss, Take Profit. Che siano le barre giornaliere degli ultimi 10 anni. E lo vedrete voi stessi. Alcuni periodi coincideranno e altri no. Apri il grafico dei risultati per vedere dov'è la mancata corrispondenza.

 
marketeer:
Com'è che non c'è bisogno di fare la sincronizzazione dei bar online!

Perché hai scritto prima di questo:

marketeer:

Sto parlando di una corsa reale in modalità multicurrency (trading su N simboli in EAs (in ogni EA) impostato su ciascuno dei simboli) - questo dà una stima reale...

Da questo capisco che per esecuzione reale intendi un test online, quando diversi EA sono in esecuzione e ognuno è in bilico direttamente sul proprio simbolo. Se è questo che intendevi, allora una domanda. Perché abbiamo bisogno della sincronizzazione delle barre in questo caso, se ogni Expert Advisor si trova sul proprio simbolo? Forse, la sincronizzazione delle barre in questo caso è necessaria se il sistema di trading è organizzato in modo tale che viene presa una decisione su diversi simboli contemporaneamente, quindi si devono formare delle barre su questi diversi simboli. Intendo fare trading in modo indipendente su diversi simboli pur essendo su un simbolo (su qualsiasi simbolo).

Marketeer:

Tutti questi esperimenti nel tester sono necessari per stimare il trading online, e la questione di questo argomento non riguarda il tester (che emula online), ma l'online, e soprattutto la sincronizzazione delle barre online è necessaria (per Expert Advisors appropriati).

Per me, gli esperimenti dei tester sono necessari per valutare i risultati del trading sulla storia. E la mia scelta del trading online dipende da questa valutazione. Pertanto, il problema di questo argomento è il problema del tester, non il problema online, che è il motivo per cui abbiamo bisogno della sincronizzazione delle barre anche nel tester (per gli Expert Advisors corrispondenti). Alcune immagini speculari))))

Marketeer:

Quello che sto cercando di sottolineare è che la categoria "correttezza" è stata ora sostituita dall'identità delle corse dei tester, ma questo non significa che tali dati siano meno distorti. In particolare, avete scelto un intervallo di 10 secondi, che è senza dubbio più distorsivo di un intervallo di 5 secondi o di 1 secondo, per esempio. Cioè, state sfruttando qualche caratteristica nelle condizioni operative del tester che vi dà il metodo preferito con il timer da 10 secondi.

Sì, più piccolo è l'intervallo, più accurato è il risultato. Ma, in realtà è necessario, almeno per me, per l'ultimo test. E per quello preliminare, sarei ancora d'accordo con Vladimir(MetaDriver) che l'intervallo di un minuto è sufficiente.

Marketeer:

In realtà, con gli eventi timer si cerca di "catturare" l'arrivo di tick di nuove barre su tutti i simboli, ed è ovvio che il modo migliore per farlo è l'evento OnTick.

E qui si vede che non hai letto attentamente il primo post del thread. Non con gli eventi del timer, ma con OnChartEvent(). O è un errore di stampa?

 
Non potrò continuare questa discussione per un po', quindi farò una ricerca più approfondita più tardi, con una lente d'ingrandimento, per così dire. Forse aiuterà a capire più velocemente, dove mi sbaglio o dove c'è un errore in un metodo o in un altro. Grazie a tutti per le vostre opinioni.
 
tol64:

Da questo capisco che per esecuzione reale intendi un test online, in cui diversi EA sono in esecuzione e ognuno si aggrappa direttamente al proprio simbolo. Se è questo che intende, allora una domanda. Perché abbiamo bisogno della sincronizzazione delle barre in questo caso, se ogni Expert Advisor si trova sul proprio simbolo? Forse, la sincronizzazione delle barre in questo caso è necessaria quando il sistema di trading è progettato in modo tale che una decisione viene presa in base a diversi simboli contemporaneamente, quindi le barre su questi diversi simboli dovrebbero essere formate.

È all'incirca così.


Tol64:

E qui si vede che non hai letto attentamente il primo post del thread. Non con gli eventi del timer, ma con OnChartEvent(). O è un errore di stampa?

Perché dovrebbe essere così? Avete OnTimer come terzo numero. Sei già stato citato su questo argomento: devi solo implementare un metodo che esegua correttamente il test. Ce l'avete. Questa è la funzione OnTimer () con un intervallo minimo. Quindi deve avere qualcos'altro in mente.


tol64:

Ce n'è uno - EURUSD, ma l'Expert Advisor fa trading su EURUSD dal grafico GBPUSD. E i risultati sono identicamente sbagliati.

Se è importante per te, raccomanderei comunque di chiedere agli sviluppatori quale sia l'analogo di fxt-file in 5. Ho già scritto che molto probabilmente vengono generate diverse basi di tick per diversi test.