【移植#103】直近25時間の安値を時刻でそろえる — 欠損バーを0と混同しない¶

この記事の3行まとめ
- 配列の
L[0]を現在のH1足、L[1]を1時間前として並べる考え方をMT5へ移します - 必要な25個の時刻を先に決め、その時刻と一致するバーだけを
CopyRates()の結果から探します - バーがない時間枠は安値0ではなく
NO_EXACT_BARと記録します。休場や業者時間もあるため、それだけでデータ障害とは判定しません
元記事の回答をMT5で組み直す¶
元記事は2010年5月31日付です。記事前半は配布ツールの紹介で、後半の質疑応答で「各1時間足の安値24個を配列へ入れたい」という質問に答えています。回答は、午前0時からの固定番号ではなく、現在のH1足から過去へL[0]〜L[24]を並べ、期待した1時間差がない場合はゼロを入れる例でした。
今回は質問への回答部分だけを取り上げます。MT5ではCopyRates()で時間区間のレートをまとめて取得し、期待する各時刻とMqlRates.timeが一致する行を対応づけます。配列へ先に25個の時刻枠を作るため、途中にバーがなくても、その後ろの時刻がずれて誤判定し続けることを避けられます。
MQL5公式: CopyRates MQL5公式: ArraySetAsSeries
「直近25本」と「直近25時間」は別です¶
通常のCopyRates(symbol,PERIOD_H1,0,25,rates)は、利用できるバーを25本取得します。バーが抜けている時間帯があれば、25本の範囲は25時間より広くなります。元記事の配列を読み替えるなら、欲しいのは「存在するバーを25本」ではなく「現在時刻から1時間刻みの25枠」です。
配布EAは、現在形成中のH1足の開始時刻を基準にし、そこから過去24時間までの時刻範囲をCopyRates()で読みます。その後、各枠の期待時刻とバー開始時刻が完全一致するかを照合します。CSVにはシフト、期待時刻、状態、実バー時刻、安値を記録します。ArraySetAsSeries()を設定した動的配列では論理インデックス0が最新側になるため、コード内の配列方向も明示しています。
| 配列 | 意味 |
|---|---|
L[0] | 現在形成中のH1足の安値 |
L[1] | 開始時刻が1時間前のH1足の安値 |
L[24] | 開始時刻が24時間前のH1足の安値 |
バーのない時刻はゼロではなく状態で示す¶
元記事の例は、期待する時間差がないと配列要素を0にします。価格の数値と「値がない」を同じ列で表すと、後続処理が0を有効な安値として扱う危険があります。MT5版は安値欄を空にし、状態列へNO_EXACT_BARと書きます。バーが見つかればEXACTと実際の安値を記録します。
NO_EXACT_BARは「期待した開始時刻のバーが取得結果にない」という意味です。週末・日次休止・ブローカーのサーバー時刻や夏時間など、通常の取引スケジュールでも起こりえます。市場が閉じていたのか、ヒストリーが不完全なのかをこの判定だけで区別することはできません。欠損表示をそのままデータ破損の証拠としないでください。
シフト0は現在形成中の足なので、lowは新しい値動きで更新されます。確定足だけを使う用途では、基準時刻を直近確定足へ変更して同じ時刻照合を行います。EAは注文処理を持たず、CSVとチャート表示だけを行います。
MT5での確認¶
配布EAをH1以外のチャートへ設定しても、参照する時間足はH1に固定されます。画面の25行は、時刻枠ごとの存在状態と安値を示します。CSVの各行について、EXACTなら期待時刻と実バー時刻が一致すること、NO_EXACT_BARならバー時刻と安値が空であることを確認してください。コピーできた全件数が25未満でも、取得できた行を時刻照合し、残る時刻枠はそれぞれ状態として出力します。
このツールはH1安値を並べて履歴の時刻対応を見るものです。安値が将来の支持線になるか、売買に使えるか、データが完全かを判定しません。別のEAへ組み込む場合は、取引時間、サーバー時刻、夏時間、バー確定のタイミングを対象環境で確認してください。
ダウンロード¶
103_H1_Low_Window_Auditor_v1_00.mq5 をダウンロード
前後の記事¶
次: 【移植#104】前日の高値・安値・中間値を引く — 確定日足の3本線
あわせて読みたい記事¶
- 【移植#30】経済指標後60分の値動きを測る — 初動・最大変動・戻りを同じ基準で記録
- バックテストの「99%」は信頼できる?MT5で履歴データの品質を点検する【移植#36】
- 【移植#37】東京9–17時を1本の足にする — セッションOHLCをMQL5で可視化