技術辞典

MQL5 TimeCurrentの使い方|サーバー時間・EA稼働時間判定の確認

EAファンクラブ

MQL5でEAの稼働時間、停止時間、曜日判定、外部連携、ログ出力を作る時は、現在時刻の扱いを明確にしておく必要があります。

TimeCurrentは、MQL5でサーバー時間を確認する時によく使う関数です。ただし、TimeCurrentは単純なPC現在時刻ではなく、最後に受信した気配値のサーバー時刻を返す関数です。

EAが指定時間に動かない、バックテストとリアル環境で時刻判定が違う、OnTimerで時刻が更新されないように見える、サーバー時間と日本時間を混同する、といった問題は、TimeCurrent、TimeTradeServer、TimeLocal、TimeToStructの役割を分けて確認すると原因を追いやすくなります。

このページでは、MQL5のTimeCurrentの使い方を、サーバー時間、OnTick / OnTimerでの違い、EA稼働時間判定、TimeToStruct、StructToTime、ログ確認の観点から整理します。

なお、このページはMQL5開発における技術確認を目的とした内容です。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証を行うものではありません。

TimeCurrentとは何か

TimeCurrentは、MQL5で最後に確認できているサーバー時間をdatetime型で返す関数です。

OnTick内で呼ぶ場合は、処理中のtickの時刻として扱えます。一方、OnInit、OnTimer、OnDeinitなどで呼ぶ場合は、Market Watch内で最後に受信した気配値の時刻として扱われます。

void OnTick()
{
   datetime now = TimeCurrent();

   PrintFormat("[TIME_CURRENT] now=%s",
               TimeToString(now, TIME_DATE|TIME_SECONDS));
}

TimeCurrentは、EAの時間判定でよく使いますが、「PCの現在時刻」ではありません。サーバー時間を基準にEAを動かす時に使う関数として理解してください。

TimeCurrentで確認できること

TimeCurrentは、EAの実務では、稼働時間、停止時間、曜日、日付、ログ時刻、外部連携の更新間隔などで使います。

用途確認内容注意点
EA稼働時間判定現在のサーバー時刻が稼働時間内か確認する日本時間ではなく、サーバー時間基準で確認します。
曜日判定月曜から金曜までなど、曜日条件を確認するTimeToStructでday_of_weekを確認します。
日付切り替え日次損益、日次停止、日次リセットを確認するサーバー日付の切り替わりを基準にするか決めます。
外部連携の間隔制御WebRequestや通知の送信間隔を確認するOnTimerと組み合わせてthrottleします。
ログ出力Expertsログに時刻を残すserver_time、local_timeを分けると確認しやすくなります。
バックテスト確認Strategy Tester上の時刻判定を確認するリアル環境との差をログで確認します。

EAの時間判定では、どの時間を基準にしているのかを明確にしてください。サーバー時間、日本時間、PCローカル時間を混同すると、稼働時間や停止時間の判定がずれる場合があります。

TimeCurrentとTimeTradeServerの違い

TimeCurrentとTimeTradeServerは、どちらも取引サーバー時刻に関係しますが、取得の考え方が異なります。

関数意味注意点
TimeCurrent最後に受信した気配値のサーバー時刻を返します。OnTick以外では、最後に受信した気配値時刻として見る必要があります。
TimeTradeServerクライアント端末側で計算した現在の取引サーバー時刻を返します。PC側の時刻設定の影響を受ける可能性があります。
TimeLocalクライアント端末を動かしているPCのローカル時刻を返します。サーバー時間ではないため、EA稼働時間判定に使う場合は注意が必要です。
TimeGMTGMT時刻を確認するために使います。サーバー時間や日本時間とは別に扱います。

EAの売買判定や稼働時間判定では、原則としてサーバー時間を基準にする方が確認しやすくなります。PCローカル時間を使う場合は、VPSやPC環境差を考慮してください。

OnTickとOnTimerでのTimeCurrentの違い

TimeCurrentは、呼び出すイベントによって確認の意味が変わります。

OnTick内では、そのtickを処理している時刻として扱いやすい一方、OnTimerでは必ずしも毎秒更新され続ける時刻ではありません。最後にMarket Watchで受信した気配値の時刻として見る必要があります。

呼び出し場所TimeCurrentの見方確認ポイント
OnTick処理中tickのサーバー時刻entry判定、決済判定、同一バー制御に使いやすい
OnTimer最後に受信した気配値のサーバー時刻tickが少ない時間帯では更新頻度に注意する
OnInit初期化時点で最後に分かっているサーバー時刻起動ログとして記録する
OnDeinit終了時点で最後に分かっているサーバー時刻終了ログとして記録する

OnTimerで「現在時刻が進まない」と見える場合は、TimeCurrentの仕様と、対象銘柄やMarket Watchのtick受信状態を確認してください。

TimeToStructで時分・曜日を取り出す

EAの稼働時間や曜日判定では、TimeCurrentで取得したdatetimeをMqlDateTimeへ変換すると扱いやすくなります。

bool GetServerTimeStruct(MqlDateTime &t)
{
   datetime now = TimeCurrent();

   if(!TimeToStruct(now, t))
   {
      PrintFormat("[TIME_TO_STRUCT_NG] now=%s",
                  TimeToString(now, TIME_DATE|TIME_SECONDS));
      return false;
   }

   PrintFormat("[SERVER_TIME_STRUCT] year=%d mon=%d day=%d hour=%d min=%d sec=%d day_of_week=%d",
               t.year,
               t.mon,
               t.day,
               t.hour,
               t.min,
               t.sec,
               t.day_of_week);

   return true;
}

MqlDateTimeでは、hour、min、sec、day_of_weekなどを使って、稼働時間や曜日条件を判定できます。

EA稼働時間を判定する基本

EAの稼働時間を判定する場合は、TimeCurrentをTimeToStructで分解し、現在時刻を分単位に変換すると確認しやすくなります。

bool IsWithinServerTimeRange(const int start_hour,
                             const int start_min,
                             const int end_hour,
                             const int end_min)
{
   MqlDateTime t;

   if(!TimeToStruct(TimeCurrent(), t))
      return false;

   int now_min   = t.hour * 60 + t.min;
   int start_min_total = start_hour * 60 + start_min;
   int end_min_total   = end_hour * 60 + end_min;

   bool allowed = false;

   if(start_min_total <= end_min_total)
   {
      allowed = (start_min_total <= now_min && now_min <= end_min_total);
   }
   else
   {
      allowed = (now_min >= start_min_total || now_min <= end_min_total);
   }

   PrintFormat("[TIME_GATE] server_time=%02d:%02d start=%02d:%02d end=%02d:%02d allowed=%s",
               t.hour,
               t.min,
               start_hour,
               start_min,
               end_hour,
               end_min,
               (allowed ? "true" : "false"));

   return allowed;
}

日またぎの稼働時間を扱う場合は、開始時刻が終了時刻より後になるケースを考慮してください。例えば、22:00〜02:00のような設定では、同じ日の範囲判定だけでは正しく判定できません。

曜日判定の基本

MqlDateTimeのday_of_weekを使うと、曜日を確認できます。

EAの曜日停止、金曜停止、月曜開始制限などを作る時は、曜日番号をログへ出すと確認しやすくなります。

bool IsAllowedDay()
{
   MqlDateTime t;

   if(!TimeToStruct(TimeCurrent(), t))
      return false;

   bool allowed = true;

   if(t.day_of_week == 0)
      allowed = false;

   if(t.day_of_week == 6)
      allowed = false;

   PrintFormat("[DAY_GATE] day_of_week=%d allowed=%s",
               t.day_of_week,
               (allowed ? "true" : "false"));

   return allowed;
}

曜日判定は、サーバー時間基準で行われます。日本時間の曜日で判定したい場合は、時差変換の仕様を別途決める必要があります。

日本時間に変換する時の注意点

EA利用者向けには「日本時間で何時から何時まで」と説明したくなる場合があります。

ただし、EA内部のTimeCurrentはサーバー時間です。サーバー時間と日本時間の差は、ブローカー、サーバー設定、夏時間、時期によって変わる場合があります。

確認項目内容注意点
server_timeTimeCurrentで確認する時刻EA内部の稼働判定基準にしやすい
local_timeTimeLocalで確認するPC時刻VPSやPCの設定に依存する
JST換算日本時間として表示したい時刻固定時差でよいか、夏時間を考慮するか決める
入力設定Inputsをサーバー時間にするか日本時間にするかユーザー説明とログを一致させる

配布用EAでは、入力欄がサーバー時間基準なのか、日本時間基準なのかを明記してください。ログにもserver_timeと基準を出しておくと、問い合わせ時に確認しやすくなります。

TimeCurrentをログへ出す

EAの時間判定を確認するには、TimeCurrentをログへ出すことが重要です。

時刻だけでなく、判定結果、稼働開始時刻、稼働終了時刻、曜日、時間基準をセットで出すと原因を追いやすくなります。

void PrintTimeGateLog(const bool allowed,
                      const string reason)
{
   datetime server_time = TimeCurrent();
   datetime trade_time  = TimeTradeServer();
   datetime local_time  = TimeLocal();

   PrintFormat("[TIME_GATE_LOG] server_time=%s trade_server_time=%s local_time=%s allowed=%s reason=%s",
               TimeToString(server_time, TIME_DATE|TIME_SECONDS),
               TimeToString(trade_time, TIME_DATE|TIME_SECONDS),
               TimeToString(local_time, TIME_DATE|TIME_SECONDS),
               (allowed ? "true" : "false"),
               reason);
}

