配信されたExpert Advisorをテスターで実行すると、このようなパフォーマンスデータが得られます。
------ 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
同じExpert Advisorを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(...) |... //+------------------------------------------------------------------+ 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
これは最適化モードです。同じ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倍も遅くなります。また、これは同じローカル・エージェントでの結果です!
ローカルエージェントで1回実行すると、同じエージェントで最適化中に実行した場合よりも2.3倍遅くなる!
MT4でも同じ状況です。おそらく4では、シングルラン中のログ生成のためにブレーキがかかっているのでしょう。
純粋なMQL4と純粋なMQL5、どちらの取引APIが速いのだろうかといつも考えていました。
そこで、同じExpert AdvisorのOnTickプロファイリングをMT4/5で行い、テスター自身のパフォーマンスの影響を除外してみよう。
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)
純粋なトレーディングAPI上のMT4で記述された同じトレーディングロジックと、純粋なトレーディングAPI上のMT5で記述された同じトレーディングロジックでは、以下のように速度が異なると結論づけることができます。
MT5はMT4より4.4倍高速です! 言語の速度ではなく、同じTSの取引APIの速度を比較していることに注意してください。
これまでのところ、教訓はこうだ:単一のテストの代わりに、単一の値に対して想像上の最適化を実行するべきか?
そうです。同時に、トレードレポートはエージェントから送信されるべきです。
しかし、これはバグであり、修正されるべきだと思います。
オプティマイザーを正しく実行するには、少なくとも2つのパスが必要です。2つ目の(架空の)パスはOnInitでINIT_PARAMETERS_INCORRECT return(または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
MT4でもSingleは遅くなるので、Optimisationを行い、OnTesterでネットタイムを見ます。
MT4テスターの速度は、702884.9 * 1.486 / 0.607 =1720736.3ティック/秒 であることがわかりました。
結論:MT4-testerはMT5-testerより~12%速い。
しかし、どのテスターがどのくらい生産的なのか、まだ疑問が残る。配信のTSは見積もり履歴を使用しないので、このような比較には特に適しています。
配信されたExpert Advisorをテスターで実行すると、このようなパフォーマンスデータが得られます。
同じExpert AdvisorをTrade.mqhを使って実行してみましょう。
Trade.mqhは純粋なMQL5よりも1.5倍遅いことがわかりました!
これが 原因だと思い、Trade.mqhを少し編集した。
しかし、SBバリアントのブレーキは消えていない。
SBがこれほど遅いのはどこに埋もれているのでしょうか?
開発者は1648で何かをいじり、いくつかのバグを修正したので、私はもう1つのトレード・ライブラリのパフォーマンスを何とか見積もることができた。
現在の状況は以下の通りである。
純粋な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
#include <TradeTrade.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 TradeTrade.mqh - ~84%のパフォーマンス。
ZЫ 他のトレード・ライブラリはどのくらい表示されるんだろう・・・。
ZЫ2 1648の各パックの最初のパスのブレーキは何ですか?1643ではこんな感じ だった。
取引、自動取引システム、取引戦略のテストに関するフォーラム。
fxsaber, 2017.08.15 17:16
Agentジョブのバッチの最初のパス(例えば、単一のテスターの実行)では、Expert Advisorの開始から最初のNewTickイベントまでの時間が数秒かかることがあります。バッチの次のパスでは、この時間はゼロになります。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索

TesterBenchmark:
作者: fxsaber