MQL5 クラウドネットワークが使えないケースとその対策

バックテストでパラメータの最適化を行う際、

・与えるパラメータの種類が多い
・パラメータ内で変動させたい範囲が広い

と、その組み合わせの総数は指数関数的に増えていきます。

たとえば。

今、試作中EAの場合、最適化したいパラメータ個数が11個、各パラメータ内の要素数が4~6個くらいだったとすると、
そのパラメータの組み合わせの数は軽く1億件を超えてしまいます・・・(これでも結構要素数を絞っている方ですが)

5^11 = 約  49,000,000件
6^11 = 約363,000,000件

なので、説明変数の個数だけでなく、説明変数内の要素数も大きく影響します。

よくデータサイエンスで言われる「次元の呪い」というやつですね。
説明変数が増えるほど、最適化に膨大な時間が必要になってしまうか、そもそもやりきれない問題が発生します。

これを解決するために、

MT4

・遺伝的アルゴリズムが利用可能となっており、パラメータ全パターンを実行しない状態でも、より優秀なパラメータを早く探すことができる

MT5

・バックテスト処理速度自体が改善
・マルチスレッド実行に対応。 PCのCPUプロセス数分、並列実行できる
・MQL5 クラウドネットワークを使用し、他人のPCリソースを借りられる仕組みが出来上がった
(+α、遺伝的アルゴリズムの方向づけを行う対象指標が選択できるようになり、より自分の意図した最適化結果を得られるようになった)

等、様々な対策がなされ、MT5の方が、より多く改善の恩恵が受けられます。

この内、MQL5 クラウドネットワークについては以前の記事にも記載した通り非常に大きな恩恵を受けられるのですが、
いくつかのケースではこれが使えないことが分かりましたので、それらをご紹介したいと思います。

※これが全てではないと思いますので、確認できたものは随時追加していきます。 (どこかにドキュメントがあるかも?)

スポンサーリンク

EA内部でDLL参照が含まれている場合

DLLとは

DLL とは、複数のプログラムで同時に使用できるコードとデータを含むライブラリです。 たとえば、Windows オペレーティングシステムでは、Comdlg32 DLL が共通のダイアログボックス関連機能を実行します。 したがって、このDLLに含まれる機能を使用して、[開く] ダイアログボックスを実装することができます。 これにより、コードの再利用性と使いやすさが向上します。

MT5で使用されるプログラム言語 MQL5では実装しづらいような処理を、c++で記載しDLL化して、EAから参照させる場合がありますが、
このDLL参照を含んでいるEAは MQL5クラウドネットワークを使用した最適化を行うことが出来ないようです。

理由は単純で、悪意のあるユーザーがDLL内に不正なプログラムを仕込むケースがあり、セキュリティリスクを排除しきれないからです。
(頑張れば MT5内から ShellExecuteで外部プログラムをコールできるようですが。。 これがMQL5クラウドネットワーク利用可否に影響するかまでは調べていません)

※尚、当方のEAもDLLを使用していますが、Webサーバーに口座番号の認証を行う処理のみを行っています。
これは自作EAを不正に盗用されないための対策です。 詳しくはこちら

カスタム銘柄を使用している場合

カスタム銘柄とは、自分自身で通貨ペアを定義できる仕組みです。
以前、カスタム銘柄の作成方法を紹介 したことがありますが、これを使用した場合も、MQL5クラウドネットワークは利用できませんでした。

”スタート”ボタンをクリックすると最適化のプロセスが開始します。ターミナルはテスティングエージェントのためのタスクを、以下のように準備します:

EX5の拡張子がついた、コンパイル済みExpert Advisorファイル
#property tester_indicator や#property tester_library などのディレクティブを使用し有効化されたインディケーターやEX5ライブラリ(DLLはクラウドでは許可されていません。)
#property tester_fileのディレクティブを使用し有効化されたテストに必要なデータファイル
テスト/最適化情報(金融商品名、テスト期間、シミュレーションmodなど。)
トレード環境(通貨ペアプロパティ、トレード環境など。)
必要なパス(すなわちタスク)の全体集合を決めるExpert Advisorのパラメータの設定。
MetaTrader 5のターミナルはMQL5クラウドネットワークのノードと通信し、それぞれの特定のパスを実行するタスクパッケージを割り当てます。タスクやパスパッケージを受け取り、接続されたエージェントに割り当てることから、それぞれのノードはプロキシサーバーということができます。[fuzzy]このケースでは、Expert Advisorsやインディケータ、ライブラリのファイルやデータファイルはハードディスクではなくMQL5クラウドネットワークのサーバーに保存されています。

また、EX5ファイルは機密性の理由によりクラウドエージェントのハードディスクに保存されていません。データファイルはディスクに保存されますが、最適化の終了後削除されます。

これがあなたのクライアントターミナルとMQL5クラウドネットワークの間で起こることのすべてです。実際には、タスクパッケージをネットワークに送信し結果を待っています。

https://www.mql5.com/ja/articles/341

通貨ペアプロパティの受渡ししか行わないので、カスタム銘柄の仕様自体が受け渡せないんでしょうか、、?

スポンサーリンク

MQL5クラウドネットワークが使えない場合の対策

ローカルネットワーク内のPC(CPU個数)を増やす

物理で勝負・・・ですね。 MT5は複数のローカルネットワークPCに対して自動的に処理を振り分ける機能を持っていますので、
スペック低めのPCを複数台用意するような方法(スケールアウト)でもテスト効率を上げることが出来ます。

しかし、PCの環境維持(室温、停電、H/W故障、マルウェア対策、等々)の手間を考えるとあまり台数は増やしたくないので
1台でバカみたいにCPU積んでいるPCが欲しくなります。 買おうか悩み中。

尚、ストラテジーテスタが消費する1プロセス当たりのメモリですが、テスト内容によりけり ですが、10年バックテストしている時は大体 1.3GB/1CPUくらい。
MQL5 クラウドネットワークに自PCのリソースを貸してる時は、 2~3GB/1CPU 程度消費している時もありましたので、
仮に メモリ 2GB/1CPU とすると、64スレッドで128GB・・・ このくらい積むと、PC 1台で700,000円位になりそうですが、
フルで使い始めたらクラウドネットワークでリソース借りるよりも安くなりそうな価格帯。

テスト最適化を実行し続けられるような自動化を組み上げる

バックテストはコマンドラインから実行できます。

実行時の引数で、通常のバックテスト/最適化実行の切り替えや、通貨ペア、期間の切り替えも渡すconfigファイルで制御できるので、
最適化実行→最適化結果解析、優位性の高いパラメータセット抽出→単体バックテスト実行→結果収集 ということを自動で行うことも出来ますし、
最適化実行のパラメータパターン自体を複数用意しておいて、実行を待ち行列化しておく等しておくことで、
PCがアイドルになる時間(人間が最適化実行を行い、次の実行をするまでの待ち時間)をなくしていく事ができます。

テスト自体はとても捗りますが、バックテスト結果が大量に溜まり過ぎて結果の照会や優秀なパラメータの検索が大変になる という別の問題も発生したりします・・・
※mt4時代、実際にこれを自作、運用していましたが、その際はRedshiftにテスト結果を格納していました。  維持費高いんですよね。。Redshift。
どうせ一旦はファイルベースで出力するので、Amazon Athenaとかでもいいような気がしてきました。

まとめ

一時期はMQL5クラウドネットワークにお世話になっていましたが(貸す方、借りる方の両方で)、
いくつか制約も見えてきたので、ヘビーに運用するなら一周まわって物理PCが良いんじゃないか? とも思いました。

スポンサーリンク
おすすめの記事