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の取引履歴を書き出す方法にまとめました。
まとめ
- チャートの時刻はサーバー時刻。日本時間とは6〜7時間ずれる(業者による)
- 🔴
TimeCurrent()は「最後にクォートが来た時刻」。相場が止まると進まない - 時刻で区切る処理は
TimeTradeServer() TimeLocal()はPC依存。VPSでは挙動が変わる- 表示を日本時間にしても、記録される時刻はサーバー時刻のまま
日足の区切りがサーバー時刻で決まることを含め、使える時間足と追加の方法はMT5の時間足を追加する方法|選べるのは21種類だけにまとめています。
本記事は仕様と実装方法を説明したものであり、特定の売買や業者を推奨するものではありません。タイムゾーンの扱いは業者ごとに異なります。投資判断はご自身の責任で行ってください。


