Bibliotecas: TesterBenchmark

 

TesterBenchmark:

Medição liquida do desempenho dos testadores de estratégias do MetaTrader 4/5.

Autor: fxsaber

 

Pegamos o Expert Advisor da entrega e o executamos no testador, obtendo esses dados de desempenho

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Agora vamos executar o mesmo Expert Advisor, mas usando o Trade.mqh

------
OnTesterInit
i = 0 Pass = 0 OnTester = 3.330 s.: Count = 3387955, 1017403.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 3.475 s.: Count = 3387955, 974951.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 0 Results[iMin] = 3.330 s.
iMax = 1 Results[iMax] = 3.475 s.
Amount = 2 Mean = 3.402 s. - 89.73%
OnTesterDeinit
------
Interval = 7.584 s., Count = 0, 0.0 unit/sec

Acontece que o Trade.mqh é 1,5 vez mais lento do que o MQL5 puro!

Presumi que esse fosse o motivo e fiz uma pequena edição no Trade.mqh.

//+------------------------------------------------------------------+
//| Funções de acesso PositionSelect(...)
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string & symbol)
  {
   return(PositionSelect(symbol));
  }

Mas os freios da variante SB não desapareceram.

Onde está o cachorro enterrado que faz com que o SB seja tão lento?

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: TesterBenchmark

fxsaber, 2017.07.24 14:13

Pegamos o EA da entrega e o executamos no testador, obtendo esses dados de desempenho

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Esse era o modo de otimização. E agora ESTE mesmo EA, mas no modo de execução única

Core 1  2017.07.21 23:59:59   Interval = 5.140 s., Count = 3387955, 659135.2 unit/sec
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:05.164.

Uma única execução no agente local é 2,3 vezes mais lenta do que no mesmo agente, mas no modo de otimização!


Talvez seja o freio do testador, então vamos ver o que a análise de perfil do OnTick mostrará (problemas de execução e outros ambientes de negociação não afetarão o resultado) nos modos Otimização e Execução única.


Otimização

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.910 s.: OnTick Profiler: Count = 3387955, Interval = 0.969 s., 3496753.0 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.862 s.
iMax = 0 Results[iMax] = 2.910 s.
Amount = 2 Mean = 2.886 s. - 78.06%
OnTesterDeinit
------
Interval = 7.394 s., Count = 0, 0.0 unit/sec


Simples

Core 1  2017.07.21 23:59:59   Interval = 6.149 s. (Profiler: Count = 3387955, Interval = 4.018 s., 843148.2 unit/sec)
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:06.162.


A execução líquida do OnTick em si é até 4,2 vezes mais lenta no modo Single Run do que no modo Optimisation. E isso no mesmo agente local!

 
fxsaber:

Uma única execução no agente local é 2,3 vezes mais lenta do que no mesmo agente, mas durante a otimização!

A mesma situação no MT4. Provavelmente, no 4, os freios são devidos à geração de registros durante a execução única.

 
Até agora, a moral é: em vez de um único teste, devemos executar uma otimização imaginária em um único valor?
 

Sempre me perguntei qual API de negociação é mais rápida: MQL4 pura ou MQL5 pura.

Portanto, vamos realizar a análise de perfil OnTick do mesmo Expert Advisor no MT4/5 para excluir a influência do desempenho dos próprios testadores.


MT5x64 (Otimização)

i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641


MT4x86 (execução única)

2017.07.24 15:38:10.770 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.903 (total time 0:00:01.997)
2017.07.24 15:38:10.770 2017.07.08 22:10:23  TesterBenchmark_Example EURUSD,M1: Interval = 1.878 s. (Profiler: Count = 1044487, Interval = 1.284 s., 813504.6 unit/sec)


Podemos concluir que a mesma lógica de negociação escrita no MT4 em sua API de negociação pura e escrita no MT5 em sua API de negociação pura diferem em velocidade da seguinte forma.

O MT5 é 4,4 vezes mais rápido que o MT4! Observe que não estamos comparando as velocidades das linguagens, mas as velocidades das APIs de negociação para o mesmo TS.

 
Stanislav Korotky:
Até agora, a moral é a seguinte: em vez de um único teste, devemos executar uma otimização imaginária em um único valor?

Sim, se você quiser que ela seja rápida. Ao mesmo tempo, o relatório de negociação deve ser transmitido pelo Agente.

Mas acho que isso é um bug e deve ser corrigido.


A otimização fictícia em um valor só é implementada em mais um local - você precisa de pelo menos duas passagens para executar o Otimizador corretamente. A segunda passagem (imaginária) deve ser capturada no OnInit com o retorno INIT_PARAMETERS_INCORRECT (ou ExpertRemove()).

 
fxsaber:

O MT5 é 4,4 vezes mais rápido que o MT4! Observe que não comparamos as velocidades dos idiomas, mas as velocidades das APIs de negociação para o mesmo TS.

Mas, ainda assim, é interessante saber o quanto e qual testador é mais produtivo. O TS da entrega não usa o histórico de cotações, portanto, é especialmente bom para essa comparação.

