MQL5の時間・日付関数を完全解説。TimeCurrent・TimeLocal・TimeToString・StringToTime・MqlDateTime構造体・TimeToStruct・StructToTime・TimeDaylightSavings・各種時間足のバー時刻操作まで、EA開発で必要な日時処理のすべてをコード付きで解説します。
目次
MQL5の時間の種類
MQL5には3種類の時間があります。EA開発では「サーバー時間」が基準になります。
| 関数 | 時間の種類 | 説明 |
|---|---|---|
| TimeCurrent() | サーバー時間 | 最後に受信したティックの時刻。EAの基準時間 |
| TimeLocal() | ローカル時間 | PCのシステム時刻 |
| TimeGMT() | GMT時間 | グリニッジ標準時 |
| TimeTradeServer() | サーバー予測時間 | TimeCurrent()の秒精度版(ティック間も更新) |
void PrintAllTimes()
{
datetime server = TimeCurrent();
datetime local = TimeLocal();
datetime gmt = TimeGMT();
datetime trade = TimeTradeServer();
PrintFormat("サーバー時間: %s", TimeToString(server, TIME_DATE | TIME_SECONDS));
PrintFormat("ローカル時間: %s", TimeToString(local, TIME_DATE | TIME_SECONDS));
PrintFormat("GMT時間: %s", TimeToString(gmt, TIME_DATE | TIME_SECONDS));
PrintFormat("取引サーバー: %s", TimeToString(trade, TIME_DATE | TIME_SECONDS));
// GMTとの差分
int gmtOffset = (int)(server - gmt);
PrintFormat("サーバーGMTオフセット: %+d時間", gmtOffset / 3600);
}
重要
TimeCurrent()はティックが来ないと更新されません。週末やメンテナンス中は金曜の最終ティック時刻のままです。正確な現在時刻が必要な場合はTimeTradeServer()を使ってください。
datetime型とリテラル
datetime型は1970年1月1日0時0分0秒(UNIX epoch)からの経過秒数を格納するlong型です。日時リテラルはD'2024.01.01 00:00'の形式で書けます。
// リテラル表記
datetime dt1 = D'2024.01.01 00:00:00'; // 完全形式
datetime dt2 = D'2024.01.01'; // 時刻省略(00:00:00)
datetime dt3 = D'2024.01.01 12:30'; // 秒省略
// 秒数での計算
datetime now = TimeCurrent();
datetime oneHourLater = now + 3600; // 1時間後
datetime oneDayAgo = now - 86400; // 1日前
datetime oneWeekAgo = now - 7 * 86400; // 1週間前
// datetime同士の差(秒数)
datetime start = D'2024.01.01';
datetime end = D'2024.01.31';
int diffDays = (int)(end - start) / 86400; // 30日
Print("差分: ", diffDays, "日");
// datetimeの比較
if(TimeCurrent() > D'2024.01.01')
Print("2024年以降です");MqlDateTime構造体
MqlDateTimeは日時の各要素(年/月/日/時/分/秒/曜日/年通算日)を個別に格納する構造体です。時間帯の判定や曜日フィルターに使います。
// MqlDateTime構造体の定義
// struct MqlDateTime {
// int year; // 年(例: 2024)
// int mon; // 月(1〜12)
// int day; // 日(1〜31)
// int hour; // 時(0〜23)
// int min; // 分(0〜59)
// int sec; // 秒(0〜59)
// int day_of_week; // 曜日(0=日曜, 1=月曜, ..., 6=土曜)
// int day_of_year; // 年内通算日(1月1日=0)
// };
MqlDateTime dt;
TimeCurrent(dt); // 引数にMqlDateTimeを渡すと分解して格納
PrintFormat("%d年%d月%d日 %02d:%02d:%02d",
dt.year, dt.mon, dt.day, dt.hour, dt.min, dt.sec);
// 曜日の判定
string dayNames[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
Print("今日は: ", dayNames[dt.day_of_week]);TimeToStruct / StructToTime — 変換
// datetime → MqlDateTime(分解)
MqlDateTime dt;
TimeToStruct(TimeCurrent(), dt);
Print("時間: ", dt.hour, ":", dt.min);
// MqlDateTime → datetime(合成)
MqlDateTime custom;
custom.year = 2024;
custom.mon = 6;
custom.day = 15;
custom.hour = 12;
custom.min = 0;
custom.sec = 0;
datetime result = StructToTime(custom);
Print("合成: ", TimeToString(result));
// 今日の00:00:00を取得
datetime StartOfToday()
{
MqlDateTime dt;
TimeCurrent(dt);
dt.hour = 0;
dt.min = 0;
dt.sec = 0;
return StructToTime(dt);
}
// 今週月曜日の00:00:00を取得
datetime StartOfWeek()
{
MqlDateTime dt;
TimeCurrent(dt);
int daysBack = dt.day_of_week;
if(daysBack == 0) daysBack = 7; // 日曜は前の月曜まで7日
daysBack -= 1; // 月曜=0日前
datetime today = StartOfToday();
return today - daysBack * 86400;
}TimeToString / StringToTime — 文字列変換
datetime now = TimeCurrent();
// datetime → 文字列
string s1 = TimeToString(now); // "2024.06.15 12:30"
string s2 = TimeToString(now, TIME_DATE); // "2024.06.15"
string s3 = TimeToString(now, TIME_MINUTES); // "12:30"
string s4 = TimeToString(now, TIME_SECONDS); // "12:30:45"
string s5 = TimeToString(now, TIME_DATE | TIME_SECONDS); // "2024.06.15 12:30:45"
// 文字列 → datetime
datetime dt1 = StringToTime("2024.06.15 12:30:00");
datetime dt2 = StringToTime("2024.06.15"); // 00:00:00として解釈
datetime dt3 = StringToTime("12:30"); // 今日の12:30として解釈
// カスタムフォーマット(自分で組み立て)
string CustomTimeFormat(datetime time)
{
MqlDateTime dt;
TimeToStruct(time, dt);
return StringFormat("%04d/%02d/%02d %02d:%02d:%02d",
dt.year, dt.mon, dt.day, dt.hour, dt.min, dt.sec);
}EA開発での時間フィルター
EA開発で最もよく使う時間関連の実装パターンです。取引時間の制御、曜日フィルター、年末年始の停止などを実装します。
取引時間帯フィルター
input int TradeStartHour = 8; // 取引開始(サーバー時間)
input int TradeEndHour = 20; // 取引終了
// 取引可能時間帯かチェック
bool IsTradeTime()
{
MqlDateTime dt;
TimeCurrent(dt);
// 土日は取引しない
if(dt.day_of_week == 0 || dt.day_of_week == 6)
return false;
// 時間帯チェック
if(TradeStartHour < TradeEndHour)
{
// 通常(例: 8時〜20時)
return dt.hour >= TradeStartHour && dt.hour < TradeEndHour;
}
else
{
// 日跨ぎ(例: 22時〜6時)
return dt.hour >= TradeStartHour || dt.hour < TradeEndHour;
}
}
// 東京・ロンドン・NYセッション判定(GMT基準)
string GetTradingSession()
{
MqlDateTime dt;
TimeToStruct(TimeGMT(), dt);
int h = dt.hour;
if(h >= 0 && h < 8) return "東京";
if(h >= 8 && h < 16) return "ロンドン";
if(h >= 13 && h < 22) return "ニューヨーク";
return "クローズ";
}ゴトー日(5・10日)判定
// ゴトー日(5の倍数の日)かチェック
bool IsGotoDay()
{
MqlDateTime dt;
TimeCurrent(dt);
// 5の倍数の日
if(dt.day % 5 == 0) return true;
// 5の倍数日が土日の場合、前の金曜日もゴトー日
// 次の5の倍数日を計算
int nextGoto = ((dt.day / 5) + 1) * 5;
if(nextGoto > 28) nextGoto = 30; // 簡易計算
// 次のゴトー日までの差
int diff = nextGoto - dt.day;
if(diff <= 2) // 2日以内なら週末チェック
{
// 次のゴトー日の曜日を確認
datetime futureDate = TimeCurrent() + diff * 86400;
MqlDateTime futureDt;
TimeToStruct(futureDate, futureDt);
// 次のゴトー日が土曜→今日が木曜なら繰り上げ
if(futureDt.day_of_week == 6 && dt.day_of_week == 4) return true;
// 次のゴトー日が日曜→今日が金曜なら繰り上げ
if(futureDt.day_of_week == 0 && dt.day_of_week == 5) return true;
}
return false;
}
// 月末判定
bool IsMonthEnd()
{
MqlDateTime dt;
TimeCurrent(dt);
// 翌日の月が違えば今日は月末
datetime tomorrow = TimeCurrent() + 86400;
MqlDateTime tmrw;
TimeToStruct(tomorrow, tmrw);
return dt.mon != tmrw.mon;
}年末年始・重要イベント時の停止
// 年末年始の取引停止
bool IsHolidaySeason()
{
MqlDateTime dt;
TimeCurrent(dt);
// 12月24日〜1月3日は停止
if(dt.mon == 12 && dt.day >= 24) return true;
if(dt.mon == 1 && dt.day <= 3) return true;
return false;
}
// 金曜深夜の新規エントリー禁止(週またぎリスク回避)
bool IsFridayLate()
{
MqlDateTime dt;
TimeCurrent(dt);
return dt.day_of_week == 5 && dt.hour >= 20; // 金曜20時以降
}バー時刻の操作
// 特定の時刻のバーインデックスを取得
int barIndex = iBarShift(_Symbol, PERIOD_H1, D'2024.06.15 12:00');
Print("バーインデックス: ", barIndex);
// 特定バーの時刻を取得
datetime barTime = iTime(_Symbol, PERIOD_H1, 0); // 現在のバー
Print("現在のバー開始時刻: ", TimeToString(barTime));
// 日足の始まりの時刻を取得
datetime dailyOpen = iTime(_Symbol, PERIOD_D1, 0);
Print("今日の日足開始: ", TimeToString(dailyOpen));
// 経過バー数の計算
int BarsInRange(string symbol, ENUM_TIMEFRAMES tf, datetime from, datetime to)
{
return Bars(symbol, tf, from, to);
}
// 特定期間のバー数
int barsToday = Bars(_Symbol, PERIOD_H1, StartOfToday(), TimeCurrent());
Print("今日のH1バー数: ", barsToday);夏時間(DST)の処理
// サーバー時間をJST(GMT+9)に変換する関数
datetime ServerToJST(datetime serverTime)
{
// TimeCurrent()とTimeGMT()の差分でサーバーのGMTオフセットを算出
int serverGmtOff = (int)(TimeCurrent() - TimeGMT());
datetime gmt = serverTime - serverGmtOff;
return gmt + 9 * 3600; // GMT+9 = JST
}
void OnTick()
{
// 夏時間のオフセットを取得
int dstShift = TimeDaylightSavings(); // 夏時間中は3600(1時間)
int serverGmtOff = (int)(TimeCurrent() - TimeGMT()); // サーバーGMTオフセット
PrintFormat("夏時間シフト: %d秒 サーバーGMTオフセット: %d時間",
dstShift, serverGmtOff / 3600);
// サーバー時間→JST変換
datetime jst = ServerToJST(TimeCurrent());
Print("JST: ", TimeToString(jst, TIME_DATE | TIME_SECONDS));
}多くのFXブローカーのサーバー時間はGMT+2(冬時間)/ GMT+3(夏時間)です。JSTとの時差は6〜7時間です。仲値(9:55 JST)を狙うEAを作る場合、サーバー時間との変換が必須です。
MQL4との比較
| MQL4 | MQL5 |
|---|---|
| TimeCurrent() | TimeCurrent()(同じ) |
| TimeLocal() | TimeLocal()(同じ) |
| TimeGMT() | TimeGMT()(同じ) |
| Year(), Month(), Day() | MqlDateTime構造体で取得 |
| Hour(), Minute(), Seconds() | MqlDateTime構造体で取得 |
| DayOfWeek() | MqlDateTime.day_of_week |
| DayOfYear() | MqlDateTime.day_of_year |
| TimeToStr() | TimeToString() |
| StrToTime() | StringToTime() |
| iBarShift() | iBarShift()(MQL5 build 2085+で追加) |
プロが開発したEAをお探しの方は → シストレ.COM EA一覧





