MQL4 時間・日付関数リファレンス|Year・Hour・TimeCurrent・iBarShift・五当日判定

MQL4の時間・日付関数を体系的にまとめました。Year()・Month()・Day()・DayOfWeek()・Hour()・Minute()による日時要素の取得、TimeCurrent()・TimeLocal()・TimeGMT()によるサーバー時刻・ローカル時刻・GMT時刻の使い分け、TimeToStr()・StrToTime()による文字列変換、iBarShift()によるバーインデックス検索、五当日判定、取引セッションフィルター、夏時間対応まで、MT4 EA開発に必要な時間処理のすべてをコード付きで解説します。

MQL4 日時関数 リファレンスカード
目次

MQL4とMQL5の時間関数の違い

機能MQL4MQL5
年の取得Year()MqlDateTime構造体を使用
月の取得Month()MqlDateTime.mon
曜日の取得DayOfWeek()MqlDateTime.day_of_week
時刻の取得Hour(), Minute()MqlDateTime.hour, MqlDateTime.min
文字列変換TimeToStr()TimeToString()
バー検索iBarShift()Bars() + ループ
datetime型4バイト整数(1970年基準)同じ(8バイトだが互換性あり)

MQL4ではYear()、Month()、Hour()など直感的な関数で日時要素を取得できます。MQL5ではMqlDateTime構造体に変換してからメンバーを参照する方式に変わり、コードがやや冗長になります。

datetime型の基本

MQL4のdatetime型は、1970年1月1日0時0分0秒(Unix Epoch)からの経過秒数を格納する整数型です。

void DatetimeBasics()
  {
   // datetime リテラル
   datetime dt1 = D'2024.01.15 09:30:00';
   datetime dt2 = D'2024.12.31';  // 時刻省略=00:00:00

   // 現在時刻
   datetime serverTime = TimeCurrent();  // サーバー時刻
   datetime localTime  = TimeLocal();    // PCのローカル時刻
   datetime gmtTime    = TimeGMT();      // GMT/UTC時刻

   Print("サーバー時刻:", TimeToStr(serverTime, TIME_DATE|TIME_SECONDS));
   Print("ローカル時刻:", TimeToStr(localTime, TIME_DATE|TIME_SECONDS));
   Print("GMT時刻:", TimeToStr(gmtTime, TIME_DATE|TIME_SECONDS));

   // 日時の差(秒単位)
   int diffSeconds = (int)(dt2 - dt1);
   int diffDays    = diffSeconds / 86400;
   Print("日数差:", diffDays,"日");
  }

日時要素取得関数

関数戻り値範囲説明
Year()int1970-最後のティックの年
Month()int1-12
Day()int1-31
DayOfWeek()int0-6曜日(0=日曜)
DayOfYear()int1-366年初からの日数
Hour()int0-23
Minute()int0-59
Seconds()int0-59
注意

Year()、Month()、Hour()等は最後にティックを受信した時刻(サーバー時刻基準)を返します。バックテスト中はシミュレーション時刻が返ります。特定のdatetimeの要素を取得したい場合は、TimeYear()、TimeMonth()、TimeHour()等を使います。

特定datetimeの要素取得

関数説明
TimeYear(datetime)指定datetimeの年
TimeMonth(datetime)指定datetimeの月
TimeDay(datetime)指定datetimeの日
TimeDayOfWeek(datetime)指定datetimeの曜日
TimeDayOfYear(datetime)指定datetimeの年初からの日数
TimeHour(datetime)指定datetimeの時
TimeMinute(datetime)指定datetimeの分
TimeSeconds(datetime)指定datetimeの秒
void PrintBarInfo(int barIndex)
  {
   datetime barTime = Time[barIndex];

   Print("バー[", barIndex,"] の時刻:", TimeToStr(barTime, TIME_DATE|TIME_MINUTES));
   Print("  年:", TimeYear(barTime));
   Print("  月:", TimeMonth(barTime));
   Print("  日:", TimeDay(barTime));
   Print("  曜日:", TimeDayOfWeek(barTime)," (0=日, 1=月, ... 5=金)");
   Print("  時:", TimeHour(barTime));
   Print("  分:", TimeMinute(barTime));
  }

TimeToStr / StrToTime:文字列変換

