4倍速!?MT4のバックテストを並列実行して高速化

FX検証記事

MT4の並列化

MetaTrader4(以下、MT4)はマルチコア・マルチスレッドに対応しておらず、とても時間がかかるのにCPUは暇をしている‥という状態になっています。

この点、MetaTrader5(以下、MT5)では改善されているようです。

「ストラテジーテスター」の「エージェント」タブに並ぶ大量のコア達

MT4でMT5と同じような動作をさせようとすると、MT4そのものを複数起動しなければいけません。

手動で振り分ける(USDJPYは1つ目のMT4、EURUSDは2つ目のMT4‥)ことも可能ですが、振り分けられない、振り分けづらいケースもあります。

というわけで登場するのがMT4BackTesterです!

御存知の方もいらっしゃるかと思いますが、これは私が開発・販売しているソフトウェアです。

本製品は高速化を目的として開発したわけではなく、通貨ペアや時間軸などを変えながらバックテストを実行できるようにしたものですが、異なるMT4を「同時に4つまで」起動して並列実行することもできるようになっています。

本製品を開発した10年前の実測では「ディスクドライブそのものを分けなければ速度が出ない(ハードディスクを複数台用意する必要がある)」という結論に達し、説明書にもそのように記載していたのですが、日進月歩のコンピューター業界で10年前の実測値などは何の役にも立ちません。

そこで、改めて実測してみて同一ディスクドライブでも高速化できるかどうか検証してみようというのが今回の企画です。

HDD及びSSDの速度を計測

まずはHDDの速度を計測します。計測に使ったのはCrystalDiskMarkです。

Seqがシーケンシャルアクセス(順アクセス)の速度で、Read 182.4MB/s Write 135.3 MB/sとなっています。

つぎにNVMe M.2 SSDを計測しました。

シーケンシャルアクセスの速度でも10倍以上になっています。今回、シーケンシャルアクセスの速度しか見ていないのは、MT4のバックテストはシーケンシャルアクセスがほとんどだったからです。

開発当時のSSDはランダムアクセスこそ速いものの、シーケンシャルアクセスはHDDと大差なく、バックテストの高速化の役には立ちませんでした。

しかし、10年もの時を経て非常に速くなったこのSSDを使えば違う結果が期待できそうです‥!

同時起動数4でどこまで高速化できるか?

単純すぎるEAでは実際のバックテストと異なる結果になりそうでしたので、多少は複雑なZigzagBreakoutという私が昔開発したEAを使いました。

まずは同時起動数を1にしてバックテストしてみます。

通貨ペアにUSDJPY、EURUSD、GBPUSDを選択。時間は全部チェックしました。これで21パターンになります。

実行時間の計測は現バージョンにはありませんでしたので、さくっと付け加えています。(実行終了時に表示されるようにしました)

31分22秒でバックテストが終了しました。次に起動数を4にして実行してみます。

設定は終わっているので同時起動数を4に変更してバックテスト実行ボタンをクリックするだけです。

とんでもなく早く終わりました‥!あまりに早すぎるため、他のMT4(1番目に計測したMT4以外)が正しく動いていないのではないか?と思い、別のMT4をそれぞれ動かすといずれも30分前後で終了します。

30分を4で割ると7.5分‥7分と30秒ですから「ほぼ4分の1のバックテスト時間」で終了したことになります。

そもそも開発当時、同時起動数を4までにしたのは「ディスクそのものを分けないと速度が出ない」からで、「通常、5つ以上のディスクをPCに接続する人はいないだろう」という判断からでした。

12コア24スレッドなんていうバケモノみたいなCPUを、自分が使うなんてことも想像していませんでしたが(笑)

ここまできたら「自分の環境でどこまで高速化できるか試してみたい」というのが人情(?)です。

MT4BackTesterの同時起動数を増やしてどこまでやれるか、次回はそれにチャレンジしてみたいと思います。

‥記事やマニュアルも修正しないといけませんね‥。マニュアルにも「「ハードディスク(またはSSD)」を物理的に分けないと効果が出ません。」って記載しておりまして‥。

嘘を書いたつもりはありませんでしたが、10年前の情報をずっと記載しているのは適切ではありせんでした。

なお、今回、私が持っている最速のSSDとしてNVMe接続のM.2 SSDを使いましたが、普通(SATA接続)のSSDでもHDDより数倍の速度が出ていたのでおそらく物理的に分けなくても効果があると思います。

一応、私が使っているSSDの計測値も参考までに乗せておきます。

SeqのReadで3倍、Writeで4倍前後くらいでしょうか。おそらくですが同時起動でも効果が出るのではないかと思います。

実際にどのくらい高速化できるかは動作環境やEAによって大きく変化します。ご注意ください。

※HDDやSSDの計測に使ったのはCrystalDiskMark 6です。現在の最新は8ですので画像の見た目が最新バージョンとは異なります‥。

コメント

  1. おっきー より:

    こんにちは!とても有益な記事の作成ありがとうございます!
    ご質問なのですが、こちらのMT4バックテスターで同時起動数を4にした場合、マルチコアで処理するため早くなるという事でしょうか?2コア4スレッドのPCを購入予定なのですが、そのPCはマルチコアよりは適さない事になるのでしょうか?

    • emija より:

      ご連絡が遅くなりまして申し訳ございません。

      >マルチコアで処理するため早くなるという事でしょうか?
      そのとおりです。MT4はシングルコアで動作するため、コアが幾つあっても1つしか使われません。

      >2コア4スレッドのPCを購入予定なのですが、そのPCはマルチコアよりは適さない事になるのでしょうか?
      そうですね‥。2個程度であれば起動できるかもしれません。
      4個同時にバックテストすると、PCに非常に高い負荷がかかるため、かなり性能の高いPCでないとまともに動作しないと思います。

  2. ぺろこ より:

    m.2の事が書かれていたのでお伺いしたいのですが、

    1つのMT4に複数のインジケーターを入れると重くなり、画面が変わりにくくなったのですが、
    HDDをM.2に換えると少しは速さが解消されるものかご存知でしょうか?

    • emija より:

      おそらく変わらないと思います。
      バックテストで高速化が期待できるのは「(おそらく)ログ出力などでディスクアクセスが頻繁に発生するから」です。
      しかし、インジケーターの類は(おそらく)ディスクアクセスを必要としません。
      実行速度が足りないのであればCPUを速いものにするしか無いと思います。(メモリが足りなくなっているのであればメモリを増強すれば改善する可能性もあります)

タイトルとURLをコピーしました