コンテンツにスキップ

【移植#76】H1の5分ずれを壊さず調べる — M1再集計でOHLCを照合

EURUSD H1の確定120本をM1から再集計し、開始時刻・OHLC・Tick Volumeの不一致0と5分ずらした負の対照の拒否を表示したMT5実画面

この記事の3行まとめ

  • H1が毎時00分から始まっているかを、確定足だけで確認します
  • 同じ時間帯のM1からOHLCとTick Volumeを作り直し、H1と全件照合します
  • EURUSDの確定120本は不一致0で、期待時刻を05分へずらした負の対照は120/120本を拒否しました

今回の原典は「H1が05分から始まる」

今回採用したのは、2010年3月31日の「1時間足が05分から始まる怪…」です。

元記事を読む

原典では、通常なら00分から始まるはずの1時間足が、ある区間だけ05分区切りになっていました。M1を確認すると週明けの最初のデータが00時06分からで、サーバー側の履歴が影響した可能性が考えられています。

当時の確認方法は、M1を取得し、MT4を終了して不適切なH1履歴を削除し、変換ツールでオフライン用H1を作るというものでした。ただし、オンラインへ戻すとサーバー履歴で上書きされるため、実口座ならブローカーへ連絡する、という結論です。

今回は、標準銘柄の履歴を削除も上書きもしません。まず現在のH1がM1と整合しているかを読み取りだけで測る監査へ置き換えました。

投稿日順で先にある3月26日の比較ツール紹介と3月27日のMetaEditor操作集は、旧ツール・旧UIの説明が中心です。3月30日の浮動小数点剰余も既存回と重なるため、番号を使わずに進めています。

監査するのは「開始時刻」と「足の中身」

H1の表示がそれらしく見えても、時刻ラベルだけでは中身まで確認できません。配布版は、直近の確定H1を次の順に調べます。

  1. H1の開始時刻が期待する分・秒と一致するか
  2. その1時間に属するM1を時刻順に集める
  3. 最初のM1の始値、全M1の高値・安値、最後のM1の終値を求める
  4. M1のTick Volumeを合計する
  5. H1のOHLC・Tick Volumeと比較する

初期設定の期待開始分は00です。たとえば10時のH1なら、対象区間は次のようになります。

Text Only
期待するH1開始 : 10:00:00
M1の集計区間  : 10:00:00以上、11:00:00未満

再集計式は単純です。

Text Only
Open  = 区間内で最初に存在するM1のOpen
High  = 区間内M1のHighの最大値
Low   = 区間内M1のLowの最小値
Close = 区間内で最後に存在するM1のClose
Tick Volume = 区間内M1のTick Volume合計

H1とM1はCopyRates()で取得します。公式仕様では、日付範囲を指定した場合、開始時刻が範囲内にあるバーだけが返り、配列の物理配置は古いバーから新しいバーの順になります。

各行にはMqlRatesの開始時刻、OHLC、Tick Volumeが入っています。1時間の長さはPeriodSeconds(PERIOD_H1)から取得し、秒数を別に決め打ちしない形にしました。

M1が60本ないだけでは異常と断定しない

1時間は60分ですが、1時間ごとにM1が必ず60本あるとは限りません。ある1分間に価格更新がなければ、その分のM1バーが存在しないことがあります。週末や取引停止をまたぐ区間もあります。

したがって、配布版は次の2つを分けます。

  • 区間にM1が1本もない: H1を再集計できないためCHECK
  • 一部の分にM1がない: 存在するM1を集計し、H1のOHLC・Tick Volumeと一致するかで判定

さらに、最初のM1がH1開始より何分遅いかを別の診断値として表示します。開始が遅いこと自体は即エラーにせず、原典のような「週明けの最初のデータが遅れている」状況を見つける手掛かりにします。

今回の実測では、120時間で使ったM1は7,195本でした。60本×120時間の7,200本より5本少ない一方、H1のOHLCとTick Volumeは全件一致しています。M1本数だけを見て履歴破損と決めないことが大切です。

同期済みと値の一致は別に確認する

配布版は、H1とM1のSERIES_SYNCHRONIZEDを別々に確認します。どちらかが未同期なら、短い取得結果で合否を出さずWAITINGにします。

ただし、同期フラグが真でも、H1とM1の価格が同じ規則で構築された証明にはなりません。そのため、同期状態の確認後に、時刻・OHLC・Tick Volumeの再集計照合を行います。

判定は次のように読み分けられます。

