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はずれる。基準をサーバー時刻にすると影響を受けにくい
本記事はプログラミングと設定の説明であり、特定の売買を推奨するものではありません。