server_time、trade_server_time、local_timeを一度に出すと、時刻基準の混同を見つけやすくなります。ただし、通常運用で毎tick出すとログが多くなるため、状態変化時や一定間隔に抑えてください。

SymbolInfoSessionTradeと取引セッション

銘柄ごとの取引時間を確認したい場合は、SymbolInfoSessionTradeを使って取引セッションの開始・終了時刻を確認できます。

EAの稼働時間設定と、銘柄自体の取引可能時間は別です。EA側の時間設定では許可されていても、銘柄の取引セッション外であれば注文できない場合があります。

void PrintTradeSession(const string symbol)
{
   MqlDateTime t;
   TimeToStruct(TimeCurrent(), t);

   datetime from = 0;
   datetime to   = 0;

   if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)t.day_of_week, 0, from, to))
   {
      PrintFormat("[SESSION_TRADE_NG] symbol=%s day=%d last_error=%d",
                  symbol,
                  t.day_of_week,
                  GetLastError());
      return;
   }

   PrintFormat("[SESSION_TRADE] symbol=%s day=%d from=%s to=%s",
               symbol,
               t.day_of_week,
               TimeToString(from, TIME_MINUTES),
               TimeToString(to, TIME_MINUTES));
}

取引時間外の注文エラーを調査する場合は、EAの稼働時間設定だけでなく、銘柄の取引セッション、サーバー時間、Journalログを合わせて確認してください。

外部連携や通知で使う時の注意点

TimeCurrentは、WebRequest、Discord通知、Google Sheets連携、CSV出力などでも使います。

外部連携では、いつ取得した情報なのか、いつ送信した情報なのかをログへ残す必要があります。

処理TimeCurrentの使い方注意点
Discord通知通知発生時刻としてserver_timeを入れる日本時間表示が必要なら別途変換する
Google Sheets連携最終更新時刻、取得時刻、送信時刻を記録するシート側のタイムゾーンと混同しない
CSV出力ログ行の時刻として記録するserver_timeとlocal_timeのどちらかを明記する
外部制御取得取得間隔や反映時刻を管理するOnTimerと組み合わせてthrottleする

外部シートや通知先では、日本時間で見たい場合があります。その場合でも、EA内部の判定基準がサーバー時間なのか、変換後時刻なのかを分けてください。

バックテストでの確認ポイント

Strategy TesterでTimeCurrentを使う場合は、テスト中のサーバー時刻として確認します。

リアル環境とはtickの入り方、OnTimerの呼ばれ方、外部連携ON/OFF、ログ量が異なる場合があります。時間判定を検証する時は、テスター用のログを用意すると確認しやすくなります。

確認項目内容ログ例
テスト時刻TimeCurrentの値BT_TIME_CURRENT
稼働時間判定指定時間内かどうかBT_TIME_GATE
曜日判定day_of_weekの確認BT_DAY_GATE
日またぎ22:00〜02:00などの範囲BT_TIME_RANGE_WRAP
ログ量毎tick出しすぎていないかLOG_THROTTLE

バックテストでは、時間判定ログを出しすぎると検証が重くなります。NG時、状態変化時、または一定間隔だけに絞ると確認しやすくなります。

よくある失敗パターン

失敗パターン問題点確認方法
日本時間のつもりでサーバー時間を入力するEAの稼働時間がずれるInputsの基準時刻を明記し、server_timeをログへ出す
TimeLocalで稼働時間を判定するVPSやPC設定により結果が変わる場合があるTimeCurrent基準にするか、ローカル基準にするかを仕様化する
OnTimerでTimeCurrentが進まないと誤解するtick受信状態により最後の気配値時刻が変わりにくい場合があるOnTickとOnTimerのログを分ける
日またぎ時間を通常判定する22:00〜02:00のような範囲が正しく判定できないstart > end のケースを分岐する
曜日番号を確認しない週末停止や金曜停止がずれるday_of_weekをログへ出す
銘柄の取引セッションを見ないEA時間では許可でも注文できない場合があるSymbolInfoSessionTradeとJournalログを確認する
ログに時刻基準を書かないサーバー時間か日本時間か分からなくなるserver_time、local_time、time_basisを併記する

ログ出力例

[TIME_INIT] server_time=2026.05.26 10:15:00 local_time=2026.05.26 16:15:00 basis=SERVER
[TIME_GATE] server_time=10:15 start=09:00 end=23:00 allowed=true
[DAY_GATE] day_of_week=2 allowed=true
[SESSION_TRADE] symbol=GOLD day=2 from=01:05 to=23:55
[TIME_GATE_LOG] server_time=2026.05.26 10:15:00 trade_server_time=2026.05.26 10:15:01 local_time=2026.05.26 16:15:01 allowed=true reason=within_server_time_range
[LOG_THROTTLE] category=TIME_GATE interval_sec=300 reason=skip_duplicate_state