Mediremos ambos os testadores no modo de otimização para evitar várias nuances.


MT5 (Otimização)

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: TesterBenchmark

fxsaber, 2017.07.24 14:13

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

MT4 (Single).

2017.07.24 15:58:50.775 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.513 (total time 0:00:01.607)
2017.07.24 15:58:50.775 2017.07.08 22:11:32  TesterBenchmark_Example EURUSD,M1: Interval = 1.486 s., Count = 1044487, 702884.9 unit/sec


Como o Single também fica mais lento no MT4, fazemos a otimização e analisamos o tempo líquido no OnTester

Obtemos que a velocidade do testador MT4 é de 702884,9 * 1,486 / 0,607 = 1720736,3 ticks/segundo.


Conclusão: o testador MT4 é ~12% mais rápido que o testador MT5.

 
fxsaber:

Mas ainda estou me perguntando quanto e qual testador é mais produtivo. O TS da entrega não usa o histórico de cotações, portanto, é especialmente bom para essa comparação.

Ou seja, apenas um cavalo esférico no vácuo está sendo comparado) Qual é a utilidade de um testador sem cotações?
 
Alexey Navoykov:
Ou seja, apenas um cavalo esférico em um vácuo é comparado). Qual é o objetivo de um testador sem aspas?

O testador gera aspas, mas o próprio TS não as usa, para não obstruir o resultado com a diferença na implementação de High[] e CopyHigh.

O testador cria o ambiente de negociação, incluindo o histórico. E é o testador que estávamos medindo, não as solicitações do usuário (não confundir com a formação) do histórico, que são implementadas nas plataformas de maneiras fundamentalmente diferentes.

O mesmo problema com a medição do desempenho das APIs de negociação.

 
fxsaber:

Pegamos o Expert Advisor da entrega e o executamos no testador, obtendo esses dados de desempenho

Agora vamos executar o mesmo Expert Advisor, mas usando o Trade.mqh

Acontece que o Trade.mqh é 1,5 vez mais lento do que o MQL5 puro!

Presumi que esse era o motivo e fiz uma pequena edição no Trade.mqh.

Mas os freios da variante SB não desapareceram.

Onde está o cachorro enterrado que faz com que o SB seja tão lento?

Os desenvolvedores ajustaram algo no 1648 e corrigiram alguns bugs, então consegui estimar o desempenho de mais uma biblioteca de comércio.

A situação atual é a seguinte.


MQL5 puro

------
OnTesterInit
i = 0 Pass = 0 OnTester = 13.451 s.: Count = 19469844, 1447464.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 10.904 s.: Count = 19469844, 1785569.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 10.895 s.: Count = 19469844, 1787044.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 10.898 s.: Count = 19469844, 1786552.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 10.889 s.: Count = 19469844, 1788028.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 10.889 s.
iMax = 0 Results[iMax] = 13.451 s.
Amount = 5 Mean = 11.407 s. - 89.58%
OnTesterDeinit
------
Interval = 63.675 s., Count = 0, 0.0 unit/sec


#include <Trade\Trade.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.390 s.: Count = 19469844, 1353012.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 13.044 s.: Count = 19469844, 1492628.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 13.016 s.: Count = 19469844, 1495839.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 13.014 s.: Count = 19469844, 1496069.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 13.039 s.: Count = 19469844, 1493200.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 3 Results[iMin] = 13.014 s.
iMax = 0 Results[iMax] = 14.390 s.
Amount = 5 Mean = 13.301 s. - 94.05%
OnTesterDeinit
------
Interval = 70.713 s., Count = 0, 0.0 unit/sec


#include <MT4Orders.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.385 s.: Count = 19469844, 1353482.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 11.434 s.: Count = 19469844, 1702802.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 11.459 s.: Count = 19469844, 1699087.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 11.440 s.: Count = 19469844, 1701909.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 11.426 s.: Count = 19469844, 1703994.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 11.426 s.
iMax = 0 Results[iMax] = 14.385 s.
Amount = 5 Mean = 12.029 s. - 91.20%
OnTesterDeinit
------
Interval = 65.946 s., Count = 0, 0.0 unit/sec


Os lugares foram distribuídos da seguinte forma

  1. Pure MQL5 - 100% de desempenho.
  2. MT4Orders.mqh - ~95% de desempenho.
  3. SB Trade\Trade.mqh - ~84% de desempenho.
O SB começou a se atrasar menos.


ZЫ Eu me pergunto o quanto as outras bibliotecas de comércio mostram ...

ZЫ2 O que são esses freios em 1648 na primeira passagem de cada pacote? Em 1643 era assim

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Recursos da linguagem mql5, sutilezas e técnicas de trabalho

fxsaber, 2017.08.15 17:16

Na primeira passagem de um lote de trabalhos de agente (por exemplo, em uma única execução de testador), o tempo entre o início do Expert Advisor e o primeiro evento NewTick pode levar vários segundos. Nas próximas passagens do lote, esse tempo é zero.

É como se o testador fizesse imediatamente um evento NewTick em 1648. O que, é claro, está errado.