Analisi dei risultati dei test e ottimizzazione nel tester di strategie MetaTrader 5 - pagina 2

 
Anatoli Kazharski:

Il parametro lungo (lparam) viene controllato. L'identificatore dell'evento tick è contenuto in esso.

L'identificatore dell'evento utente (int id) è uguale a zero.

Può essere scritto in questo modo per renderlo più chiaro:

Capisco che tutto dovrebbe essere riscritto per farlo funzionare correttamente. Ve lo mostrerò ora.

 
fxsaber:

Mi sono reso conto che tutto deve essere riscritto per farlo funzionare correttamente. Sto per farlo.

E non posso, perché questa merda sta succedendo.

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
e non riesco a far funzionare il tester.
 

Indicatore

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Consulente esperto

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, no lag, solo Core1-agent, tick reali 01.09.2017 - 28.01.2018.


Un simbolo

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Due simboli

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Tre simboli

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. In modalità simbolo singolo, la "spia" è 2,5 volte più lenta del puro OnTick. Cioè l'indicatore vuoto (costruito su PERIOD_W1 in modo che la storia delle barre sia minima) ha un enorme overhead nel Tester!
  2. Due simboli sono 3,5 volte più lenti di uno.
  3. Ma tre simboli sono solo 1,8 volte più lenti di due simboli. Cioè il passaggio da due a tre è dovuto alla scalabilità. rispetto al punto 2.
 

Anatoly, suggerisco di spostare l'argomento in Forex Experts, Trading Robots and Expert Advisors e fissarlo in cima.

In questo modo sarà sempre in vista. Ci sono già un sacco di argomenti postati qui

 
Rashid Umarov:

Anatoly, suggerisco di spostare l'argomento in Forex Experts, Trading Robots and Expert Advisors e fissarlo in cima.

In questo modo sarà sempre in vista. Ci sono già un sacco di argomenti postati qui

Non mi importa se l'argomento potrebbe essere utile.
 
fxsaber:

...

  1. In modalità simbolo singolo, Spy è 2,5 volte più lento del puro OnTick. Cioè l'indicatore vuoto (costruito su PERIOD_W1, in modo che la storia delle barre sia minima) ha un enorme overhead nel Tester!
  2. Due simboli sono 3,5 volte più lenti di uno.
  3. Ma tre simboli sono solo 1,8 volte più lenti di due simboli. Cioè, il passaggio da due a tre è dovuto alla scalabilità. a differenza del punto 2.

Il vostro risultato è 6, 25, 46. Perché non 6, 12 e 18?

Bisogna guardare la decelerazione relativa a un singolo carattere. Allora tre caratteri sono quasi 8 volte più lenti di uno, non 3 come previsto.

La domanda è esattamente questa. Perché c'è un tale risultato con la scalabilità? E se il risultato non può essere migliorato, è stata suggerita un'opzione per una nuova modalità di test. Questo risolverebbe il problema dei test lunghi quando si usano più caratteri.

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

Analisi dei test e ottimizzazione in MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.27 20:15

Domanda:

È possibile creare un tale schema di Expert Advisor multisimbolo in MQL, in modo che la durata dei test non aumenti ripetutamente quando si aggiungono simboli al test?

//---

Se questo non è possibile, allora una delle opzioni per gli sviluppatori del terminale è quella di aggiungere una modalità in più, quando è possibile eseguire il test simbolo per simbolo, piuttosto che tutti i simboli in una volta. Questo produrrebbe alla fine il tempo di prova previsto. Il punto è che gli EA multisimbolo sono molto spesso utilizzati semplicemente per quei casi in cui:

  1. Sono necessari più dati per i test.
  2. Per testare l'algoritmo di trading su una maggiore varietà di comportamenti di prezzo, condizioni (spread, livelli di stop/limite), ecc. con gli stessi parametri.

È per questi casi che abbiamo bisogno di una nuova modalità che ci permetterebbe di ridurre significativamente la durata dei test e ottimizzare i parametri. E già per il test finale per testare tutti i simboli simultaneamente.


 
Anatoli Kazharski:

Avete un risultato di 6, 25, 46. Perché non 6, 12 e 18?

La decelerazione deve essere guardata in relazione a un simbolo.

Due personaggi con le punte sono una modalità di tester molto diversa da quella di un singolo personaggio. Quindi è logico guardare la scalabilità relativa a due.

Inoltre, l'indicatore in testa è così selvaggio che lavorare attraverso le spie è una stampella. In attesa dei servizi, dove la scalabilità dovrebbe essere quasi perfetta, relativamente a un solo simbolo. Come nel caso del timer. Solo che lì non ci saranno salti di zecca.

 
Significativamente accelerato
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


Un simbolo

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Due cifre

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Tre simboli

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Quattro simboli

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

Due personaggi con spie sono un modo di operare molto diverso per un tester rispetto a un singolo personaggio. Quindi è logico guardare la scalabilità rispetto a due.

Inoltre, l'indicatore in testa è così selvaggio che lavorare attraverso le spie è una stampella. In attesa dei servizi, dove la scalabilità dovrebbe essere quasi perfetta, relativamente a un solo simbolo. Come nel caso del timer. Solo che lì non ci saranno salti di zecca.

fxsaber:
Significativamente accelerato

Un simbolo

Due simboli

Tre caratteri

Quattro caratteri

Se guardiamo i risultati relativi a due simboli, allora dividiamo il risultato di due simboli per due: 17 / 2 = 8,5

Poi, quando si aggiungono i simboli, si moltiplica questo valore per il numero di simboli per ottenere il tempo di prova previsto.

  • tre caratteri: 8,5 * 3 = 25, e il tempo effettivo è35,462 s.
  • quattro caratteri: 8,5 * 4 = 34, mentre il tempo effettivo è68,459 s.

Ma questo è in ogni caso il miglior risultato finora. Una variante interessante è usare il simbolo corrente in OnTick, mentre il resto in eventi personalizzati.

Potete usarlo mentre non ci sono servizi.

Questo è un forum per il trading, sistemi di trading automatico e test di strategia.

Sequenza di esecuzione di Init() e DeInit()

Slava, 2017.04.14 10:18

I servizi, tra le altre cose, avranno funzioni di trading e la capacità di gestire oggetti. E i grafici.

Il fornitore di dati di mercato è solo una possibilità.

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

Sequenza di esecuzione di Init() e DeInit()

Slava, 2017.04.14 10:21

I servizi avranno OnTick(string symbol). Ma i tick di un particolare simbolo dovranno essere sottoscritti

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

Sequenza di esecuzione di Init() e DeInit()

fxsaber, 2017.04.14 10:46

Si scopre che i servizi avranno quasi tutte le funzioni On: OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

E se non hai bisogno dei buffer degli indicatori e non vuoi avere a che fare con le stampelle degli indicatori/advisori, scrivi in un nuovo tipo di programma - Servizi - che non ha alcuna limitazione (allungando dalle versioni precedenti di MT).

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

Sequenza di esecuzione di Init() e DeInit()

Slava, 2017.04.14 10:56

Esattamente.

Non ci sarà nessun OnCalculate.

Non c'è ancora una soluzione con OnChartEvent.

 
Motivazione: