MQL5 時間・日付関数 完全ガイド|TimeCurrent・MqlDateTime・取引時間フィルター

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との比較

MQL4MQL5
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+で追加)

MQL4のYear()Month()Day()Hour()等の関数はMQL5には存在しません。代わりにMqlDateTime構造体を使って年月日時分秒を取得してください。

プロが開発したEAをお探しの方は → シストレ.COM EA一覧

シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら
【FX自動売買】システムトレード完全ガイド|Forex Guide

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!
目次