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








こんばんわ、為替龍です。
いつもすごい詳しい内容な記事ですね。
勉強になります。
次回を楽しみにしてます。
こんにちわ!
為替龍さんのブログは情報量がすごくて
こちらこそ、勉強させていただいてます。
いつも、有益な情報をありがとうございます。
これからも、よろしくお願いします。