【MQL4リファレンス】MqlDateTime構造体の使い方!時間帯フィルターEAを作る方法

構造体

この記事では、MQL4のMqlDateTime構造体について詳しく解説します。
日付・時刻データを年・月・日・曜日など個別のフィールドに分けて管理できるため、時間帯フィルタースケジュール管理EAを作るときに大変役立ちます。

MqlDateTime構造体とは?

MqlDateTimeは、MQL4に組み込まれている日付と時刻を管理するための構造体です。

通常、MQL4では時刻をdatetime型(Unix時刻の整数値)で扱います。しかしdatetimeのままでは「今が何時か」「何曜日か」を調べるのが大変です。

MqlDateTimeを使うと、TimeToStruct()関数でdatetimeをMqlDateTimeに変換し、各フィールドに直接アクセスできます。

MqlDateTime が便利な場面
・ロンドン・NYなど特定セッションのみ取引するフィルター
・週末(土日)は取引しない設定
・特定の時間帯にアラートを出す

構造体の定義・フィールド一覧

フィールド 説明
year ushort 年(例: 2025)
mon ushort 月(1〜12)
day ushort 日(1〜31)
hour ushort 時(0〜23)
min ushort 分(0〜59)
sec ushort 秒(0〜59)
day_of_week ushort 曜日(0=日曜、1=月曜、…、6=土曜)
day_of_year ushort 年通算日(1〜365、うるう年は366)

構造体の図解

struct MqlDateTime ushort year 年(例: 2025) ushort mon 月(1〜12) ushort day 日(1〜31) ushort hour 時(0〜23) ushort min 分(0〜59) ushort sec 秒(0〜59) ushort day_of_week 曜日(0=日〜6=土) ushort day_of_year 年通算日(1〜365/366) 変換関数 TimeToStruct(dt, mdt) StructToTime(mdt)
MqlDateTime構造体のフィールド一覧と変換関数

TimeToStruct() / StructToTime() の使い方

MqlDateTimeを使うためには、datetime型との変換関数を理解する必要があります。

TimeToStruct() — datetimeをMqlDateTimeに変換

bool TimeToStruct(
    datetime      dt,      // 変換するdatetime値
    MqlDateTime  &dt_struct  // 変換結果を受け取るMqlDateTime変数
);

StructToTime() — MqlDateTimeをdatetimeに変換

datetime StructToTime(
    MqlDateTime  &dt_struct  // 変換するMqlDateTime変数
);

プログラム例①:現在時刻を各フィールドで取得する

TimeCurrent()で現在時刻を取得し、MqlDateTimeに変換して各フィールドを表示する基本的な例です。

void OnTick()
{
    // 現在時刻をMqlDateTimeに変換
    MqlDateTime dt;
    TimeToStruct(TimeCurrent(), dt);

    // 各フィールドを表示
    Print("=== 現在時刻 ===");
    Print("年: ", dt.year, "  月: ", dt.mon, "  日: ", dt.day);
    Print("時: ", dt.hour, "  分: ", dt.min, "  秒: ", dt.sec);

    // 曜日を日本語で表示
    string weekdays[] = {"日","月","火","水","木","金","土"};
    Print("曜日: ", weekdays[dt.day_of_week], "曜日");
    Print("年通算日: ", dt.day_of_year, "日目");
}

プログラム例②:時間帯フィルター(EA向け)

EAでよく使われる取引セッションフィルターの実装例です。ロンドン時間(GMT 8:00〜17:00)のみ取引し、土日は除外します。

// ロンドンセッション(GMT 8:00〜17:00)かどうか判定する
bool IsLondonSession()
{
    MqlDateTime dt;
    TimeToStruct(TimeGMT(), dt);  // GMT時刻を使用

    // 土曜・日曜は除外
    if(dt.day_of_week == 0 || dt.day_of_week == 6)
        return false;

    // ロンドン時間内かチェック
    if(dt.hour >= 8 && dt.hour < 17)
        return true;

    return false;
}

// EAのOnTick関数での使用例
void OnTick()
{
    // ロンドンセッション外は何もしない
    if(!IsLondonSession())
    {
        Comment("現在はロンドンセッション外です");
        return;
    }

    // ここに取引ロジックを記述
    Comment("ロンドンセッション中 — 取引可能");
}

プログラム例③:StructToTime()で日時を生成する

逆方向の変換例です。特定の日時をdatetime値として生成したいときに使います。

// 2025年1月1日 0:00:00 のdatetime値を生成する
MqlDateTime dt;
dt.year = 2025;
dt.mon  = 1;
dt.day  = 1;
dt.hour = 0;
dt.min  = 0;
dt.sec  = 0;

datetime target = StructToTime(dt);
Print("2025年元旦のdatetime値: ", target);
Print("文字列: ", TimeToString(target, TIME_DATE|TIME_MINUTES));

まとめ

  • MqlDateTimeは、日付・時刻を年・月・日・時・分・秒・曜日・通算日の8フィールドで管理する構造体
  • TimeToStruct()datetime→MqlDateTime、StructToTime()で逆変換ができる
  • EAの時間帯フィルター(特定セッションのみ取引)や曜日フィルター(土日除外)に活用できる
  • TimeCurrent()はブローカーのサーバー時刻、TimeGMT()はGMT時刻を返すため、フィルター用途ではTimeGMT()が安全