自動売買07

ここでは、MetaTrader4のEAの処理速度を高める方法と、テスターでEAのパラメーターを最適化する方法を紹介します。

前回記事で作成したEAのコードで説明します。EAのコードは前回記事で確認するかEAファイルをダウンロードして確認してください。

前回記事【MetaTrader4のEAを改良する方法】へ

前回作成したEA【MA_Doten_EAv1.01.mq4】をダウンロード

EAの処理速度を高める方法

EAの処理速度を高める方法として一番効果的なのが、無駄な処理をしないことです。

前回記事で作成したEAは、バックテストの「始値のみ」と「全ティック」では、異なる結果になります。
このEAの場合、シグナルが発生しているローソク足の途中でTP/SL決済したタイミングではエントリー注文をします。

上記のように、ローソク足の途中で取引注文の処理がある場合、バックテストの「始値のみ」と「全ティック」では、異なる結果になります。

EAをローソク足の始値のみで実行させる方法

EAをローソク足の始値のみで実行させたい場合は、次のコードをOnTick()関数の最初に追加します。

   // ローソク足1本につき始めの1回のみ実行する ---------
   static datetime last_run_time = 0;
   if (last_run_time == Time[0]) return;
   last_run_time = Time[0];

変数宣言の前にstaticを付けると、グローバル変数のように格納されている値がティック毎にリセットされることなく次のティックでも利用できるようになります。
datetimeは日時のデータ型です。Time[0]は、現在のローソク足の始値時点での日時です。

これでバックテストを行うと始値のみと全ティックは同じ結果となります。
テストに要する時間は、始値のみの方が圧倒的に短いです。

シグナルをローソク足の始値のみで発生させる方法

このEAには無いですが、トレーリングストップ機能などでローソク足の途中でも実行したい処理がある場合は、EA実行全体を始値時点のみにするのは不都合ですので、ここでは、シグナル発生を始値のみにする方法を紹介します。
(先ほど追加したコードは削除しておいてください。)

   int entry_sign = 0;  // エントリー用シグナル
   int exit_sign = 0;   // 決済用シグナル

上記コードの次からのシグナル判定部分を次のように変更します。

   // ローソク足1本につき始めの1回のみ判定する ---------
   static datetime last_calc_time = 0;
   if (last_calc_time != Time[0])
   {
      last_calc_time = Time[0];
      
      // MAの値を取得
      (中略)
   }

このように、全てのティックで処理する必要のないものを、処理タイミングの限定をすることでバックテストや最適化に必要な時間を短縮することができます。

【MA_Doten_EAv1.02】はコードミスがあったため、次のバージョンをダウンロードしてください。

今回の完成EA修正版【MA_Doten_EAv1.03.mq4】をダウンロード

EAのパラメーターを最適化する方法

MetaTrader4では、EAのパラメーター設定で複数のパターンを一度にバックテストする機能があります。その機能を使って成績がよいパラメーターの組み合わせを見つけていく作業を最適化といいます。

最適化を行う場合の設定方法は、バックテスト+αなので、バックテストの設定方法がわからない方は次の記事をご参照ください。

過去記事【MetaTrader4のテスター機能でEAの良し悪しを判断する】へ

最適化にチェック

セッティングタブの右側に最適化という項目があるので、それにチェックをいれます。無い場合は、MT4を最大化してみてください。

最適化の組み合わせを決める

エキスパート設定のパラメーターの入力タブで、次の画像のように設定パターンを複数にしたいパラメーターの左側のボックスにチェックをいれます。

最適化パラメーター設定

左側のチェックを入れていないパラメーターは、値の列に入力されている値が使用されます。
チェックを入れたパラメーターは、スタート・ステップ・ストップで指定した値が使用されます。

先ほどの画像でStopLossやTakeProfitは、スタートが100・ステップが100・ストップが1000なので、100, 200, 300, ・・・, 1000の10パターンがテストに使用されます。
MA_Peroidは、10, 20, 30, ・・・, 100の10パターンです。

10パターン3つのそれぞれの組み合わせの1000パターンをテストすることになります。1パターン1分かかるとしたら全部で1000分(約17時間)かかります。

最適化を行う前に、EAの処理速度を高めることと、最適化するパラメーターとその範囲を絞ると時間短縮になります。

最適化を開始する

テスターのスタートボタンをクリックすると、最適化が開始されます。
最適化が開始されると、最適化結果タブと最適化グラフタブが追加され、最適化終了までの推定時間がスタート/ストップボタンの上に表示されます。

最適化結果の見方

最適化結果タブには、テストする組み合わせが終わったものから結果データが追加されていきます。損益がマイナスのものも表示されるようにするには、右クリックして「マイナスの結果を表示しない」のチェックを外します。

表の項目の部分をクリックすると、その項目で昇順・降順にソートできます。

最適化終了後、結果の1つを右クリックして「パラメータの設定」をクリックすると、パラメーターの値にその組み合わせの値がセットされます。
その状態でバックテストをすると、そのパラメーターでのレポート詳細を見ることができます。

あとがき

今回は、EAの処理速度の高め方と、パラメーターの最適化の方法を紹介しました。
オリジナルのEAを作成したら、ぜひこの記事を参考に実行してみてください。