この記事では、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) |
構造体の図解
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()が安全


