コンテンツにスキップ

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

直近25個のH1時間枠について時刻・安値・バー有無を表示するMT5画面

この記事の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時間差がない場合はゼロを入れる例でした。

元記事「2010年用の損益自動計算EAと損益表」

今回は質問への回答部分だけを取り上げます。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 をダウンロード


前後の記事

前: 【移植#102】最適化を段階的に進める

次: 【移植#104】前日の高値・安値・中間値を引く — 確定日足の3本線

あわせて読みたい記事

— SPONSORED —