string TimeToStr(
   datetime value,    // 変換するdatetime
   int      mode = TIME_DATE|TIME_MINUTES  // 表示フォーマット
);
// mode: TIME_DATE(日付), TIME_MINUTES(時分), TIME_SECONDS(時分秒)

datetime StrToTime(
   string value  //"yyyy.mm.dd hh:mi" 形式の文字列
);
// 戻り値: 対応するdatetime
void TimeStringExamples()
  {
   datetime now = TimeCurrent();

   // 各フォーマット
   Print(TimeToStr(now, TIME_DATE));               //"2024.06.15"
   Print(TimeToStr(now, TIME_MINUTES));             //"14:30"
   Print(TimeToStr(now, TIME_SECONDS));             //"14:30:45"
   Print(TimeToStr(now, TIME_DATE|TIME_MINUTES));   //"2024.06.15 14:30"
   Print(TimeToStr(now, TIME_DATE|TIME_SECONDS));   //"2024.06.15 14:30:45"

   // 文字列からdatetimeに変換
   datetime dt = StrToTime("2024.06.15 09:30");
   Print("変換結果:", TimeToStr(dt, TIME_DATE|TIME_SECONDS));
  }
サーバー時刻に関する主要な注意
  • MT4のサーバー時刻はブローカーによって異なる(GMT+2, GMT+3が多い)
  • 日本時間を計算するには(Hour() - GMTOffset + 9 + 24) % 24とする
  • 夏時間の切り替え時はGMTオフセットが1時間変わる(年2回)
  • バックテストではサーバー時刻がシミュレートされるため、TimeLocal()は使えない
  • TimeCurrent()は最後のティック受信時刻。市場が閉まると更新されなくなる
サーバー時刻に関する主要な注意
  • MT4のサーバー時刻はブローカーによって異なる(GMT+2, GMT+3が多い)
  • 日本時間を計算するには(Hour() - GMTOffset + 9 + 24) % 24とする
  • 夏時間の切り替え時はGMTオフセットが1時間変わる(年2回)
  • バックテストではサーバー時刻がシミュレートされるため、TimeLocal()は使えない
  • TimeCurrent()は最後のティック受信時刻。市場が閉まると更新されなくなる

iBarShift:バーインデックスの検索

int iBarShift(
   string   symbol,     // 通貨ペア
   int      timeframe,  // 時間軸
   datetime time,       // 検索する時刻
   bool     exact = false  // 完全一致のみか
);
// 戻り値: バーインデックス(見つからない場合は-1)
void BarShiftExamples()
  {
   // 昨日の始値を取得
   datetime yesterday = TimeCurrent() - 86400;
   int barIndex = iBarShift(NULL, PERIOD_D1, yesterday);
   if(barIndex >= 0)
      Print("昨日の始値:", iOpen(NULL, PERIOD_D1, barIndex));

   // 特定時刻のバーを検索
   datetime targetTime = StrToTime("2024.06.15 10:00");
   int bar = iBarShift(NULL, PERIOD_H1, targetTime, true);
   if(bar >= 0)
      Print("指定時刻のバー:", bar);
   else
      Print("完全一致するバーなし");
  }

実践: 五当日(ゴトー日)判定

五当日(ゴトー日)は日本の輸出企業がドル買い需要を出す日として知られ、仲値(9:55前後)に向けてドル円が上昇しやすいアノマリーがあります。ただし100%ではなく、重要指標や地政学リスクの日は標準と異なる動きになります。

五当日とは、毎月5日・10日・15日・20日・25日・月末日のことで、輸出企業のドル売り需要から為替が動きやすいとされています。

bool IsGotobi()
  {
   int day = Day();

   // 5の倍数の日
   if(day % 5 == 0)
      return true;

   // 月末日の判定
   int month = Month();
   int year  = Year();
   int lastDay;

   if(month == 2)
      lastDay = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 29 : 28;
   else if(month == 4 || month == 6 || month == 9 || month == 11)
      lastDay = 30;
   else
      lastDay = 31;

   if(day == lastDay)
      return true;

   return false;
  }

