ライブラリ: TesterBenchmark

 

TesterBenchmark:

MetaTrader 4/5ストラテジーテスターのネットパフォーマンスの測定

作者: fxsaber

 

配信された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がこんなに遅いのはどこに埋もれていた犬なのだろう?

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

ライブラリ: 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

これは最適化モードです。同じ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:

ローカルエージェントで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の速度を比較していることに注意してください。

 
Stanislav Korotky:
これまでのところ、教訓はこうだ:単一のテストの代わりに、単一の値に対して想像上の最適化を実行するべきか?

そうです。同時に、トレードレポートはエージェントから送信されるべきです。

しかし、これはバグであり、修正されるべきだと思います。


オプティマイザーを正しく実行するには、少なくとも2つのパスが必要です。2つ目の(架空の)パスはOnInitでINIT_PARAMETERS_INCORRECT return(または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


MT4でもSingleは遅くなるので、Optimisationを行い、OnTesterでネットタイムを見ます。

MT4テスターの速度は、702884.9 * 1.486 / 0.607 =1720736.3ティック/秒 であることがわかりました。


結論:MT4-testerはMT5-testerより~12%速い

 
fxsaber:

しかし、どのテスターがどのくらい生産的なのか、まだ疑問が残る。配信のTSは見積もり履歴を使用しないので、このような比較には特に適しています。

つまり、真空中の球形の馬が比較されるだけである。)見積もりのないテスターに何の意味があるのか?
 
Alexey Navoykov:
つまり、真空中の球状の馬を比較するのである。)引用符のないテスターに何の意味があるのか?

High[]とCopyHighの 実装の違いで結果が詰まらないように、テスターはクォートを生成しますが、TS自体はクォートを使用しません。

テスターは履歴を含む取引環境を作成します。そして、我々が測定しているのはテスターであり、プラットフォームで根本的に異なる方法で実装されているヒストリーのユーザーリクエスト(形成と混同しないように)ではない。

取引APIのパフォーマンスを測定する際にも同じ問題がある。

 
fxsaber:

配信された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


順位は以下のように分布した。

  1. Pure MQL5 - 100% のパフォーマンス。
  2. MT4Orders.mqh - ~95%のパフォーマンス。
  3. SB TradeTrade.mqh - ~84%のパフォーマンス。
SBはラグが少なくなってきた。


ZЫ 他のトレード・ライブラリはどのくらい表示されるんだろう・・・。

ZЫ2 1648の各パックの最初のパスのブレーキは何ですか?1643ではこんな感じ だった。

取引、自動取引システム、取引戦略のテストに関するフォーラム。

mql5言語の特徴、仕事の機微とテクニック

fxsaber, 2017.08.15 17:16

Agentジョブのバッチの最初のパス(例えば、単一のテスターの実行)では、Expert Advisorの開始から最初のNewTickイベントまでの時間が数秒かかることがあります。バッチの次のパスでは、この時間はゼロになります。

まるでテスターが 1648 ですぐに NewTick イベントを発生させたかのようです。これはもちろん間違いである。