MT4のサーバー時刻を日本時間へ変換するには、その日時に適用されるサーバーのUTCオフセットを確認します。PCの夏時間を返すTimeDaylightSavingsを使っても、ブローカーの夏時間は判定できません。現在時刻の表示と、過去の足の変換は分けて設計します。
こんにちは。trade-engineer.com 運営者のHです。
※当サイトはアフィリエイト広告(Amazonアソシエイツ等)を利用しています。
MT4の時刻関数は同じ時計を返していない
| 関数 | 基準と注意点 |
|---|---|
| TimeCurrent() | 最後に受信した気配値のサーバー時刻。PCの現在時刻とは別 |
| TimeLocal() | MT4が動くPCのローカル時刻 |
| TimeGMT() | PCのローカル時刻と夏時間設定をもとに計算したGMT |
| TimeDaylightSavings() | PCの夏時間に関する補正値。ブローカーの設定ではない |
TimeCurrentの公式仕様では、OnTick内なら処理中のティックの時刻、その他のハンドラーでは気配値表示にある銘柄の最後の受信時刻です。休日や通信停止中に、壁時計と同じ速度で進む現在時刻として扱うとずれます。
PCの時計そのものを表示する用途はTimeLocalと区別します。チャートの足をPC側の表示時刻に置き換える処理とは別です。
日本時間への計算はUTCとの差から求める
日本時間をUTC+9として扱うなら、計算は「サーバー時刻+9時間-その日時のサーバーUTCオフセット」です。UTC+2のサーバーなら7時間、UTC+3なら6時間を加算します。これらはオフセットを仮定した計算例で、特定の業者の年間設定ではありません。
例えばUTC+2のサーバー時刻が10月2日20:30なら、日本時間表示は10月3日03:30です。日付も繰り上がります。時刻の文字列だけを切り出して「7を足す」方法では、日付変更の処理が抜けるので、datetimeの値に秒数を加算してから表示します。
確認済みのオフセットを入力するMQL4スクリプト例
以下はMQL4のスクリプト全体です。入力値はUTCとの差を分で表します。初期値120はUTC+2という例なので、利用するサーバーに合わせて変更してください。時刻計算を確認する例で、チャート全体の表示や注文時刻を変更する機能はありません。
#property strict
#property script_show_inputs
input int ServerUTCOffsetMinutes = 120;
datetime ServerToJST(datetime server_time, int utc_offset_minutes)
{
return server_time + (540 - utc_offset_minutes) * 60;
}
void OnStart()
{
datetime server_time = TimeCurrent();
if(server_time == 0)
{
Print("No server quote time available.");
return;
}
datetime jst = ServerToJST(server_time, ServerUTCOffsetMinutes);
Print("Server: ", TimeToString(server_time, TIME_DATE | TIME_SECONDS),
" / JST display: ", TimeToString(jst, TIME_DATE | TIME_SECONDS),
" / UTC offset minutes: ", ServerUTCOffsetMinutes);
}
MetaEditorでスクリプトとして保存・コンパイルし、接続した端末で実行してログを確認します。本例は日時計算の境界を別環境で確認したもので、MT4端末上のコンパイル・実行は未検証です。使用する端末でサーバーの公表設定とログを照合してから利用してください。
PCの夏時間とブローカーの夏時間を混ぜない
TimeDaylightSavingsの公式仕様は、PCの時刻設定による夏時間の補正を示しています。ブローカーがUTC+2からUTC+3へ切り替える日を、この関数から取得できるわけではありません。
TimeCurrentとTimeGMTの差をそのまま使う方法にも条件があります。受信時刻とPCの現在時刻が同じ瞬間とは限らず、PCの時計やタイムゾーンの誤設定も結果に影響します。丸めた差がそれらしく見えても、公式のサーバー設定を確認する代わりにはなりません。
過去足とストラテジーテスターでは別途確認する
TimeGMTの公式仕様では、ストラテジーテスター内のTimeGMTはシミュレートされたTimeCurrentと同じになります。両者の差から実サーバーのUTCオフセットを推定する処理は、そのままではテスターで成立しません。
過去足を日本時間へ変換するなら、各バーの日時に対応したオフセットが必要です。今のオフセットを1年前の全バーへ適用すると、夏時間の期間がずれます。履歴の切替日と適用区間を業者の資料で確認し、変換関数へその日時の値を渡します。確認できない期間を推測で埋めないでください。
検証では、日付の繰上がり、年末年始、UTC+2とUTC+3、夏時間の切替前後を分けて記録します。現在の表示が合うことと、過去の取引時間帯が正しく分類できることは別の確認です。

