サマータイムかどうか判別する方法

プログラミング

こんばんは。たかはしみのるです。
この記事ではMQL4でサマータイムかどうか判定する方法について紹介します。

日本時間の決まった時刻に取引をするEAを作成したい場合、サマータイム期間なのか判別する必要があります。
例えば、日本時間の9:55からのドル円ショート戦略をEAにする場合、9:55がサーバ時間の何時なのか知る必要があります。
サマータイムかどうかで時間がずれるからです。
サマータイムの場合は3:55、そうでない場合は2:55が日本時間の9:55にあたります。
※GMT+2(夏時間の時はGMT+3)のブローカーの場合

2007年以降、サマータイムは3月第2日曜日~11月の第1日曜日までと決まっています。
(2006年以前は4月の第1日曜日~10月の最終日曜日の間がサマータイムでした)
2021年のカレンダーでは、サマータイムは3月14日(日)~11月7日(日)までです。

この機能をEAで実装する場合、対象の日が3月第2日曜日~11月第1日曜日の間かどうか判別する、ということになります。
以下にサマータイムかどうか判別する関数の例を記します。

bool isSummerTime(){
   bool ret = false;
   
   datetime summerStart;   //サマータイム開始日
   datetime summerEnd;     //サマータイム終了日
   datetime tc = TimeCurrent();
   
   //サマータイム開始日を3/14の前の日曜日に設定
   summerStart = StringToTime(IntegerToString(Year()) + ".03.14");
   summerStart = summerStart - TimeDayOfWeek(summerStart) * 24 * 60 * 60;
   
   //サマータイム終了日を11/7の前の日曜日に設定
   summerEnd = StringToTime(IntegerToString(Year()) + ".11.07");
   summerEnd = summerEnd - TimeDayOfWeek(summerEnd) *24 * 60 * 60;
   
   //現在の時刻がサマータイム開始日と終了日の間であればtrueを返す
   if(tc > summerStart && tc < summerEnd) ret = true;
   return ret;
}

TimeDayOfWeek関数は、日曜日なら「0」、月曜日なら「1」、、、金曜日なら「5」を返す関数です。

例えば、夏時間の開始日は、3月14日が月曜日なら1日前、金曜日なら5日前ということになりますので、日数×24時間×60分×60秒を減算しています。

何かの参考になれば幸いです。

コメント

タイトルとURLをコピーしました