Análise dos resultados dos testes e otimização no testador de estratégia MetaTrader 5 - página 2

 
Anatoli Kazharski:

O parâmetro longo (lparam) é verificado. O identificador do evento do tick está contido nele.

O identificador do evento do usuário (int id) é igual a zero.

Pode ser escrito desta forma para torná-lo mais claro:

Entendo que tudo deve ser reescrito para que tudo funcione corretamente. Vou lhe mostrar agora.

 
fxsaber:

Percebi que tudo precisava ser reescrito para que funcionasse corretamente. Estou prestes a fazer isso.

E eu não posso, porque esta merda está acontecendo.

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 eu não consigo fazer o testador funcionar.
 

Indicador

#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);
}


Consultor especializado

#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, sem defasagem, apenas agente Core1, carrapatos reais 01.09.2017 - 28.01.2018.


Um símbolo

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


Dois símbolos

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


Três símbolos

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. No modo de símbolo único, o "espião" é 2,5 vezes mais lento que o puro OnTick. Isto é, o indicador de vazios (construído sobre PERÍODO_W1 para que o histórico de barras seja mínimo) tem uma enorme sobrecarga no Testador!
  2. Dois símbolos são 3,5 vezes mais lentos do que um.
  3. Mas três símbolos são apenas 1,8 vezes mais lentos do que dois símbolos. Isto é, a transição de dois para três se deve à escalabilidade, em oposição ao item 2.
 

Anatoly, sugiro mudar o tópico para Peritos Forex, Robôs de Negociação e Assessores Especialistas e consertá-lo no topo.

Desta forma, estará sempre em vista. Já existem muitos tópicos postados aqui

 
Rashid Umarov:

Anatoly, sugiro mudar o tópico para Peritos Forex, Robôs de Negociação e Assessores Especialistas e consertá-lo no topo.

Desta forma, estará sempre em vista. Já existem muitos tópicos postados aqui

Não me importo se o tópico pode ser útil.
 
fxsaber:

...

  1. No modo de símbolo único, o Spy é 2,5 vezes mais lento que o OnTick puro. Isto é, o indicador de vazio (construído sobre PERÍODO_W1, de modo que o histórico de barras é mínimo) tem uma enorme sobrecarga no Testador!
  2. Dois símbolos são 3,5 vezes mais lentos do que um.
  3. Mas três símbolos são apenas 1,8 vezes mais lentos do que dois símbolos. Ou seja, a transição de dois para três se deve à escalabilidade. ao contrário do ponto 2.

Seu resultado é 6, 25, 46. Por que não 6, 12 e 18?

Você tem que olhar para a desaceleração relativa a um único personagem. Então três caracteres são quase 8 vezes mais lentos do que um, não 3 como esperado.

A questão é exatamente esta. Por que existe tal resultado com a escalabilidade? E se o resultado não puder ser melhorado, foi sugerida uma opção para um novo modo de teste. Isto resolveria o problema dos testes longos quando se utilizam múltiplos caracteres.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Análise de Testes e Otimização no MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.27 20:15

Pergunta:

É possível criar um esquema Expert Advisor de múltiplos símbolos em MQL, para que a duração dos testes não aumente repetidamente ao adicionar símbolos ao teste?

//---

Se isto não for possível, então uma das opções para os desenvolvedores do terminal é adicionar mais um modo, quando o teste pode ser realizado símbolo por símbolo, em vez de todos os símbolos de uma só vez. Isto produziria o tempo de teste esperado no final. A questão é que os EAs com múltiplos símbolos são muito freqüentemente usados simplesmente para aqueles casos em que:

  1. Mais dados são necessários para os testes.
  2. Para testar o algoritmo de negociação em uma maior variedade de comportamento de preços, condições (spread, níveis de parada/limite), etc., com os mesmos parâmetros.

É para tais casos que precisamos de um novo modo que nos permita reduzir significativamente a duração dos testes e otimizar os parâmetros. E já para o teste final para testar todos os símbolos simultaneamente.


 
Anatoli Kazharski:

Você tem um resultado de 6, 25, 46. Por que não 6, 12 e 18?

A desaceleração tem que ser analisada em relação a um símbolo.

Dois caracteres com espigões é um modo de teste muito diferente de um único caractere. Portanto, é lógico olhar para a escalabilidade em relação a dois.

Além disso, a sobrecarga do indicador é tão selvagem que trabalhar através dos espiões é uma muleta. Esperando por serviços, onde a escalabilidade deve ser quase perfeita, em relação a apenas um símbolo. Como é o caso do temporizador. Somente não haverá carrapatos.

 
Significativamente acelerado
#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]);
}


Um símbolo

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


Dois dígitos

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


Três símbolos

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


Quatro símbolos

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:

Dois caracteres com espiões é um modo de operação muito diferente para um testador do que para um único caractere. Portanto, é lógico olhar para a escalabilidade em relação a dois.

Além disso, a sobrecarga do indicador é tão selvagem que trabalhar através dos espiões é uma muleta. Esperando por serviços, onde a escalabilidade deve ser quase perfeita, em relação a apenas um símbolo. Como é o caso do temporizador. Somente não haverá carrapatos.

fxsaber:
Significativamente acelerado

Um símbolo

Dois símbolos

Três caracteres

Quatro caracteres

Se olharmos para os resultados relativos a dois símbolos, então dividimos o resultado de dois símbolos por dois: 17 / 2 = 8,5

Então, ao adicionarmos símbolos, multiplicamos este valor pelo número de símbolos para obter o tempo de teste esperado.

  • três caracteres: 8,5 * 3 = 25, e o tempo real é de35.462 s.
  • quatro caracteres: 8,5 * 4 = 34, enquanto o tempo real é68.459 s.

Mas este é, de qualquer forma, o melhor resultado até agora. Uma variante interessante é usar o símbolo atual no OnTick, enquanto o resto em eventos personalizados.

Você pode usá-lo enquanto não houver serviços.

Este é um fórum para comércio, sistemas automatizados de comércio e testes estratégicos.

Seqüência de execução Init() e DeInit()

Slava, 2017.04.14 10:18

Os serviços, entre outras coisas, terão funções comerciais e a capacidade de gerenciar objetos. E gráficos.

O fornecedor de dados de mercado é apenas uma possibilidade.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Seqüência de execução Init() e DeInit()

Slava, 2017.04.14 10:21

Os serviços terão o OnTick(símbolo de corda). Mas carrapatos de um determinado símbolo terão de ser subscritos

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Seqüência de execução Init() e DeInit()

fxsaber, 2017.04.14 10:46

Acontece que os Serviços terão quase todas as funções: OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

Se você não precisa de buffers indicadores e não quer lidar com as muletas indicadores/conselheiros, escreva em um novo tipo de programa - Serviços - que não tenha nenhuma limitação (que se estenda desde as versões anteriores da MT).

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Seqüência de execução Init() e DeInit()

Slava, 2017.04.14 10:56

Exatamente.

Não haverá OnCalculate.

Ainda não há solução com o OnChartEvent.