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

この記事の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を次の順に調べます。
- H1の開始時刻が期待する分・秒と一致するか
- その1時間に属するM1を時刻順に集める
- 最初のM1の始値、全M1の高値・安値、最後のM1の終値を求める
- M1のTick Volumeを合計する
- H1のOHLC・Tick Volumeと比較する
初期設定の期待開始分は00です。たとえば10時のH1なら、対象区間は次のようになります。
再集計式は単純です。
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はこの確認結果です。
これは履歴を書き換えて異常を作った試験ではありません。読み取り条件だけをずらし、正常側の合格と異常判定側の拒否を同じ実行で確認しています。
使い方¶
- MQ5をMT5のデータフォルダー内の
MQL5/Indicatorsへ置き、MetaEditorでコンパイルします。 - 調べたい銘柄のH1チャートへ適用します。
H1=YESとM1=YESになるまで待ちます。boundary、M1 unavailable、OHLC、tick-volumeの各件数を確認します。- 不一致があれば赤い縦線の時刻を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向けに残した移植です。
あわせて読みたい記事¶
- MT5のM1履歴を複数通貨で順番に同期する方法|Homeキー連打なしで【移植#44】
- 【移植#47】生のHSTを読まずに履歴を一括CSV化 — 3通貨×500本をCopyRatesで書き出す
- 【移植#70】1970年ダミー足をやめる — MT5履歴を指定日まで段階取得
前後の記事¶
前: 【移植#75】TIIの20越え・80割れ通知 — 同じ名前でも式が違う
次: 【移植#77】5日ごとのランダム方向を検証する — 固定seedの読み取り専用ベースライン