VPSの時計とEAの時刻|TimeCurrentは影響なし、TimeLocalはずれる

VPSのWindowsの時計がずれていても、EAが取引サーバーの時刻(TimeCurrent)だけを使っているなら、影響は受けません。MQL5リファレンスによると、TimeCurrentは取引サーバー上で作られる時刻で、PCの時計の設定に依存しないためです。一方で、TimeLocal・TimeGMT・TimeTradeServer はPCの時計を使います。これらで時間を判断するEA(決まった時刻に決済する、など)は、VPSの時計やタイムゾーンがずれると、予定と違う時刻に動きます。

この記事では、時刻の関数ごとの違い、VPSの時計を確かめて合わせる方法(w32tm)、EAで確かめるスクリプトをまとめます。

(確認:MQL5リファレンス「TimeCurrent」「TimeLocal」「TimeGMT」「TimeTradeServer」、Microsoft Learn「Windows タイム サービスのツールと設定」。サンプルは MetaEditor で 0エラー・0警告でコンパイル確認。確認日:2026年10月10日。VPS上での実行結果は、この記事では確認していません)

関数ごとに、何の時計を使うか

関数 返す時刻(MQL5リファレンス) VPSの時計の影響
TimeCurrent() 最後に受け取った相場の時刻(取引サーバーで作られる) 受けない
TimeTradeServer() 取引サーバーの現在時刻を、クライアント側で計算したもの 受ける(PCの時計の設定に依存)
TimeLocal() MT5が動いているコンピューターのローカル時刻 受ける
TimeGMT() PCのローカル時刻から、夏時間の切り替えも考えて計算したGMT 受ける(時計とタイムゾーンの両方)

TimeCurrentは、相場が動かない週末や休場中には進みません(最後に受け取った相場の時刻のため)。「今の時刻」として使う時は、この点も考えます(週末・休場中にEAが動かない?)。時刻の種類と使い分けの考え方はMT5の時刻がずれる理由に詳しく書いています。

VPSで起きやすいずれ

  • タイムゾーンが日本ではない:VPSのWindowsのタイムゾーンが日本以外に設定されていると、TimeLocalは日本時間ではありません。日本時間を前提にTimeLocalで時刻を判断するEAは、何時間もずれます
  • 時計そのものがずれている:時刻の同期がうまくいっていないと、数秒〜数分ずれることがあります。TimeTradeServerやTimeLocalで「○時ちょうど」に動かす処理に効きます

VPSの時計を確かめる・合わせる(w32tm)

Windowsの時刻の同期は、「Windows Time」サービス(W32Time)が行います。Microsoft Learnに載っているw32tmコマンドで、状態の確認と再同期ができます。コマンドプロンプト(再同期は管理者として実行)で使います。

コマンド わかること・すること(Microsoft Learn)
w32tm /query /source 時刻の取得元(タイムソース)を表示する
w32tm /query /status W32Timeの状態を表示する
w32tm /resync 蓄積したエラー統計を消して、すぐに時刻を再同期するよう指示する

Microsoft Learnによると、ドメインに参加していないコンピューター(個人で借りるVPSの多く)の、時刻の取得先の既定値はtime.windows.comです。また、NTPのクライアントは、送信元のポートにUDP 123を使います。VPSのファイアウォールでこの通信が止められていると、同期できない場合があります。

筆者のPCで起きたこと

筆者のPCでw32tm /query /statusを実行すると、エラー0x80070426(サービスが動いていない)になりました。Windows Timeサービスの状態を見ると「停止」・スタートアップの種類は「手動」でした。このように、サービスが止まっていると、状態の確認や再同期のコマンドは使えません。サービスの状態は、「サービス」(services.msc)の「Windows Time」で確かめられます。サービスが止まっている時にWindowsが別の仕組みで時刻を合わせているかどうかは、この記事では確認していません。

EAで確かめるスクリプト

次のスクリプトは、4つの時刻と、TimeTradeServerとTimeCurrentの差を表示します。VPSのMT5で、相場が動いている時間に実行すると、時計のずれの目安になります。

void OnStart()
  {
   datetime server = TimeCurrent();      // 取引サーバーの時刻(最後に受けた相場の時刻)
   datetime est    = TimeTradeServer();  // PCの時計から計算した、サーバーの現在時刻
   datetime local  = TimeLocal();        // PC(VPS)の時計
   datetime gmt    = TimeGMT();          // PCの時計とタイムゾーンから計算したGMT

   PrintFormat("TimeCurrent     : %s", TimeToString(server, TIME_DATE | TIME_SECONDS));
   PrintFormat("TimeTradeServer : %s", TimeToString(est, TIME_DATE | TIME_SECONDS));
   PrintFormat("TimeLocal       : %s", TimeToString(local, TIME_DATE | TIME_SECONDS));
   PrintFormat("TimeGMT         : %s", TimeToString(gmt, TIME_DATE | TIME_SECONDS));
   PrintFormat("TimeTradeServer - TimeCurrent = %d 秒", (int)(est - server));
  }

相場が活発に動いている時間なら、TimeCurrentは最新のティックの時刻なので、差が数秒以内なら、時計はおおむね合っていると読めます。差が大きい時は、VPSの時計かタイムゾーンを確かめます。相場が止まっている時間は、TimeCurrentが進まないため、この比較は使えません。出力の見方はMQL5のPrintとログの保存場所を参照してください。

EAを作る・選ぶ時の考え方

  • 取引時間の判断は、TimeCurrent(または TimeTradeServer)で、サーバー時刻を基準に書くと、VPSのタイムゾーンの影響を受けにくい
  • 決まった時刻に決済するEAは、どの時刻を基準にしているかを、説明書やコードで確かめる(時間で決済する考え方はMT5で決済だけを自動化する方法)
  • 一定間隔で処理するタイマー(OnTimer)は、時刻ではなく間隔で動く(MQL5で一定時間ごとに処理する方法)

まとめ

  • TimeCurrentはサーバーの時刻で、VPSの時計の影響を受けない。TimeLocal・TimeGMT・TimeTradeServerは受ける
  • VPSの時計はw32tm /query /statusで確かめ、w32tm /resyncで再同期する。サービスが止まっているとコマンドは使えない
  • VPSのタイムゾーンが日本でないと、TimeLocalで時刻を判断するEAはずれる。基準をサーバー時刻にすると影響を受けにくい

本記事はプログラミングと設定の説明であり、特定の売買を推奨するものではありません。