Risultati del test esperto multivaluta

Anatoli Kazharski  

Dopo aver letto gli articoli sulla costruzione di EA multivaluta, facendo domande e ottenendo risposte dai "guardiani" della comunità, la domanda rimane per me: "Come comporre il codice EA in modo che i risultati dei test siano corretti?" Lo scopo del tema è proprio quello di scoprire questa domanda.

L'ho testato usando tre metodi diversi suggeriti dai membri della comunità.

-OnTick().

-OnChartEvent(). Questo metodo è suggerito da Konstantin Gruzdev nel suo articolo"Implementation of Multicurrency Mode in MetaTrader 5".

-OnTimer().

Ho preso in prestito lo schema dell'Expert Advisor multivaluta da Nikolay Kositsin, che ha descritto in dettaglio nel suo articolo"Creating an Expert Advisor that trades on different symbols".

Per il test ho scritto un semplice EA perché l'essenza sta nel confrontare i risultati del test. Il "riferimento" sarà il risultato del grafico giornaliero di EURUSD dal 2000. Poi questo risultato con gli stessi parametri sarà confrontato con il risultato che è stato ottenuto dal grafico GBPUSD. In linea di principio c'è solo uno strumento coinvolto nei test, ma i risultati dovrebbero essere identici indipendentemente da quale strumento viene testato.

OnTick()

int OnInit()
{
 return(0);
}

void OnDeinit()
{
}

void OnTick()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 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 su EURUSD dal grafico EURUSD:

Etichetta: 01_tick

Un test su EURUSD dal grafico GBPUSD:

Etichetta:02_tick

I risultati del test non sono coerenti.

OnChartEvent()

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);}
   
 if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

void OnDeinit()
{
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 if(id >= CHARTEVENT_CUSTOM)      
   {
    // Объявление массивов переменных для торговых сигналов
    static datetime New_Bar[1];  
    static bool UpSignal[1], DnSignal[1];
      
    // Получение торговых сигналов
    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);
   }
}

Test su EURUSD dal grafico EURUSD:

Etichetta:01_event == 01_tick

Il risultato è identico a quello segnato come 01_tick.

Test su EURUSD dal grafico GBPUSD:

Etichetta:02_event ~= 02_tick

I risultati dei test non sono coerenti.

OnTimer()

int OnInit()
{
 EventSetTimer(10);

 return(0);
}

void OnDeinit()
{
 EventKillTimer();
}

void OnTimer()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 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);
}

Il timer è impostato su 10 secondi.

Test sullo strumento EURUSD dal grafico EURUSD:

Etichetta: 01_time == 01_tick && 01_time == 01_ event

Un test su EURUSD dal grafico GBPUSD:

Etichetta: 02_time == 01_tick && 02_time == 01_ event

I risultati dei test sono identici. Solo in un punto ho visto una piccola imprecisione. Ho anche notato che più piccolo è l'intervallo nel timer, più preciso è il risultato. Cioè, anche se il test è condotto su barre giornaliere e l'intervallo nel tester è impostato su, per esempio, 1 ora, il test verrà eseguito significativamente più veloce di 10 secondi, ma i risultati del test non corrisponderanno.

------

Questo è tutto. Interessato all'opinione di tutti e ancora più interessante ai metodi di soluzione.)))


[Eliminato]  

A mio parere, non è corretto confrontare queste opzioni separatamente.

Personalmente aderisco all'opinione che il timer nel cartone animato deve essere, e ciò che vi si aggiungerà (tick o eventi) è una questione separata.

A mio parere, tutti i gestori disponibili dovrebbero essere utilizzati, la questione è solo nel loro riempimento e nell'implementazione dell'algoritmo generale.

Yedelkin  
tol64:

"Come si mette insieme il codice dell'esaminatore in modo che i risultati dei test siano corretti?".

Inizialmente, non ho capito l'affermazione della domanda. Cosa intende per risultati "corretti" dei test, e perché dovrebbero essere raggiunti?
Anatoli Kazharski  
Interesting:

A mio parere, non è corretto confrontare queste opzioni separatamente.

Personalmente, sono dell'opinione che il timer nel cartone animato deve essere presente, e ciò che vi si aggiungerà (tick o eventi) è una questione separata.

L'idea è che tutti i gestori disponibili dovrebbero essere usati nel mulo, è solo una questione del loro riempimento e dell'implementazione dell'algoritmo generale.


Perché non è corretto confrontare queste opzioni? Nei limiti di un semplice Expert Advisor, quando la decisione viene presa dopo la formazione della barra al simbolo necessario e al TF necessario, penso che sia corretto.

Non corretto, come è menzionato di seguito, sarebbe se aggiungiamo un algoritmo più complesso per analizzare la situazione attuale utilizzando gli stessi tick. Ma sono interessato solo alle barre formate.

Anatoli Kazharski  
Yedelkin:
Inizialmente non ho capito la formulazione della domanda. Cosa intende per risultati "corretti" dei test, e perché dovrebbero essere raggiunti?

Cioè, quelli che corrispondono alla realtà. Da qualsiasi carattere si faccia il test, i risultati dovrebbero essere identici. In questo caso, l'identico risultato è stato ottenuto solo utilizzando la funzione OnTimer().

Sono molto interessato al metodo di Konstantin Gruzdev. Forse sto facendo qualcosa di sbagliato, ecco perché non ho ottenuto i risultati corretti (affidabili). Spero anche nei suoi commenti su questo tema.

[Eliminato]  
tol64:

Perché non è corretto confrontare queste opzioni? Nell'ambito di questo semplice Expert Advisor, quando la decisione viene presa dopo la formazione della barra al simbolo giusto e al TF giusto, penso che sia corretta.

Non corretto, come è menzionato di seguito, sarebbe se aggiungiamo un algoritmo più complesso per analizzare la situazione attuale utilizzando gli stessi tick. Ma sono interessato solo alle barre formate.

Non discuto, è corretto in teoria, ma in pratica ci sono molte domande.

Per esempio, ecco il seguente - è implementato nel gestore di ticks, ma la connessione con il server è persa. Come funzionerà il sistema e come si rileverà se qualcosa va storto?

Realizzazione solo in timer - Opzione più o meno accettabile, ma ha bisogno di un compromesso ragionevole nella scelta del periodo (ma anche allora ci saranno alcune difficoltà).

Eventi - Anche gli eventi stessi non sono molto efficienti. In generale, l'elaborazione dei tick e degli eventi dovrebbe essere implementata in modo tale da utilizzare le risorse nel modo più efficace e permettere all'Expert Advisor di passare all'elaborazione di una nuova porzione di dati piuttosto rapidamente.

Yedelkin:
Non ho capito la domanda dall'inizio. Qual è il significato di risultati di test "corretti" e perché dovrebbero essere ottenuti?

Penso anche che non si dovrebbero ottenere risultati identici al 100%. Inoltre, è strano limitare le possibilità di moltiplicazione a un solo simbolo di trading.

Diciamo che almeno due simboli saranno scambiati (uno dei quali potrebbe essere un simbolo grafico).

[Eliminato]  
tol64:

Cioè, quelli che corrispondono alla realtà. Da qualsiasi simbolo si faccia il test, i risultati dovrebbero essere identici.

Credetemi, trovare il 100% di non-identità è un autoinganno e un'illusione. Solo un'illusione come un GRAAL eternamente funzionante. Bisogna sempre considerare un certo margine di errore/non identità.

E così com'è, testare un cartone animato non è molto rivelatore. La discussione sui mult dovrebbe essere solo in termini di trading su più simboli o di trading con più strategie su un simbolo.

Voglio dire che i risultati COSTANTEMENTE identici non sono importanti in un multisimbolo, ma i meccanismi che permettono all'esperto di prendere decisioni commerciali tenendo conto delle posizioni e della storia.

