ここではMetaTrader4のパラメーター最適化機能を利用して、先月の上昇した曜日・時間帯を分析するEAの作成方法と使い方を解説します。
曜日・時間指定機能つきEA作成
今回は曜日指定とエントリー時間指定、保有時間指定のパラメーターを設置したテスターのみで実行可能なEAを作成します。週1回決まった時間に買いエントリーして、決まった時間に決済するようにします。
完成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日までの期間にします。大まかにチェックするため、モデルはコントロールポイントにしておきます。
最適化項目と値を設定
次の画像を参考に、最適化するパラメーター名の左側にチェックが入っているかどうか、各パラメーターのスタート・ステップ・ストップの値を正しく入力したかどうかを確認します。
最適化結果を分析する
テスター画面のスタートボタンを押してしばらくすると、最適化が終わります。
最適化結果タブは、数値データで比較などができます。右クリックで、すべてコピーを選び、表計算ソフトに貼り付けるとさらに分析しやすいです。
最適化グラフタブで右クリックして2Dサーフェイスを選びx軸に曜日・y軸に時間を選択すると、次の画像のように視覚的に分析することもできます。
あとがき
今回のEAを売り注文に変更して、下落した曜日・時間帯を調べたりもできますね。
色々とカスタマイズしてみてください。
こんばんわ、為替龍です。
いつもすごい詳しい内容な記事ですね。
勉強になります。
次回を楽しみにしてます。
こんにちわ!
為替龍さんのブログは情報量がすごくて
こちらこそ、勉強させていただいてます。
いつも、有益な情報をありがとうございます。
これからも、よろしくお願いします。