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
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!
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.
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.
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()).
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.
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.
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 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.
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
- Pure MQL5 - 100% de desempenho.
- MT4Orders.mqh - ~95% de desempenho.
- SB Trade\Trade.mqh - ~84% de desempenho.
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.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
TesterBenchmark:
Autor: fxsaber