BOS・CHoCHをMT5 EAへ実装する際の定量化方法を解説。Swing High・Lowの確定、終値ブレイク、状態管理、Displacementによるフィルターまで、裁量判断を再現可能なルールへ変換する設計を整理します。
目視では一致してもコードでは判断が分かれる理由
Market Structureはチャート上では直感的に認識できるが、EAへ実装すると曖昧さが問題になる。どの高値をSwing Highとするか、ヒゲの突破をBreakと認めるか、CHoCHとBOSをどう区別するかによって結果が大きく変わるためだ。
自動化では、名称よりも判定条件を固定することが重要になる。BOSやCHoCHを再現可能なロジックへ変換するには、Swingの確定、Break判定、トレンド状態の3要素を明確に分離すると設計しやすい。
Swing HighとSwing Lowを最初に定義する
構造判定の基準点となるSwingを曖昧にすると、その後のBOS・CHoCHも安定しない。実装方法の一つがN本のFractalを利用する方式である。
例えば対象バーの高値が左右N本すべての高値を上回ればSwing High、安値が左右N本すべてを下回ればSwing Lowとする。Nを大きくすれば主要な構造だけが残り、小さくすれば短期的な構造変化を多く検出する。
ただし右側のバーが必要なため、Swing確定には遅延が発生する。これはリペイントを避けるためのコストとして扱う必要がある。
Breakは終値基準で定義する
次に、保存されたSwing価格をいつ突破したと認識するかを決める。
例えばCloseが直近Swing Highを上回った場合をBullish Break、CloseがSwing Lowを下回った場合をBearish Breakとする。ヒゲだけの突破を除外することで、一時的なLiquidity Sweepと構造Breakを区別しやすくなる。
EAでは形成中のバーではなく、確定したバーのみで判定する方がバックテストと実運用の整合性を保ちやすい。
BOSとCHoCHは状態遷移として管理する
単純に高値突破をBOS、安値突破をCHoCHと固定すると、現在の市場方向を考慮できない。
そこで内部にBullish、Bearish、Neutralなどのstructure_stateを持たせる。Bullish状態で上方向へ構造を更新すればBOS、反対側の有効なSwing Lowを割ればCHoCH候補とする。Bearish状態ではその逆になる。
つまりBOSとCHoCHは価格パターンそのものではなく、「現在の状態に対して、どちら側の構造が壊れたか」という状態遷移として扱うと実装しやすい。
Displacementを追加して弱いBreakを除外する
終値がSwingを数ポイント超えただけでもBreakとして認識すると、レンジ相場で大量のシグナルが発生する可能性がある。
フィルターとして、Breakしたローソク足の実体幅がATRの一定割合以上、Swingからの突破距離がATR比で一定以上など、Displacementの条件を追加できる。
これにより「構造を超えたか」と「十分な勢いを伴って超えたか」を分離して評価できる。
EAではシグナルと売買判断を分離する
Market StructureモジュールはBOSやCHoCHを検出するだけにし、そのイベントを直接エントリーへ接続しない設計が望ましい。
例えばCHoCH発生後にBOS確認、ATRフィルター、上位足方向、スプレッド条件などを別レイヤーで評価する。こうすれば、構造検出ロジック自体の精度と売買戦略の収益性を個別に検証できる。
まとめ
BOS・CHoCHを自動化する際の核心は、裁量用語をそのままコードへ移すことではなく、Swing、Break、状態遷移を数値条件として固定することにある。
FractalなどでSwingを確定し、終値でBreakを判定し、現在のstructure_stateとの関係からBOS・CHoCHを分類する。さらにDisplacementなどを独立したフィルターとして追加すれば、Market Structureをバックテスト可能なルールへ変換しやすくなる。







