目次

, ,

【MQL4 / MQL5】日付がサマータイムかどうかを判定する

サマータイムの判定関数

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);
}