💭

MQL5で日本時間取得するライブラリ

2024/09/08に公開
TimeCalculator.mqh
//+------------------------------------------------------------------+
//|                                              TimeCalculator.mqh  |
//|                                      Copyright 2024, YourCompany |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, YourCompany"

class TimeCalculator
{
public:
    enum TimeZoneType
    {
        JST,                // 日本標準時(GMT+9)
        JST_BACKTEST,       // バックテスト用の日本時間
        GMT_FIXED           // 固定GMT(バックテスト用)
    };

private:
    TimeZoneType m_timeZoneType;
    int m_summerOffset;
    int m_winterOffset;

public:
    TimeCalculator(): m_timeZoneType(JST), m_summerOffset(6), m_winterOffset(7) {}

    void configure(TimeZoneType timeZoneType, int summerOffset, int winterOffset)
    {
        m_timeZoneType = timeZoneType;
        m_summerOffset = summerOffset;
        m_winterOffset = winterOffset;
    }

    datetime getCalculatedTime()
    {
        switch (m_timeZoneType)
        {
            case JST:
                return TimeGMT() + 60 * 60 * 9;
            case JST_BACKTEST:
                return calculateJSTTime();
            case GMT_FIXED:
                return TimeCurrent() + 60 * 60 * 9;
            default:
                return 0;
        }
    }

    // 新しい時間要素取得関数
    int getHour()
    {
        MqlDateTime tm;
        TimeToStruct(getCalculatedTime(), tm);
        return tm.hour;
    }

    int getMinute()
    {
        MqlDateTime tm;
        TimeToStruct(getCalculatedTime(), tm);
        return tm.min;
    }

    int getSecond()
    {
        MqlDateTime tm;
        TimeToStruct(getCalculatedTime(), tm);
        return tm.sec;
    }

    int getDay()
    {
        MqlDateTime tm;
        TimeToStruct(getCalculatedTime(), tm);
        return tm.day;
    }

    int getDayOfWeek()
    {
        MqlDateTime tm;
        TimeToStruct(getCalculatedTime(), tm);
        return tm.day_of_week;
    }

private:
    datetime calculateJSTTime()
    {
        datetime now = TimeCurrent();
        datetime summer = now + 60 * 60 * m_summerOffset;
        datetime winter = now + 60 * 60 * m_winterOffset;
        return isSummerTime() ? summer : winter;
    }

    bool isSummerTime()
    {
        datetime now = TimeCurrent();
        MqlDateTime tm;
        TimeToStruct(now, tm);
        
        int month = tm.mon;
        int day = tm.day;
        int dayOfWeek = tm.day_of_week;

        if (month < 3 || month > 11) return false;
        if (month > 3 && month < 11) return true;

        if (month == 3)
        {
            int dstStart = 14 - dayOfWeek;
            return day >= dstStart;
        }
        if (month == 11)
        {
            int dstEnd = 7 - dayOfWeek;
            return day < dstEnd;
        }
        return false;
    }
};

利用方法

//+------------------------------------------------------------------+
//|                                                 25EMA_3OCO.mq5   |
//|                                      Copyright 2024, YourCompany |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, YourCompany"
#property version   "1.00"
#property strict

#include "TimeCalculator.mqh"

// ユーザー入力用のenum
enum TIMEZONE_SELECTION
{
    TZ_JST,          // 日本標準時(GMT+9)
    TZ_JST_BACKTEST, // バックテスト用日本時間
    TZ_GMT_FIXED     // 固定GMT(バックテスト用)
};

// ユーザー入力
input TIMEZONE_SELECTION InpTimeZone = TZ_JST; // タイムゾーン選択
input int InpSummerOffset = 6;                 // 夏時間オフセット(時間)
input int InpWinterOffset = 7;                 // 冬時間オフセット(時間)

// グローバル変数
TimeCalculator g_timeCalc;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // その他の初期化コード...

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // TimeCalculatorの設定と時間計算を一行で行う
    g_timeCalc.configure((TimeCalculator::TimeZoneType)InpTimeZone, InpSummerOffset, InpWinterOffset);
    
    // 時間要素を個別に取得
    int hour = g_timeCalc.getHour();
    int minute = g_timeCalc.getMinute();
    int second = g_timeCalc.getSecond();
    int day = g_timeCalc.getDay();
    int dayOfWeek = g_timeCalc.getDayOfWeek();
    
    // 時間情報を表示
    string timeInfo = StringFormat("時間: %02d:%02d:%02d, 日付: %d, 曜日: %d", 
                                   hour, minute, second, day, dayOfWeek);
    Comment("計算された時間情報:\n", timeInfo);
    
    // ここに他のトレードロジックを追加...
}

// その他の必要な関数をここに配置...

Discussion