2015年5月4日月曜日

MT4プログラムの小ネタ EU夏時間を判定するプログラム と雑談

前回、アメリカ夏時間を判定したので、今回はEU夏時間です。
こちらはイギリス夏時間がベースになっているようですので、それを判定したいと思います。

最終日曜日から最終日曜日までですので、EUの方が判定プログラムは簡単です。
月の最終日から、その日のTimeDayOfWeekで取得した値(日曜日0〜土曜日6)を引けば最終日曜日です。

//------------------------------------------------------------------
// 指定日時がEUサマータイムかどうか
// return 指定GMT時間がサマータイムの場合 true
bool IsEnglandSummerTime(
datetime gmt         // GMT
)
{
datetime londonTime = gmt;

MqlDateTime dt;
TimeToStruct(londonTime, dt);

//夏時間判定
datetime startSummerTime;
datetime endSummerTime;
MqlDateTime work;
int week;

// 標準時ベースで3月最終日曜日 AM1:00 ~ 10月最終日曜日AM1:00
work.year = dt.year;
work.mon = 3;
work.day = EndOfMonth(work.year, work.mon);;
work.hour = 1;
work.min = 0 ;
work.sec = 0 ;
week = TimeDayOfWeek(StructToTime(work));
work.day = work.day - week;

startSummerTime = StructToTime(work) ;

work.mon = 10;
work.day = EndOfMonth(work.year, work.mon);
work.hour = 1;
work.min = 0 ;
work.sec = 0 ;
week = TimeDayOfWeek(StructToTime(work));
work.day = work.day - week;

endSummerTime = StructToTime(work) ;

return startSummerTime <= londonTime && londonTime < endSummerTime;
}


GW中の日本時間は当たり前ですが、動きませんよね。値動きが少ない上に何かあると恐ろしい程動きます。テクニカル的には厳しい時間帯です。こんな時は取引せずに眺めているのが大切と考えています。現在作成しているEAではアメリカ・イギリス・日本の祝日フィルタを作成して各市場祝日の際は、取引しないようにしています。バックテストの結果にも影響をあたえるため10年分ぐらいは正しく判定出来るようにしましたが・・・テストがアホほど面倒でした。うーん。10年分のカレンダーデータをそのまま入れても良かったかなぁと作った後に少々後悔するほど手間がかかってしまいました。