// 五当日が土日の場合、前営業日に振替
bool IsGotobiAdjusted()
  {
   // 金曜日かつ翌日/翌々日が五当日 → 振替
   if(DayOfWeek() == 5)
     {
      int nextDay = Day() + 1;
      int nextNextDay = Day() + 2;
      if(nextDay % 5 == 0 || nextNextDay % 5 == 0)
         return true;
     }

   return IsGotobi() && DayOfWeek() >= 1 && DayOfWeek() <= 5;
  }

実践: 取引セッションフィルター

// サーバー時刻のGMTオフセットを設定(ブローカーにより異なる)
input int GMTOffset = 2;  // GMT+2(大半の海外ブローカー)

enum SESSION_TYPE
  {
   SESSION_TOKYO,     // 東京(GMT 0:00-9:00)
   SESSION_LONDON,    // ロンドン(GMT 7:00-16:00)
   SESSION_NEWYORK,   // ニューヨーク(GMT 12:00-21:00)
   SESSION_OVERLAP    // ロンドン-NY重複(GMT 12:00-16:00)
  };

bool IsInSession(SESSION_TYPE session)
  {
   int gmtHour = (Hour() - GMTOffset + 24) % 24;

   switch(session)
     {
      case SESSION_TOKYO:
         return (gmtHour >= 0 && gmtHour < 9);
      case SESSION_LONDON:
         return (gmtHour >= 7 && gmtHour < 16);
      case SESSION_NEWYORK:
         return (gmtHour >= 12 && gmtHour < 21);
      case SESSION_OVERLAP:
         return (gmtHour >= 12 && gmtHour < 16);
     }
   return false;
  }

// 仲値時間判定(日本時間9:55前後)
bool IsNakaneTime()
  {
   int jpHour   = (Hour() - GMTOffset + 9 + 24) % 24;
   int jpMinute = Minute();

   // 9:30〜10:00
   if(jpHour == 9 && jpMinute >= 30)
      return true;
   if(jpHour == 10 && jpMinute == 0)
      return true;

   return false;
  }

実践: 夏時間(DST)対応

// 米国夏時間(3月第2日曜〜11月第1日曜)
bool IsUSDST()
  {
   int month = Month();
   int day   = Day();
   int dow   = DayOfWeek();

   // 4月〜10月は確実に夏時間
   if(month > 3 && month < 11) return true;
   // 1月,2月,12月は確実に冬時間
   if(month < 3 || month > 11) return false;

   // 3月: 第2日曜以降
   if(month == 3)
     {
      int secondSunday = 14 - (TimeDayOfWeek(StrToTime(StringConcatenate(Year(),".03.01"))) % 7);
      if(secondSunday > 14) secondSunday -= 7;
      return (day >= secondSunday);
     }

   // 11月: 第1日曜まで
   if(month == 11)
     {
      int firstSunday = 7 - (TimeDayOfWeek(StrToTime(StringConcatenate(Year(),".11.01"))) % 7);
      if(firstSunday > 7) firstSunday -= 7;
      return (day < firstSunday);
     }

   return false;
  }

// GMTオフセットを動的に計算
int GetGMTOffset()
  {
   // 大半の海外ブローカー: 夏=GMT+3, 冬=GMT+2
   return IsUSDST() ? 3 : 2;
  }

実践: 新バー検出

bool IsNewBar()
  {
   static datetime lastBarTime = 0;
   datetime currentBarTime = Time[0];

   if(currentBarTime != lastBarTime)
     {
      lastBarTime = currentBarTime;
      return true;
     }

   return false;
  }

// 特定の時間軸の新バー検出
bool IsNewBar_TF(int timeframe)
  {
   static datetime lastBarTime = 0;
   datetime currentBarTime = iTime(NULL, timeframe, 0);

   if(currentBarTime != lastBarTime)
     {
      lastBarTime = currentBarTime;
      return true;
     }

   return false;
  }
新バー検出の注意点
  • static変数を使うことで、関数呼び出し間で値が保持される
  • 複数の時間軸を監視する場合、それぞれに別の新バー検出関数が必要
  • バックテストの「全ティック」モード以外(コントロールポイント等)では、ティックが間引かれるため新バー検出が正確でない場合がある
  • 日足の新バー検出は、東京時間の早朝(サーバー時刻の0時)に発生する
