Librerías: TesterBenchmark

 

TesterBenchmark:

Medidor de la productividad pura de los simuladores de estrategias MetaTrader 4/5.

Autor: fxsaber

 

Tomamos el Asesor Experto de la entrega y lo ejecutamos en el probador, obteniendo estos datos de rendimiento

------
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

Ahora vamos a ejecutar el mismo Asesor Experto, pero utilizando 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

Resulta que Trade.mqh es 1,5 veces más lento que MQL5 puro.

Supuse que esta era la razón e hice una pequeña edición a Trade.mqh.

//+------------------------------------------------------------------+
//| Funciones de acceso PositionSelect(...) |
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string & symbol)
  {
   return(PositionSelect(symbol));
  }

Pero los frenos de la variante SB no han desaparecido.

¿Dónde está el perro enterrado que el SB es tan lento?

 

Foro sobre trading, sistemas automatizados de trading y comprobación de estrategias de trading

Bibliotecas: TesterBenchmark

fxsaber, 2017.07.24 14:13

Cogemos el EA de la entrega y lo ejecutamos en el tester, obteniendo dichos datos de rendimiento

------
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

Este era el modo de optimización. Y ahora ESTE mismo EA, pero en modo de ejecución ú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.

¡Una sola ejecución en el Agente local es 2,3 veces más lenta que en el mismo Agente pero en modo Optimización!


Tal vez sean los frenos del probador, así que veamos qué mostrará el perfilado OnTick (los problemas de ejecución y otros entornos de negociación no afectarán al resultado) en los modos Optimización y Ejecución única.


Optimización

------
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


Simple

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.


La ejecución neta de OnTick es hasta 4,2 veces más lenta en el modo de ejecución única que en el de optimización. ¡Y eso en el mismo Agente local!

 
fxsaber:

¡Una sola ejecución en el Agente local es 2,3 veces más lenta que en el mismo Agente pero durante la Optimización!

La misma situación en MT4. Probablemente, en 4 los frenos se deben a la generación de logs durante la Ejecución Única.

 
Hasta ahora, la moraleja es: en lugar de realizar pruebas individuales, deberíamos ejecutar una optimización imaginaria sobre un único valor...
 

Siempre me he preguntado qué API de trading es más rápida: MQL4 puro o MQL5 puro.

Por lo tanto, vamos a realizar perfiles OnTick del mismo Asesor Experto en MT4/5 para excluir la influencia del rendimiento de los propios probadores.


MT5x64 (Optimización)

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(Ejecución ú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 la misma lógica de negociación escrita en MT4 en su API de negociación pura y escrita en MT5 en su API de negociación pura difieren en velocidad de la siguiente manera.

¡MT5 es 4,4 veces más rápido que MT4! Tenga en cuenta que no estamos comparando las velocidades de los lenguajes, sino las velocidades de las API de negociación para el mismo TS.

 
Stanislav Korotky:
Hasta ahora, la moraleja es la siguiente: en lugar de realizar pruebas individuales, ¿deberíamos ejecutar una optimización imaginaria sobre un único valor?

Sí, si quieres que sea rápido. Al mismo tiempo, el informe comercial debería transmitirse desde el Agente.

Pero creo que esto es un bug y debería arreglarse.


La optimización falsa en un valor sólo se implementa a través de un lugar más - se necesitan al menos dos pasadas para ejecutar el Optimizador correctamente. El segundo pase (imaginario) debería ser capturado en OnInit con INIT_PARAMETERS_INCORRECT return (o ExpertRemove()).

 
fxsaber:

¡MT5 es 4,4 veces más rápida que MT4! Tenga en cuenta que no comparamos las velocidades de los idiomas, sino las velocidades de las API de negociación para el mismo TS.

Pero aún así es interesante cuánto y qué probador es más productivo. El TS de la entrega no utiliza el historial de cotizaciones, por lo que es especialmente bueno para tal comparación.

Mediremos ambos probadores en el modo de Optimización para evitar varios matices.


MT5 (Optimización)

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

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 Single se ralentiza también en MT4, hacemos Optimización y miramos el tiempo neto en OnTester

Obtenemos que la velocidad del probador MT4 es de 702884,9 * 1,486 / 0,607 = 1720736,3 ticks/segundo.


Conclusión: MT4-tester es ~12% más rápido que MT5-tester.

 
fxsaber:

Pero todavía me pregunto cuánto y qué probador es más productivo. El TS de la entrega no utiliza la historia de las cotizaciones, por lo que es especialmente bueno para tal comparación.

Es decir, sólo se está comparando un caballo esférico en el vacío ) ¿Qué sentido tiene un comprobador sin cotizaciones?
 
Alexey Navoykov:
Es decir, sólo se compara un caballo esférico en el vacío ). ¿Para qué sirve un comprobador sin comillas?

El probador genera cotizaciones, pero el TS en sí no las utiliza, para no atascar el resultado con la diferencia en la implementación de High[] y CopyHigh.

El probador crea el entorno de negociación, incluyendo el historial. Y es el probador lo que estábamos midiendo, no las peticiones de los usuarios (no confundir con la formación) del historial, que se implementan en las plataformas de formas fundamentalmente diferentes.

El mismo problema con la medición del rendimiento de las API de negociación.

 
fxsaber:

Tomamos el Asesor Experto de la entrega y lo ejecutamos en el probador, obteniendo estos datos de rendimiento

Ahora vamos a ejecutar el mismo Asesor Experto, pero utilizando Trade.mqh

Resulta que Trade.mqh es 1,5 veces más lento que MQL5 puro.

Supuse que esta era la razón e hice una pequeña edición a Trade.mqh.

Pero los frenos de la variante SB no han desaparecido.

¿Dónde está el perro enterrado que el SB es tan lento?

Los desarrolladores han retocado algo en 1648 y corregido algunos errores, así que me las arreglé para estimar el rendimiento de una biblioteca de comercio más.

La situación actual es la siguiente.


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


Las plazas se distribuyeron de la siguiente manera

  1. Pure MQL5 - 100% de rendimiento.
  2. MT4Orders.mqh - ~95% de rendimiento.
  3. SB Trade\Trade.mqh - ~84% de rendimiento.
SB comenzó a retrasarse menos.


ZЫ Me pregunto cuánto otras bibliotecas de comercio ...

ZЫ2 ¿Qué son esos frenos en 1648 en la primera pasada de cada paquete? En 1643 era así

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Características del lenguaje mql5, sutilezas y técnicas de trabajo.

fxsaber, 2017.08.15 17:16

En la primera pasada de un lote de trabajos de Agente (por ejemplo, en una sola ejecución de tester), el tiempo entre el inicio del Asesor Experto y el primer evento NewTick puede tardar varios segundos. En las siguientes pasadas del lote este tiempo es cero.

Es como si el probador hiciera inmediatamente un evento NewTick en 1648. Lo cual, por supuesto, es incorrecto.