表示 主に確認すること
boundary mismatch H1の開始分・秒が期待値と違う
M1 unavailable 対象時間に再集計できるM1が1本もない
OHLC mismatch H1と、同じ時間帯のM1から作った価格が違う
tick-volume mismatch H1のTick VolumeとM1合計が違う
first M1 later than bucket 区間先頭にM1がない。単独では不合格にしない

不一致のH1には赤い縦線を出します。件数が0なら縦線は表示されません。

パラメーター

パラメーター 初期値 役割
InpAuditBars 120 調べる確定H1の本数
InpExpectedOpenMinute 0 期待するH1開始分。通常は00分
InpTolerancePoints 0.1 OHLC差を許容するpoint数
InpCompareTickVolume true M1合計とH1のTick Volumeを比較
InpShowPanel true 監査結果をチャートへ表示
InpMarkIssues true 不一致のH1へ赤い縦線を表示

この版はH1専用です。M5やH4へ装着して別の意味に読み替えず、確認したい銘柄のH1チャートで使ってください。

76_H1_M1_Boundary_Auditor_v1_00.mq5 をダウンロード

EURUSDの確定120本を実機照合

専用MT5 Build 6182で、配布インジケーターと独立検証EAをコンパイルしました。どちらも0エラー・0警告です。

検証EAは配布版の集計値を読むだけで合格にせず、H1とM1を別に取得し、120区間のOHLCとTick Volumeを独自に作り直しました。

検査項目 結果
対象 EURUSD H1
照合した確定H1 120本
再集計に使ったM1 7,195本
H1開始時刻の不一致 0本
M1が1本もない区間 0本
OHLC不一致 0本
Tick Volume不一致 0本
最大価格差 0.000 point
区間先頭のM1遅れ 0本・最大0分
H1 / M1同期 YES / YES
独立検証との集計差 0
注文数・ポジション数 開始前後で変化なし

05分を期待させた負の対照

正常データで不一致0になっただけでは、異常検出側が動くか分かりません。そこで同じ120本へ、期待開始分だけを意図的に05へ変更した別インスタンスを同時に走らせました。

実データのH1は00分開始なので、負の対照は120/120本を境界不一致として拒否しました。掲載画像のshifted :05 control REJECTEDはこの確認結果です。

これは履歴を書き換えて異常を作った試験ではありません。読み取り条件だけをずらし、正常側の合格と異常判定側の拒否を同じ実行で確認しています。

使い方

  1. MQ5をMT5のデータフォルダー内のMQL5/Indicatorsへ置き、MetaEditorでコンパイルします。
  2. 調べたい銘柄のH1チャートへ適用します。
  3. H1=YESとM1=YESになるまで待ちます。
  4. boundary、M1 unavailable、OHLC、tick-volumeの各件数を確認します。
  5. 不一致があれば赤い縦線の時刻をM1とH1で見比べます。

標準銘柄の履歴をこのインジケーターが修正することはありません。実口座の配信履歴に不整合が続く場合は、元データを勝手に加工せず、日時と画面を添えてブローカーへ確認するのが先です。

注意点

  • 今回の不一致0は、EURUSD、確定H1 120本、検証時点の接続先履歴での結果です
  • M1からH1を再現できても、配信元のTickが市場全体を正しく表すことまでは証明できません
  • 形成中H1は価格と出来高が変わるため、監査対象から除いています
  • 過去履歴が後から補正された場合、同じ日時を再検査した結果が変わることがあります
  • 0.1 point以内の差は許容します。用途に応じて厳しくできますが、単位をpipsと取り違えないでください
  • 期待開始分を変更するのは、意図した非00分境界を調べる場合だけにしてください
  • 配布版は売買、履歴書換え、カスタム銘柄作成、ファイル出力、DLL、WebRequestを行いません

まとめ

H1の開始時刻がずれた疑いがあるとき、最初から履歴ファイルを削除すると、原因と結果の両方を消してしまいます。

まずH1の時刻を確認し、同じ時間帯のM1からOHLCとTick Volumeを作り直せば、「表示だけの違和感」「下位足不足」「上位足と下位足の不一致」を分けられます。M1が60本そろわないことと、H1の中身が間違っていることも同じではありません。

今回の120本はすべて一致し、05分へずらした負の対照は全件拒否できました。修復より前に、壊さず測る。その順番をMT5向けに残した移植です。

あわせて読みたい記事


前後の記事

前: 【移植#75】TIIの20越え・80割れ通知 — 同じ名前でも式が違う

次: 【移植#77】5日ごとのランダム方向を検証する — 固定seedの読み取り専用ベースライン

— SPONSORED —