💭
MQL5で日本時間取得するライブラリ
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