【移植#37】東京9–17時を1本の足にする — セッションOHLCをMQL5で可視化¶

この記事の3行まとめ
- 東京時間9:00〜17:00の確定M1足を、日ごとの始値・高値・安値・終値へ集計します
- MT4のオフライン日足を、通常チャート上のセッションボックスとしてMQL5へ再構成しました
- 専用MT5で12バッファと通常・日またぎセッションの境界を独立照合し、0エラー・0警告で合格しました
今回の原典は「東京時間だけの日足を作る」¶
投稿日順で次に当たる2010年1月26日の記事は、東京時間の値動きを1本の足として見る試みでした。
原典では、東京市場の9:00〜17:00とニューヨーク市場の22:00〜翌6:00を、それぞれ独自の日足にしたいという依頼が出発点です。MT4のPeriod_Converter_OptMODを改造し、当時のFXDDサーバーでは東京9:00〜17:00に相当する2:00〜10:00をStartH=2、EndH=10としてH1チャートへ適用し、USDJPY_TK,Dailyというオフラインチャートを開いていました。
ただし、原典自身も「まだ十分にテストしていない」と断っています。さらに、サーバー時刻と日本時間の差はブローカーや夏時間で変わります。そこで今回は、単純な時刻の置き換えではなく、セッションの境界、確定足、欠損、日またぎを検証できる形にします。
オフラインチャートではなく、通常チャートへ重ねる¶
配布版は独自シンボルやオフライン時間足を作りません。現在の銘柄から確定済みM1足をまとめて取得し、指定したローカル時間帯のOHLCを通常チャート上へ描きます。
1セッションについて集計する値は次の4つです。
表示では、高値から安値までを半透明ボックス、始値を水色線、終値を黄色線で示します。直近5セッションを同時に見られるため、通常の日足と東京時間だけの値幅をチャートを切り替えずに比較できます。
形成中のM1足は値が変わり続けるので集計しません。CopyRates()の開始位置を1にして、確定済みM1足だけを8,000本取得します。履歴を取得できない間は計算結果を確定せず、次のティックで再試行します。
MQL5の時刻構造への変換は公式のTimeToStruct()、価格履歴の一括取得はCopyRates()に沿っています。
サーバー時刻とセッション時刻を分ける¶
入力時刻を「チャート上の時刻」と思い込むと、ブローカーを替えただけで表示区間がずれます。配布版では、次の2つを分けて入力します。
| 入力 | 初期値 | 意味 |
|---|---|---|
InpSessionUtcOffsetMinutes | +540 | 集計したい時刻帯のUTC差。日本時間はUTC+9 |
InpServerUtcOffsetMinutes | +180 | 検証時ブローカーのサーバー時刻。UTC+3 |
今回の検証では、セッション時刻とサーバー時刻の差は+540 - (+180) = +360分です。サーバー時刻へ6時間を足して日本時間に直し、9:00以上17:00未満を東京セッションへ含めます。
終了時刻は含めない半開区間です。
この定義なら、17:00ちょうどのM1足が当日の東京足へ混ざりません。8時間セッションの期待本数は480本です。
22時〜翌6時の日またぎにも対応する¶
原典にあったニューヨーク時間のように、開始時刻が終了時刻より遅い場合は日をまたぎます。判定は次の形です。
0:00〜5:59の足は、その暦日のセッションではなく前日22:00に始まったセッションへ割り当てます。これをしないと、真夜中で2本の足に分裂します。
検証EAでは配布インジケーターとは別の集計処理を持ち、東京9:00〜17:00に加えて22:00〜翌6:00の境界も人工時刻で確認しました。開始時刻は含み、終了時刻は含まないこと、翌日早朝を前日のキーへ戻すことを照合しています。
実測:直近5日を480本ずつ集計できた¶
専用MT5のEURUSD・H1チャートで実行した結果は次のとおりです。集計元はH1足ではなく確定M1足です。
| 確認項目 | 実測値 |
|---|---|
| 表示セッション | 5日分 |
| 最新セッション | 2026-07-21 |
| 最新セッションのM1足 | 480 / 480本 |
| 最新セッションの欠損 | 0本 |
| 始値 | 1.14158 |
| 高値 | 1.14277 |
| 安値 | 1.14090 |
| 終値 | 1.14228 |
| 方向 | 上昇 |
| コンパイル | 0エラー・0警告 |
画面上では7月15日、16日、17日、20日、21日の東京セッションを描画しています。週末を「欠損した営業日」として補間せず、実際に取得できた足だけを日ごとにまとめます。
欠損本数は、セッションの予定分数から取得できたM1足数を引いた参考値です。祝日、取引休止、ブローカー履歴の欠けを区別するものではありません。欠損が出た日は、その理由を履歴や取引時間から別に確認してください。
12バッファを独立実装で照合する¶
見た目が正しくても、内部集計が偶然合っているだけでは検証になりません。配布インジケーターは、描画とは別に次の12項目を計算バッファへ公開します。
- 完了セッション数
- 取得した確定M1足数
- 最新セッションの始値
- 高値
- 安値
- 終値
- 上昇・下落方向
- サーバー基準の開始時刻
- サーバー基準の終了時刻
- 期待M1本数
- 欠損M1本数
- 計算完了フラグ
検証EAは、配布側の集計関数を流用せず、確定M1履歴から同じ値を独立に作って全バッファと比較しました。
| 検証項目 | 結果 |
|---|---|
| 診断バッファ | 12本すべて一致 |
| 東京9:00〜17:00の境界 | 合格 |
| 日またぎ22:00〜翌6:00の境界 | 合格 |
| 翌日早朝のセッション日付 | 合格 |
| 実画面キャプチャー | 成功 |
| 売買注文 | なし |
| 外部ファイルの作成・更新 | なし |
ダウンロードと使い方¶
37_Tokyo_Session_OHLC_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、確認したい銘柄のチャートへ適用してください。表示チャートはH1を推奨しますが、集計元は常にM1です。
東京時間なら、開始9、終了17、セッションUTC差+540を指定します。InpServerUtcOffsetMinutesだけは、利用するブローカーの現在のサーバー時刻に合わせてください。表示日数はInpSessionsToDraw、取得履歴量はInpSourceM1Barsで調整できます。
ニューヨーク時間など日をまたぐ区間も、開始22、終了6のようにそのまま指定できます。
使えないこと・注意点¶
- サーバーUTC差は固定入力です。ブローカーの夏時間が切り替わったら手動で変更してください。
- 過去の途中で夏時間が変わる長期履歴を、自動的に期間別補正する機能はありません。
- 日本の祝日や市場参加者の活動時間を判定するカレンダーではありません。
- M1履歴が欠けている日は、欠けたままのOHLCと欠損本数を表示します。
- 同じ東京時間でも、価格配信元が違えばOHLCは変わります。
- オフラインチャートや独自シンボルは作成しません。
- 売買判断や注文機能はなく、セッション足の形だけで収益性を保証しません。
ロジック評価の結論¶
通常の日足は、ブローカーが定めたサーバー日付で区切られます。一方、東京市場の値動きを見たいなら、東京の始まりと終わりで価格を切り取る必要があります。原典の発想は、同じ相場でも「どこで一日を区切るか」によって見える値幅が変わることを示していました。
MQL5版では、オフライン日足の生成をやめ、確定M1足を通常チャート上へ重ねました。これにより、元の値動きとセッションOHLCを同じ画面で比較でき、時刻差と欠損も隠れません。
時刻系インジケーターで重要なのは、時間帯の名前より境界の定義です。UTC差、開始を含むか、終了を含むか、日またぎをどの日へ帰属させるかを明示して、はじめて再現できるセッション足になります。
前後の記事¶
前: 【移植#36】「99%」を鵜呑みにしない — バックテスト履歴の証拠をMQL5で点検する