ログ例の時刻や時差は確認用です。実際のサーバー時間、ローカル時間、取引セッションは、口座環境、ブローカー、銘柄、VPS設定によって変わります。

TimeCurrentとあわせて確認したいバー時刻・価格取得

TimeCurrentでサーバー時間やEA稼働時間を確認する場合は、バー時刻や価格取得のタイミングも分けて確認します。現在時刻、バー時刻、確定足の値を混同しないように整理してください。

確認したい内容関連ページ確認ポイント
バー時刻と新バー判定MQL5 CopyTimeの使い方バー開始時刻、新バー判定、同一バー制御、確定足確認を整理します。
OHLCとバー情報MQL5 CopyRatesの使い方OHLC、出来高、スプレッド、バー時刻をまとめて取得する方法を確認します。
時系列・価格取得関数MQL5時系列・価格取得関数辞典TimeCurrent、CopyTime、CopyRates、CopyClose、iCloseの使い分けを確認します。

関連ページ

TimeCurrentは、EA稼働時間、外部連携、ログ確認、時系列データ、バックテスト確認と合わせて整理すると理解しやすくなります。

関連ページ確認できること
経済指標・取引時間・時間帯とはEA稼働時間や経済指標前後の停止確認
MQL5関数辞典TimeCurrent、CopyTime、SymbolInfo系など主要関数の全体確認
MQL5イベント処理完全ガイドOnTick、OnTimer、OnInitなどイベントごとの処理整理
MQL5デバッグ・ログファースト開発完全ガイド時刻ログ、Expertsログ、再現条件の整理
MT5のログ確認方法ExpertsログとJournalログの確認方法

時刻データとEA稼働時間をあわせて確認する場合

TimeCurrentは、MQL5でサーバー時間を確認する時によく使う関数です。EAの稼働時間、曜日判定、日付切り替え、ログ時刻、外部連携の更新間隔を整理する場合は、時系列データ全体やEA稼働時間の基本もあわせて確認してください。

確認したいこと確認するページ主な確認内容
MQL5の時刻・時系列データ全体を確認したいMQL5時系列データ・価格取得完全ガイドCopyTime、CopyRates、CopyClose、TimeCurrent、バー時刻、価格データの確認
EAの稼働時間やサーバー時間の基本を確認したいEAの稼働時間とは稼働時間、停止時間、サーバー時間、日本時間との違い、設定確認

時間判定を確認する時は、TimeCurrent、TimeTradeServer、TimeLocalを混同しないようにしてください。ログでは、server_time、local_time、判定時間、曜日、allowed判定を分けて出すと原因を追いやすくなります。

開発依頼前に整理したい情報

TimeCurrentやEA稼働時間判定、サーバー時間のずれを相談する場合は、次の情報を整理してください。

整理する情報確認内容
対象EA新規EA、既存EA改修、時間フィルター追加、不具合調査のどれか
時刻基準サーバー時間、日本時間、PCローカル時間のどれで判定したいか
稼働時間開始時刻、終了時刻、日またぎ有無
曜日設定稼働曜日、停止曜日、金曜停止、週明け開始制限など
対象銘柄GOLD / XAUUSD、USDJPY、CFD、suffix付き銘柄など
取引セッション銘柄の取引可能時間、休場時間、メンテナンス時間
外部連携Discord通知、Google Sheets連携、CSV出力で使う時刻
バックテスト条件検証期間、銘柄、時間足、TimeCurrentログ、OnTimer有無
ログserver_time、local_time、TimeTradeServer、TIME_GATE、DAY_GATE、Journalログ

時間判定の不具合を相談する場合は、設定値だけでなく、EAが実際に出したserver_time、local_time、判定結果ログを合わせて確認してください。

MT4/MT5の開発・改修相談はこちら

まとめ

TimeCurrentは、MQL5で最後に受信した気配値のサーバー時刻を確認するための関数です。

OnTick内では処理中tickの時刻として扱いやすい一方、OnTimerやOnInitでは最後に受信した気配値時刻として見る必要があります。

EAの稼働時間、停止時間、曜日判定、日付切り替え、外部連携、ログ出力では、TimeCurrent、TimeTradeServer、TimeLocalを混同しないことが重要です。

時間判定を実装する場合は、サーバー時間基準なのか、日本時間基準なのかを明確にし、TimeToStruct、day_of_week、日またぎ判定、SymbolInfoSessionTrade、ログ確認をセットで整理してください。

ABOUT ME
記事URLをコピーしました