Per esempio, prova a scambiare due simboli EURUSD e GBPUSD, mentre il trading dovrebbe essere eseguito utilizzando l'hedging e i segnali sul secondo simbolo.

Anatoli Kazharski  
Interesting:

Credetemi, la ricerca della non-identità al 100% è un autoinganno e un'illusione. Un'illusione come il sempre operante GRAAL. Bisogna sempre considerare un certo margine di errore/non identità.

E così com'è, testare un cartone animato non è molto rivelatore. La discussione sui mult dovrebbe essere solo in termini di trading su più simboli o di trading con più strategie su un simbolo.

Voglio dire che i risultati COSTANTEMENTE identici non sono importanti in un multisimbolo, ma i meccanismi che permettono all'esperto di prendere decisioni commerciali tenendo conto delle posizioni e della storia.

Per esempio, prova a scambiare due simboli EURUSD e GBPUSD, mentre il trading dovrebbe essere eseguito utilizzando l'hedging e i segnali sul secondo simbolo.

Ora stai guardando il quadro generale, come dovrebbe funzionare l'EA. Saltiamo tutte le difficoltà e i dettagli tecnici dell'implementazione del programma per il trading reale. La questione è molto critica in questo articolo.

1. Un semplice sistema di trading. Si basa sulle barre formate.

2. Un test su un simbolo, ma da un altro simbolo.

Ho intenzionalmente semplificato la struttura al minimo. Lo si fa per facilitare l'analisi dei risultati dei test. Potete provare tutti i simboli ma i risultati non miglioreranno. Otterrete un pasticcio che sarà più difficile e più lungo da analizzare. L'Expert Advisor mostrerà l'azione esatta sul simbolo su cui si trova, ma farà un casino su tutti gli altri, che è esattamente ciò che mostrano questi risultati. I risultati dei test dovrebbero essere identici, altrimenti si scopre che l'Expert Advisor fa entrate corrette su un simbolo, mentre su altri no, o non segue esattamente il sistema. Questa discrepanza è abbastanza evidente.

Finora, l'identità può essere raggiunta solo attraverso la funzione OnTimer().

P.S. Non credo nei GRAAL. O meglio, lo capisco in modo diverso da molti altri).

Anatoli Kazharski  

Ecco il risultato in una sola volta su cinque caratteri tramite la funzione OnTimer():

Da qualsiasi simbolo venga eseguito il test, il risultato è sempre lo stesso.

Ma quando si usano altri metodi(OnTick() e OnChartEvent()), i risultati sarebbero diversi quando si cambia il simbolo dove si trova l'Expert Advisor. E conferma solo che l'Expert Advisor esegue azioni errate su altri simboli.

È chiaro perché succede con OnTick(). È già stato discusso molte volte. Ma il metodo OnChartEvent() è ancora discutibile.

[Eliminato]  

tol64:

Con OnTick(), è chiaro perché questo accade. Questo è già stato discusso molte volte. Ma il metodo OnChartEvent() è ancora discutibile.

Dobbiamo considerare un possibile ritardo nella gestione dell' evento, o anche una possibile PERDITA dell'evento.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
Yedelkin  
tol64:

Cioè, quelli che corrispondono alla realtà. Da qualsiasi carattere si faccia il test, i risultati dovrebbero essere identici. In questo caso, l'identico risultato è stato ottenuto solo quando è stato usato OnTimer().

Io la vedo più o meno così. In effetti, stai scegliendo un "motore" su cui costruire il tuo Expert Advisor multivaluta. Per questo, si prende una strategia di trading primitiva e prima la si esegue secondo lo schema "la fonte del segnale e il gestore del segnale su un simbolo", e poi secondo lo schema "la fonte del segnale e il gestore del segnale su diversi simboli". È corretto?

Se è così, non capisco bene frasi come "Test sullo strumento EURUSD dal grafico GBPUSD". Quale simbolo in questo caso è la sorgente del segnale e a quale è collegato il gestore del segnale?

Motivazione: