最適化2Dグラフ

ここではMetaTrader4のパラメーター最適化機能を利用して、先月の上昇した曜日・時間帯を分析するEAの作成方法と使い方を解説します。

曜日・時間指定機能つきEA作成

今回は曜日指定とエントリー時間指定、保有時間指定のパラメーターを設置したテスターのみで実行可能なEAを作成します。週1回決まった時間に買いエントリーして、決まった時間に決済するようにします。

Dr.EADr.EA

完成EAのコードがこちら。

extern int     TradeDayofWeek = 1;  // 1=Monday ,2,3,4, 5=Friday
extern int     EntryHour      = 0;
extern int     EntryMinute    = 0;
extern int     HoldMinutes    = 60;
extern double  Lots           = 0.01;

string entry_date_str;

int OnInit()
{
   if (IsTesting() == false) return(INIT_FAILED);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   if (OrdersTotal() > 0)
   {
      if (OrderSelect(0, SELECT_BY_POS) == false) return;
      
      if (OrderOpenTime() + HoldMinutes * 60 <= TimeCurrent())
         if (OrderClose(OrderTicket(), Lots, OrderClosePrice(), 0) == false)
            Print("OrderClsoe error.");
   }
   else
   {
      if (DayOfWeek() != TradeDayofWeek) return;
      if (entry_date_str == TimeToStr(TimeCurrent(), TIME_DATE)) return;
      if (Hour() != EntryHour) return;
      if (Minute() < EntryMinute) return;
      
      int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 0, 0, 0);
      if (ticket > 0) entry_date_str = TimeToStr(TimeCurrent(), TIME_DATE);
   }
}

今回完成EA【TimeTrade_forOpt.mq4】をダウンロード

パラメーターとグローバル変数

パラメーター用変数とグローバル変数は次のコードです。

extern int     TradeDayofWeek = 1;  // 1=Monday ,2,3,4, 5=Friday
extern int     EntryHour      = 0;
extern int     EntryMinute    = 0;
extern int     HoldMinutes    = 60;
extern double  Lots           = 0.01;

string entry_date_str;

一つ目のパラメーターには、曜日の数字(1=月曜, 2=火曜, ・・・, 5=金曜)を入力するようにします。その下に、エントリー時間、エントリー分、保有時間(単位: 分)、ロット数としています。

グローバル変数は、エントリーした際にその時の日付の文字列を格納するようにします。

OnTick()関数内の処理

OrdersTotal()関数でポジションの有無を確認して、処理を分けます。

ポジション保有時の処理

ポジション保有時の処理は次の通りです。

   if (OrdersTotal() > 0) // ポジション保有時
   {
      if (OrderSelect(0, SELECT_BY_POS) == false) return;
      
      // 指定した保有時間が経過した場合に決済
      if (OrderOpenTime() + HoldMinutes * 60 <= TimeCurrent())
         if (OrderClose(OrderTicket(), Lots, OrderClosePrice(), 0) == false)
            Print("OrderClsoe error.");
   }

ポジション無しの時の処理

ポジション無しの時の処理は次の通りです。

   else // ポジション保有時ではない場合
   {
      if (DayOfWeek() != TradeDayofWeek) return;
      if (entry_date_str == TimeToStr(TimeCurrent(), TIME_DATE)) return;
      if (Hour() != EntryHour) return;
      if (Minute() < EntryMinute) return;
      
      int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 0, 0, 0);
      if (ticket > 0) entry_date_str = TimeToStr(TimeCurrent(), TIME_DATE);
   }
もし、今日の曜日が指定した曜日ではないなら、処理終了
もし、エントリーした日付の文字列が本日なら、処理終了
もし、現在時間が指定時間ではないなら、処理終了
もし、現在分が指定分でないなら、処理終了

買い成行注文実行
約定したら、entry_date_strに本日の日付の文字列を格納

テスターの最適化機能を利用する

テスターウィンドウで今回のEAを選択して、最適化にチェックをいれます。

期間を指定にチェックを入れ、先月1日から今月の1日までの期間にします。大まかにチェックするため、モデルはコントロールポイントにしておきます。

最適化項目と値を設定

次の画像を参考に、最適化するパラメーター名の左側にチェックが入っているかどうか、各パラメーターのスタート・ステップ・ストップの値を正しく入力したかどうかを確認します。

TimeTrade_forOptの設定画面

最適化結果を分析する

テスター画面のスタートボタンを押してしばらくすると、最適化が終わります。
最適化結果タブは、数値データで比較などができます。右クリックで、すべてコピーを選び、表計算ソフトに貼り付けるとさらに分析しやすいです。

最適化グラフタブで右クリックして2Dサーフェイスを選びx軸に曜日・y軸に時間を選択すると、次の画像のように視覚的に分析することもできます。

最適化2Dグラフ

あとがき

今回のEAを売り注文に変更して、下落した曜日・時間帯を調べたりもできますね。
色々とカスタマイズしてみてください。