MT5の時刻がずれる理由|EAが見ている時刻は別物

MT5のチャートに出ている時刻は、日本時間ではなく取引サーバーの時刻です。多くの海外業者でGMT+2〜+3が使われており、日本時間とは6〜7時間ずれます。

ここまでは各社の解説にあります。この記事で扱うのはその先です。EAやインジケーターがコードの中で見る時刻は、チャートに出ている時刻とも、PCの時計とも違う場合があります。ここを取り違えると、時刻で動かす処理が発火しません。

(確認環境:MetaTrader 5 / Windows 11)

時刻は3種類ある

  何の時刻か
サーバー時刻 取引サーバーの時刻。チャートの横軸はこれ
ローカル時刻 MT5を動かしているPCの時計
GMT 世界標準時

VPSでEAを動かしている場合、PCの時計(VPSの設定)と自分の手元の時計も違います。3つどころか、意識すべき時刻が増えます。

ズレの計算

日本時間はGMT+9です。サーバーがGMT+3なら6時間、GMT+2なら7時間、日本の方が進んでいます。

  • 夏時間(おおむね3月〜11月) — GMT+3の業者が多い。日本時間 −6時間
  • 冬時間(おおむね11月〜3月) — GMT+2。日本時間 −7時間

採用しているタイムゾーンと切り替え日は業者ごとに違います。「6時間」と覚えず、自分の業者の表示で確認してください。切り替わる週は1時間ずれたまま計算しがちです。

🔴 コードの中では関数ごとに違うものが返る

ここが本題です。MQL5公式リファレンスの定義はこうなっています。

関数 返すもの
TimeCurrent() 最後にクォートを受信した時刻
TimeTradeServer() 取引サーバーの現在の計算時刻
TimeLocal() PCの時刻
TimeGMT() GMT(PCの夏時間設定に従う)

名前から受ける印象と中身が食い違うのが TimeCurrent() です。「現在時刻」ではなく「最後に値が届いた時刻」です。

何が起きるか

相場が動かない間、TimeCurrent() は進みません。

  • 週末 — 金曜の最後のクォート時刻のまま止まる
  • 取引時間外 — 止まる
  • 薄商いの時間帯 — 飛び飛びになる

「22時になったら決済する」という判定を TimeCurrent() で書いていると、22時直前に値動きが止まった場合、22時が来ないまま翌日を迎えます。

時刻で区切る処理では TimeTradeServer() を使ってください。こちらはサーバーの計算時刻なので、クォートが来なくても進みます。

TimeLocal() も避ける

TimeLocal() はPCの時計です。VPSのタイムゾーン設定を変えると、EAの挙動が変わります。環境に依存する値を判定に使うと、手元では動いたのにVPSでは動かない、という差が出ます。

使い分けの目安

やりたいこと 使う関数
指定時刻で決済する TimeTradeServer()
足の時刻を扱う iTime()(サーバー時刻ベース)
最後に値が来た時刻を知りたい TimeCurrent()
ログに手元の時刻を残したい TimeLocal()

2行目も重要です。チャート上の足の時刻はサーバー時刻なので、「日本時間の9時の足」を探したい場合は自分でずらす必要があります。

時刻を分解して判定する

「何時か」を見るには構造体に分解します。

MqlDateTime t;
TimeToStruct(TimeTradeServer(), t);

if(t.hour == 22 && t.min == 0)
  {
   // 22時00分(サーバー時刻)の処理
  }

ただしこの書き方は「22時00分」の瞬間に処理が呼ばれないと通りません。値動きに依存しない形で定期的に呼ぶ必要があります。方法はMQL5で一定時間ごとに処理する方法にまとめています。

実務上は「22時を過ぎたか」で判定し、一度実行したら当日は再実行しない形にする方が安全です。1分を狙い撃ちにすると、取りこぼした時に何も起きません。

チャートの表示を日本時間にすべきか

日本時間を表示するインジケーターは配布されていますが、表示を変えてもサーバー時刻そのものは変わりません。コードが見る時刻も、注文の記録に残る時刻もサーバー時刻のままです。

表示を変えると、画面の時刻とログの時刻が食い違う状態になります。検証でログを突き合わせる工程があるなら、表示はサーバー時刻のままにして、頭の中で換算する方が事故が少なくなります。

取引履歴を書き出して分析する場合も、記録されるのはサーバー時刻です。手順はMT5の取引履歴を書き出す方法にまとめました。

まとめ

  1. チャートの時刻はサーバー時刻。日本時間とは6〜7時間ずれる(業者による)
  2. 🔴 TimeCurrent() は「最後にクォートが来た時刻」。相場が止まると進まない
  3. 時刻で区切る処理は TimeTradeServer()
  4. TimeLocal() はPC依存。VPSでは挙動が変わる
  5. 表示を日本時間にしても、記録される時刻はサーバー時刻のまま

日足の区切りがサーバー時刻で決まることを含め、使える時間足と追加の方法はMT5の時間足を追加する方法|選べるのは21種類だけにまとめています。

本記事は仕様と実装方法を説明したものであり、特定の売買や業者を推奨するものではありません。タイムゾーンの扱いは業者ごとに異なります。投資判断はご自身の責任で行ってください。