我们从交付中提取智能交易系统并在测试器中运行,得到了这样的性能数据
------ 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 如此缓慢的原因何在?
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 倍。而且是在同一个本地代理上!
本地代理的单次运行速度是优化期间相同代理的 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 的速度。
到目前为止,寓意是这样的:我们应该在单个值上运行假想的优化,而不是单个测试?
是的,如果你希望速度快的话。与此同时,交易报告应由代理传送。
但我认为这是一个错误,应该加以修复。
在一个值上的 Sham 优化只能通过另一个地方实现--要正确运行优化器,至少需要两次传递。第二个(假想的)通道应该在 OnInit 中用INIT_PARAMETERS_INCORRECT 返回(或ExpertRemove()) 来捕获。
MT5 比 MT4 快 4.4 倍! 请注意,我们比较的不是语言的速度,而是同一 TS 的交易 API 的速度。
但有趣的是,哪个测试人员的效率更高。交付的 TS 不使用报价历史记录,因此特别适合进行这样的比较。
我们将在优化模式下对两个测试仪进行测量,以避免各种细微差别。
MT5(优化)
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%。
但仍想知道哪个测试人员的工作效率更高。交付的 TS 不使用历史报价,因此特别适合进行这样的比较。
我们从交付中获取智能交易系统,并在测试器中运行它,得到这样的性能数据
现在,让我们运行相同的智能交易系统,但使用 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
位置分布如下
- Pure MQL5 - 100% 性能。
- MT4Orders.mqh - ~95% 的性能。
- SB Trade\Trade.mqh - ~84% 的性能。
ZЫ 我想知道其他贸易库显示了多少...
ZЫ2 在 1648 中,每个数据包第一次通过时的那些刹车是什么?在 1643 年是这样的
fxsaber, 2017.08.15 17:16
在一批 Agent 作业的第一次传递中(例如,在单个测试器运行中),从 Expert Advisor 启动到第一个 NewTick 事件之间的时间可能需要几秒钟。在接下来的批处理中,这个时间为零。

TesterBenchmark:
作者: fxsaber