程序库: TesterBenchmark

 

TesterBenchmark:

评估 MetaTrader 4/5 策略测试器的效能。

作者: fxsaber

 

我们从交付中提取智能交易系统并在测试器中运行,得到了这样的性能数据

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

现在,让我们运行相同的智能交易系统,但使用 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

结果发现 Trade.mqh 比纯 MQL5 慢 1.5 倍!

我想这就是 原因所在,于是对 Trade.mqh 做了一点修改。

//+------------------------------------------------------------------+
//| 访问函数 PositionSelect(...) | PositionSelect(...)
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string & symbol)
  {
   return(PositionSelect(symbol));
  }

但是 SB 变体的刹车并没有消失。

SB 如此缓慢的原因何在?

 

关于交易、自动交易系统和测试交易策略的论坛

库:TesterBenchmark

fxsaber, 2017.07.24 14:13

我们从交付中提取 EA 并在测试器中运行,得到了这样的性能数据

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

这是优化模式。现在是 THIS 相同的 EA,但在单次运行模式下

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.

在本地代理上的单次运行速度是优化模式下相同代理的 2.3 倍!


也许是测试人员的刹车问题,让我们看看在优化和单次运行模式下,OnTick 分析会显示什么结果(执行问题和其他交易环境不会影响结果)。


优化

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


单次运行

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.


在单次运行模式下,OnTick 本身的净执行速度是优化模式下的 4.2 倍。而且是在同一个本地代理上!

 
fxsaber:

本地代理的单次运行速度是优化期间相同代理的 2.3 倍!

MT4 中的情况也是如此。在 4 中,刹车可能是由于单次运行时生成日志所致。

 
到目前为止,寓意是:我们不应该进行单一测试,而应该对单一数值进行假想优化?
 

我一直想知道纯 MQL4 和纯 MQL5 哪个交易 API 更快。

因此,让我们在 MT4/5 中对同一智能交易系统进行 OnTick 分析,以排除测试人员自身性能的影响。


MT5x64(优化)

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(单次运行)

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)


我们可以得出结论,在 MT4 中使用纯交易 API 编写的相同交易逻辑与在 MT5 中使用纯交易 API 编写的相同交易逻辑在速度上存在如下差异。

MT5 比 MT4 快 4.4 倍! 请注意,我们不是在比较语言的速度,而是在比较同一 TS 的交易 API 的速度。

 
Stanislav Korotky:
到目前为止,寓意是这样的:我们应该在单个值上运行假想的优化,而不是单个测试?

是的,如果你希望速度快的话。与此同时,交易报告应由代理传送。

但我认为这是一个错误,应该加以修复。


在一个值上的 Sham 优化只能通过另一个地方实现--要正确运行优化器,至少需要两次传递。第二个(假想的)通道应该在 OnInit 中用INIT_PARAMETERS_INCORRECT 返回(或ExpertRemove()) 来捕获

 
fxsaber:

MT5 比 MT4 快 4.4 倍! 请注意,我们比较的不是语言的速度,而是同一 TS 的交易 API 的速度。

但有趣的是,哪个测试人员的效率更高。交付的 TS 不使用报价历史记录,因此特别适合进行这样的比较。

我们将在优化模式下对两个测试仪进行测量,以避免各种细微差别。


MT5(优化)

关于交易、自动交易系统和测试交易策略的论坛。

库: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(单一)。

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


由于 Single 在 MT4 中也会变慢,我们进行了优化并查看了 OnTester 中的净时间

我们得出 MT4 测试仪的速度为 702884.9 * 1.486 / 0. 607 =1720736.3 ticks/秒


结论:MT4 测试仪比 MT5 测试仪快 ~12%

 
fxsaber:

但仍想知道哪个测试人员的工作效率更高。交付的 TS 不使用历史报价,因此特别适合进行这样的比较。

也就是说,比较的只是真空中的球形马 )没有报价的测试员有什么意义?
 
Alexey Navoykov:
也就是说,只是比较真空中的球形马)。没有引号的测试仪有什么意义?

测试器生成报价,但 TS 本身并不使用报价,这样就不会因为 High[] 和CopyHigh 实现的不同而堵塞结果。

测试仪创建交易环境,包括历史记录。我们要衡量的是测试人员,而不是用户对历史记录的请求(不要与历史记录的形成相混淆),它们在平台中的实现方式根本不同。

衡量交易 API 的性能也存在同样的问题。

 
fxsaber:

我们从交付中获取智能交易系统,并在测试器中运行它,得到这样的性能数据

现在,让我们运行相同的智能交易系统,但使用 Trade.mqh

结果发现 Trade.mqh 比纯 MQL5 慢 1.5 倍!

我想这就是 原因所在,于是对 Trade.mqh 做了一点修改。

但是 SB 变体的刹车并没有消失。

SB 如此缓慢的原因何在?

开发人员在 1648 中做了一些调整,并修复了一些错误,因此我设法估算了另一个贸易库的性能。

目前的情况如下。


纯 MQL5

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


#包含 <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


位置分布如下

  1. Pure MQL5 - 100% 性能。
  2. MT4Orders.mqh - ~95% 的性能。
  3. SB Trade\Trade.mqh - ~84% 的性能。
SB 开始减少滞后。


ZЫ 我想知道其他贸易库显示了多少...

ZЫ2 在 1648 中,每个数据包第一次通过时的那些刹车是什么?在 1643 年是这样的

关于交易、自动交易系统和测试交易策略的论坛。

mql5 语言的特点、微妙之处和工作技巧

fxsaber, 2017.08.15 17:16

在一批 Agent 作业的第一次传递中(例如,在单个测试器运行中),从 Expert Advisor 启动到第一个 NewTick 事件之间的时间可能需要几秒钟。在接下来的批处理中,这个时间为零。

这就好像测试程序会立即在 1648 时发生 NewTick 事件。这当然是错误的。