新バー検出の注意点
  • static変数を使うことで、関数呼び出し間で値が保持される
  • 複数の時間軸を監視する場合、それぞれに別の新バー検出関数が必要
  • バックテストの「全ティック」モード以外では、ティックが間引かれるため新バー検出が正確でない場合がある
  • 日足の新バー検出は、東京時間の早朝(サーバー時刻の0時)に発生する

時間・日付関数一覧(MQL5対応表)

MQL4関数MQL5対応説明
Year()MqlDateTime.year
Month()MqlDateTime.mon
Day()MqlDateTime.day
DayOfWeek()MqlDateTime.day_of_week曜日
Hour()MqlDateTime.hour
Minute()MqlDateTime.min
Seconds()MqlDateTime.sec
TimeCurrent()TimeCurrent()サーバー時刻
TimeLocal()TimeLocal()ローカル時刻
TimeGMT()TimeGMT()GMT時刻
TimeToStr()TimeToString()datetime→文字列
StrToTime()StringToTime()文字列→datetime
iBarShift()Bars() + ループで代替バーインデックス検索
TimeYear(dt)TimeToStruct() + MqlDateTime指定datetimeの年
TimeMonth(dt)TimeToStruct() + MqlDateTime指定datetimeの月
TimeHour(dt)TimeToStruct() + MqlDateTime指定datetimeの時

まとめ

MQL4の時間・日付関数はEA開発でのタイミング制御に不可欠です。特に主要なポイントは以下の通りです。

  • サーバー時刻はブローカーによって異なる:GMTオフセットを考慮して日本時間を計算する
  • 五当日・セッションフィルターで取引精度を上げる:時間帯による通貨ペアの動きの違いを活用
  • 新バー検出はstatic変数で実装する:ティックごとの無駄な処理を防ぐ
  • 夏時間の切り替えに対応する:年に2回GMTオフセットが変わることを忘れない

次のステップとして、MQLリファレンス総合ガイドでイベントハンドラやエラーハンドリングと組み合わせた堅牢なEA開発を学びましょう。

MQL4日時関数 よくある質問

MQL4の日時関数の基本は?

TimeCurrent()でサーバー現在時刻(datetime型)、TimeLocal()でローカル時刻を取得します。TimeToStr(time)で時刻を文字列に変換、StrToTime(str)で文字列をdatetimeに変換します。TimeDay()/TimeHour()/TimeMinute()で日付成分を取り出せます。

MQL4でdatetimeを分解する方法は?

TimeYear()/TimeMonth()/TimeDay()で年月日、TimeHour()/TimeMinute()/TimeSeconds()で時分秒を取得します。またはMqlDateTime構造体とTimeToStruct()を使って全成分を一度に取得できます。曜日はTimeDayOfWeek()で0(日曜)〜6(土曜)で取得できます。

MQL4でロンドン・NY時間を判定する方法は?

TimeCurrent()で現在のサーバー時刻を取得し、TimeHour()で時間を確認します。サーバー時刻はGMT±0やGMT+2など設定によって異なるため、ブローカーのサーバー時刻オフセットを考慮した時間判定が必要です。iTime(Symbol(),PERIOD_D1,0)でその日の開始時刻も取得できます。

MQL4で週末・祝日を判定する方法は?

TimeDayOfWeek(TimeCurrent())で0(日曜)か6(土曜)なら週末です。祝日は標準関数がないため、配列で祝日リストを管理して照合する実装が必要です。DayOfWeek()(現在のバーの曜日)も使用できます。

MQL4でタイマー処理を時刻条件で制御する方法は?

OnTimer()またはOnTick()内でTimeCurrent()の時刻成分(TimeHour/TimeMinute)を確認して処理を制御します。例:if(TimeHour(TimeCurrent()) >= 9 && TimeHour(TimeCurrent()) < 18)で9-18時のみ取引する設定が可能です。

MQL4とMQL5の日時関数の違いは?

MQL5ではTimeToString()/StringToTime()と関数名が変わり、MqlDateTime構造体とTimeToStruct()/StructToTime()が標準化されました。GetMicrosecondCount()による高精度タイマー計測もMQL5で追加されています。MQL4のTimeToStr()/StrToTime()はMQL4.56以降も使用可能です。

MQL4リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

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

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

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

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次