コンテンツにスキップ

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

EURUSDのH1チャートへ東京時間9時から17時までのOHLCを5日分表示し、独立検証に合格したMT5画面

この記事の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=2EndH=10としてH1チャートへ適用し、USDJPY_TK,Dailyというオフラインチャートを開いていました。

ただし、原典自身も「まだ十分にテストしていない」と断っています。さらに、サーバー時刻と日本時間の差はブローカーや夏時間で変わります。そこで今回は、単純な時刻の置き換えではなく、セッションの境界、確定足、欠損、日またぎを検証できる形にします。


オフラインチャートではなく、通常チャートへ重ねる

配布版は独自シンボルやオフライン時間足を作りません。現在の銘柄から確定済みM1足をまとめて取得し、指定したローカル時間帯のOHLCを通常チャート上へ描きます。

1セッションについて集計する値は次の4つです。

\[ Open = \text{最初のM1足の始値} \]
\[ High = \max(各M1足の高値),\quad Low = \min(各M1足の安値) \]
\[ Close = \text{最後のM1足の終値} \]

表示では、高値から安値までを半透明ボックス、始値を水色線、終値を黄色線で示します。直近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未満を東京セッションへ含めます。

終了時刻は含めない半開区間です。

\[ 09{:}00 \leq t < 17{:}00 \]

この定義なら、17:00ちょうどのM1足が当日の東京足へ混ざりません。8時間セッションの期待本数は480本です。


22時〜翌6時の日またぎにも対応する

原典にあったニューヨーク時間のように、開始時刻が終了時刻より遅い場合は日をまたぎます。判定は次の形です。

\[ t \geq 22{:}00 \quad \text{または} \quad t < 06{:}00 \]

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項目を計算バッファへ公開します。

  1. 完了セッション数
  2. 取得した確定M1足数
  3. 最新セッションの始値
  4. 高値
  5. 安値
  6. 終値
  7. 上昇・下落方向
  8. サーバー基準の開始時刻
  9. サーバー基準の終了時刻
  10. 期待M1本数
  11. 欠損M1本数
  12. 計算完了フラグ

検証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で点検する

— SPONSORED —