最大3つまで仕掛けの時間帯を指定できる
※2016/8/6 kumaさんのご指摘でcalcTimeDifference()に不具合があることが判明。修正しました。
○時~○時までの間は仕掛けたいが、それ以外の時間帯は仕掛けたくない(EAを稼働させたくない)ことがしばしばあります。これを実現する機能が仕掛け時間帯指定機能です。
サマータイムを考慮した自動GMT設定関数を使って、仕掛け時間帯指定機能を実装してみようと思います。
書籍では○時~○時を1つだけ指定できるものが殆どです。しかし、ロンドン時間とニューヨーク時間の2つの時間帯でEAを稼働させたいシーンってあると思うんですよ。
というわけで、○時~○時を最大3つまで指定できる仕掛け時間帯指定機能(例えば、6:00~9:00、16:00~19:00、21:00~0:00)を紹介します。
EA全体で機能を実装するため、サンプルEAを直接掲載します。
以下のパラメータの記述により仕掛け時間帯を設定できるようになります。1~3のそれぞれに有効フラグを設けることで、機能のon/offを簡単に切り替えられるようになっています。
extern string Note02_4 = "--- Entry Time 1-3 -------------------------------------------"; extern string Note02_5 = "Entry Time 1 (Local Time)"; extern bool UseEntryTimeFlg1 = true; extern int EntryStartHour1 = 6; // 仕掛け開始時刻(時) ローカルタイム extern int EntryStartMinute1 = 0; // 仕掛け開始時刻(分) ローカルタイム extern int EntryEndHour1 = 9; // 仕掛け終了時刻(時) ローカルタイム extern int EntryEndMinute1 = 0; // 仕掛け終了時刻(分) ローカルタイム extern string Note02_6 = "Entry Time 2 (Local Time)"; extern bool UseEntryTimeFlg2 = true; extern int EntryStartHour2 = 16; extern int EntryStartMinute2 = 0; extern int EntryEndHour2 = 19; extern int EntryEndMinute2 = 0; extern string Note02_7 = "Entry Time 3 (Local Time)"; extern bool UseEntryTimeFlg3 = true; extern int EntryStartHour3 = 21; extern int EntryStartMinute3 = 0; extern int EntryEndHour3 = 0; extern int EntryEndMinute3 = 0;
続いて、OnInit()で有効フラグが何本立っているかカウントしておきます。有効フラグが3本立っている場合で、現在時刻がいずれの仕掛け時間帯にも含まれなかった場合、仕掛け不可と判断するのに利用します。
// 仕掛け時間帯指定 if(UseEntryTimeFlg1){ gEntryTimeFlgTrueCnt += 1; } if(UseEntryTimeFlg2){ gEntryTimeFlgTrueCnt += 1; } if(UseEntryTimeFlg3){ gEntryTimeFlgTrueCnt += 1; }
そして、OnTick()で現在時刻が仕掛け時間帯かどうかを判断し、NOなら仕掛けを不可とし、以降の仕掛け処理をスキップします。
// ----------------------------------------------------------------- // 仕掛け時間帯指定 // ----------------------------------------------------------------- // ローカルタイム時刻(時)⇒サーバタイム時刻(時)変換 gSvEntryStartHour1 = convertLocalToServerTime(EntryStartHour1, timeDiff); gSvEntryEndHour1 = convertLocalToServerTime(EntryEndHour1, timeDiff); gSvEntryStartHour2 = convertLocalToServerTime(EntryStartHour2, timeDiff); gSvEntryEndHour2 = convertLocalToServerTime(EntryEndHour2, timeDiff); gSvEntryStartHour3 = convertLocalToServerTime(EntryStartHour3, timeDiff); gSvEntryEndHour3 = convertLocalToServerTime(EntryEndHour3, timeDiff); // ----------------------------------------------------------------- // 仕掛けフィルター // ----------------------------------------------------------------- int overCnt = 0; // 仕掛け時間帯指定 if(UseEntryTimeFlg1 && isOverTime(gSvEntryStartHour1, EntryStartMinute1, gSvEntryEndHour1, EntryEndMinute1)){ overCnt += 1; } if(UseEntryTimeFlg2 && isOverTime(gSvEntryStartHour2, EntryStartMinute2, gSvEntryEndHour2, EntryEndMinute2)){ overCnt += 1; } if(UseEntryTimeFlg3 && isOverTime(gSvEntryStartHour3, EntryStartMinute3, gSvEntryEndHour3, EntryEndMinute3)){ overCnt += 1; } // 仕掛け時間外なら、仕掛けない if(overCnt == gEntryTimeFlgTrueCnt){ return; }
convertLocalToServerTime()関数はローカルタイムをサーバタイムに変換する自作関数です。isOverTime()関数も自作関数で、現在時刻が仕掛け時間帯かどうかを教えてくれます。
if(overCnt == gEntryTimeFlgTrueCnt)の部分が理解しにくいかもしれませんが、一番重要な部分です。言葉でごちゃごちゃ説明されるより、このEAを実際に動かして何をしているのか確認してみてください。その方がずっと理解が深まりますので。