{{tag>mql4 mql5 サマータイム}} ====== 【MQL4 / MQL5】日付がサマータイムかどうかを判定する ====== {{INLINETOC}} ===== サマータイムの判定関数 ===== 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); }