MQL4 / MQL5 で日付がサマータイムかどうかを判定する関数を紹介する。
ニューヨーク、ロンドン、シドニーのサマータイムを判定する。
MqlDateTime
型の引数を受け取り、その日付がサマータイム期間中なら true
を、サマータイム期間外なら false
を返す。
2007 年以降:3 月第 2 日曜日から 11 月第 1 日曜日までが夏時間
2006 年まで:4 月第 1 日曜日から 10 月最終日曜日までが夏時間
bool IsNewYorkDST(MqlDateTime &dt) { int today = (dt.year * 10000) + (dt.mon * 100) + dt.day; int start = 0; int end = 0; if(dt.year >= 2007) { MqlDateTime dt0314; TimeToStruct((datetime)(IntegerToString(dt.year) + ".3.14"), dt0314); MqlDateTime dt1107; TimeToStruct((datetime)(IntegerToString(dt.year) + ".11.7"), dt1107); start = (dt.year * 10000) + (3 * 100) + (14 - dt0314.day_of_week); end = (dt.year * 10000) + (11 * 100) + (7 - dt1107.day_of_week); } else { MqlDateTime dt0407; TimeToStruct((datetime)(IntegerToString(dt.year) + ".4.7"), dt0407); MqlDateTime dt1031; TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.31"), dt1031); start = (dt.year * 10000) + (4 * 100) + (7 - dt0407.day_of_week); end = (dt.year * 10000) + (10 * 100) + (31 - dt1031.day_of_week); } return(today >= start && today < end); }
3 月最終日曜日から 10 月最終日曜日までが夏時間
bool IsLondonDST(MqlDateTime &dt) { int today = (dt.year * 10000) + (dt.mon * 100) + dt.day; int start = 0; int end = 0; MqlDateTime dt0331; TimeToStruct((datetime)(IntegerToString(dt.year) + ".3.31"), dt0331); MqlDateTime dt1031; TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.31"), dt1031); start = (dt.year * 10000) + (3 * 100) + (31 - dt0331.day_of_week); end = (dt.year * 10000) + (10 * 100) + (31 - dt1031.day_of_week); return(today >= start && today < end); }
10 月第 1 日曜日から 4 月第 1 日曜日までが夏時間
bool IsSydneyDST(MqlDateTime &dt) { int today = (dt.year * 10000) + (dt.mon * 100) + dt.day; int start = 0; int end = 0; MqlDateTime dt1007; TimeToStruct((datetime)(IntegerToString(dt.year) + ".10.7"), dt1007); MqlDateTime dt0407; TimeToStruct((datetime)(IntegerToString(dt.year) + ".4.7"), dt0407); start = (dt.year * 10000) + (10 * 100) + (7 - dt1007.day_of_week); end = (dt.year * 10000) + (4 * 100) + (7 - dt0407.day_of_week); return(today >= start || today < end); }