MQL5 TimeCurrentの使い方|サーバー時間・EA稼働時間判定の確認
MQL5でEAの稼働時間、停止時間、曜日判定、外部連携、ログ出力を作る時は、現在時刻の扱いを明確にしておく必要があります。
TimeCurrentは、MQL5でサーバー時間を確認する時によく使う関数です。ただし、TimeCurrentは単純なPC現在時刻ではなく、最後に受信した気配値のサーバー時刻を返す関数です。
EAが指定時間に動かない、バックテストとリアル環境で時刻判定が違う、OnTimerで時刻が更新されないように見える、サーバー時間と日本時間を混同する、といった問題は、TimeCurrent、TimeTradeServer、TimeLocal、TimeToStructの役割を分けて確認すると原因を追いやすくなります。
このページでは、MQL5のTimeCurrentの使い方を、サーバー時間、OnTick / OnTimerでの違い、EA稼働時間判定、TimeToStruct、StructToTime、ログ確認の観点から整理します。
なお、このページはMQL5開発における技術確認を目的とした内容です。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証を行うものではありません。
- TimeCurrentとは何か
- TimeCurrentで確認できること
- TimeCurrentとTimeTradeServerの違い
- OnTickとOnTimerでのTimeCurrentの違い
- TimeToStructで時分・曜日を取り出す
- EA稼働時間を判定する基本
- 曜日判定の基本
- 日本時間に変換する時の注意点
- TimeCurrentをログへ出す
- SymbolInfoSessionTradeと取引セッション
- 外部連携や通知で使う時の注意点
- バックテストでの確認ポイント
- よくある失敗パターン
- ログ出力例
- TimeCurrentとあわせて確認したいバー時刻・価格取得
- 関連ページ
- 時刻データとEA稼働時間をあわせて確認する場合
- 開発依頼前に整理したい情報
- まとめ
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稼働時間判定に使う場合は注意が必要です。 |
| TimeGMT | GMT時刻を確認するために使います。 | サーバー時間や日本時間とは別に扱います。 |
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_time | TimeCurrentで確認する時刻 | EA内部の稼働判定基準にしやすい |
| local_time | TimeLocalで確認する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、判定結果ログを合わせて確認してください。
まとめ
TimeCurrentは、MQL5で最後に受信した気配値のサーバー時刻を確認するための関数です。
OnTick内では処理中tickの時刻として扱いやすい一方、OnTimerやOnInitでは最後に受信した気配値時刻として見る必要があります。
EAの稼働時間、停止時間、曜日判定、日付切り替え、外部連携、ログ出力では、TimeCurrent、TimeTradeServer、TimeLocalを混同しないことが重要です。
時間判定を実装する場合は、サーバー時間基準なのか、日本時間基準なのかを明確にし、TimeToStruct、day_of_week、日またぎ判定、SymbolInfoSessionTrade、ログ確認をセットで整理してください。
