プライスアクション分析ツールキットの開発(第58回):レンジ収縮分析および成熟度分類モジュール
内容
はじめに
プライスアクション分析において、最もシンプルでありながら最も信頼性の高い観察の一つがあります。それは、「持続的な値幅拡大(エクスパンション)は、その前に比較的落ち着いた局面を伴うことが多い」という点です。強い方向性を持った値動きの後には、勢いが徐々に鈍化し、市場参加のバランスが徐々に均衡し、レンジ幅が縮小し、短期的なボラティリティが低下します。そして多くの場合、このコンプレッション局面が次の方向性のある値動きへ向けた土台となります。
マーク・ミネルヴィーニ(Mark Minervini)は、このような挙動の一種をVolatility Contraction Pattern (VCP)として説明しています。また、他のトレーダーはこれを「タイトな値動き(Tight Price Action)」や「巻かれたバネ(Coiled Spring)」と表現し、ジョン・ボリンジャー(John Bollinger)は有名なバンドスクイーズ(Band Squeeze)によって同様の概念を体系化しました。呼び方は異なっていても、本質的な現象は共通しています。為替、株価指数、個別株、暗号資産など市場を問わず、価格はトレンドから次のトレンドへ直接移行するのではなく、その間に需給の均衡が形成される局面を挟むことが少なくありません。
実務上の課題は常に同じです。真の吸収(absorption)が進み、レンジ境界との繰り返しの相互作用が確認できる高品質なコンプレッションと、単に方向感なく横ばいで推移しているだけの低品質なレンジを、どのように客観的に区別するのでしょうか。

多くの視覚的な分析ツールは、この問題に対してバンド、チャネル、あるいはボラティリティ指標を利用してアプローチしています。これらは有効な手法ですが、構造が形成された後に反応する派生指標に依存するケースも少なくありません。一方、裁量的にプライスアクションを分析するトレーダーは、レンジ境界への接触回数を数えたり、ヒゲの挙動を観察したり、吸収の進行度を経験則から判断したりすることでこの問題を解決しています。しかし、その判断を複数のチャートに対して一貫しておこなうことは容易ではありません。
こうした背景から開発したのが、Compression Readinessインジケーターです。このインジケーターは、経験豊富なプライスアクショントレーダーがコンプレッションを評価する際の判断基準を、再現可能なルールと分かりやすい視覚フィードバックによって形式化することを目的とした、軽量なクローズドバー専用MQL5インジケーターです。
本ツールは以下の機能を提供します。
- 過去の参照期間と比較した構造的なレンジ収縮を検出する
- ローソク足の重なり度合い、レンジ境界への接触回数、リジェクションの強さを評価する
- コンプレッションの成熟度を判定する(初期段階 / 形成中 / 成熟)
- ローソク足の形状情報のみを用いて方向性バイアスを推定する
- すでに破綻したレンジや、質の低い横ばい推移へ劣化したレンジを無効化する
本記事では、検出ロジックの考え方に加え、トリミングレンジ、デッドドリフト対策、終値によるレンジ逸脱判定といった主要フィルター、成熟度スコアリングの構築方法、そして本ツールを予測シグナルとしてではなく、プライスアクション分析の補助として活用する方法について解説していきます。
それでは、さっそく始めましょう。
プライスアクショントレードにおいてコンプレッションが重要な理由
プライスアクション分析において繰り返し観察される現象の一つに、トレンド方向への拡大の前には、しばしばボラティリティが低下する期間が存在するという点があります。こうした局面では、価格レンジが徐々に狭まり、モメンタムが減速し、市場参加者の力関係が均衡に近づいていきます。市場は方向性のある動きから一時的な均衡状態へと移行し、その結果として値動きの収縮が生じます。この収縮と拡大のサイクルは、市場が需給の不均衡な状態と再均衡化の状態を交互に繰り返していることを反映しています。
急激な売り込み、大規模な経済指標の発表、あるいは予期しないニュースといった強力な外部要因が存在しない限り、ボラティリティは高い状態を維持し続けるのではなく、一般的には徐々に収縮していきます。特に緩やかな上昇トレンドのような環境では、不確実性の低下、逆張り参加者の減少、そして価格がより限定されたレンジ内で推移することによって、この収縮傾向がさらに強まります。こうした状態が継続すると、比較的小さな参加者構成の変化であっても、その後の大きな方向性のある値動きを引き起こす条件が整うことがあります。

普遍的に見られるコンプレッションパターン
このような挙動は、市場や取引スタイルを問わず、異なる名称で広く認識されています。しかし、その根底にあるメカニズムは概ね共通しています。マーク・ミネルヴィニによって広く知られるようになったVCP(ボラティリティ収縮パターン、Volatility Contraction Pattern)は、その代表例の一つです。VCPでは、既存トレンドやベース形成の内部で発生する保ち合いに着目します。価格の押し戻し幅は段階的に浅くなり、初期の調整は比較的大きいものの、その後の調整は次第に小さくなりながらレンジが引き締まり、ボラティリティが低下していきます。この過程では出来高も減少することが多く、逆方向への圧力が弱まっている可能性を示唆します。このパターンは単発のイベントではなく、徐々に進行する吸収のプロセスを反映したものであり、複数の時間足や、より大きなチャートパターンの内部にも出現します。
同様の状態を説明する際によく用いられる表現が、「巻かれたバネ」という比喩です。価格は次第に狭くなる境界の中で上下動を繰り返し、視覚的にはレンジが圧縮されていくように見えます。重要なのは予測そのものではありません。むしろ、引き締まった構造の中で均衡状態が長く維持されると、その均衡が崩れた際に再び方向性のある値動きが生じる可能性があることを認識する点にあります。
ボリンジャーバンドのスクイーズや、タイトなプライスアクションによるベース形成といった関連概念も、本質的には同じテーマのバリエーションです。市場が保ち合いを形成する過程でボラティリティが収縮し、その後、市場参加者のバランス変化に伴って再び拡大します。これらのアプローチに共通している原則は、市場は通常、一つの持続的なトレンドから次の持続的なトレンドへ直接移行することは少なく、その間に何らかの保ち合い局面を挟むという点です。
高品質なコンプレッションを定義するものは何か
すべての保ち合いが有意義な構造情報を提供するわけではありません。より高品質なコンプレッション局面には、いくつかの共通した特徴があります。
吸収
長期間にわたる横ばい推移は、大口参加者による継続的な蓄積や分配を反映している場合があります。これは、レンジ境界への繰り返しの接触が発生しているにもかかわらず、決定的なブレイクにつながらない状況として観察できます。ヒゲによるリジェクションや、レンジ内部へ戻る終値は、一方の勢力が主導権を取り戻そうと試みたものの失敗したことを示しています。
レンジ境界との繰り返しの相互作用
同じ高値や安値に対して何度もテストされているにもかかわらず、その後の値動きが継続しない場合、流動性が放出されているのではなく吸収されている可能性があります。各テストは、その価格帯における市場参加者の強さや弱さに関する追加情報を提供します。
時間経過に伴う成熟
コンプレッションが進行するにつれて、レンジ幅は過去期間と比較して縮小し、ローソク足同士の重なりは増加し、ボラティリティはさらに低下していく傾向があります。また、レンジ内部において高値切り下げや安値切り上げといった非対称性が現れることがあります。これは、まだ明確なブレイクには至っていないものの、一定方向への圧力が徐々に蓄積されていることを示唆します。

上図は、実際の価格チャート上におけるコンプレッション局面を示したものです。コンプレッションは初期段階(Early)、形成段階(Building)、成熟段階(Mature)へと進行していきます。レンジが発達するにつれてローソク足の重なりは増加し、レンジ境界との相互作用も増えます。また、ヒゲによるリジェクションは吸収の進行を示しています。さらにボラティリティは段階的に収縮していきます。図中のステージラベルは固定された時系列や予測的なタイムラインを表すものではなく、レンジ内部におけるコンプレッションの品質と成熟度を相対的に示したものです。最終的に、このセットアップはトレンド方向への拡大によって解消され、蓄積されていたエネルギーが放出されます。
これらの要素を総合すると、高品質なコンプレッションとは単なる停滞状態ではなく、変化に対して徐々に敏感になっていく均衡状態であると捉えることができます。
よくある落とし穴
コンプレッション分析には、いくつかの典型的な課題も存在します。
低品質なドリフト
非常に狭いレンジが長期間継続していても、意味のある境界テストやリジェクションが伴わない場合があります。このような状態は吸収ではなく、市場参加者の関与そのものが低下している状況を反映している可能性があります。こうした環境では、方向性のある値動きよりも長期的な横ばい推移が続くことが多くなります。
ダマシのレンジブレイク
レンジ境界を一時的に超える動きであっても、その後の継続性を欠くケースは珍しくありません。特に成熟度の低いコンプレッションでは頻繁に発生します。十分な市場参加が伴わない場合、このようなブレイクは短時間で否定され、価格はレンジ内部へ戻ることになります。
不規則な相場環境での過剰解釈
流動性が低い市場や、明確なトレンドが存在しない環境では、一見すると収縮しているように見える値動きが、単なるノイズである場合があります。構造や成熟度を確認せずに、すべての狭いレンジを有意義なコンプレッションとみなしてしまうと、不適切な判断につながる可能性が高まります。
重要なのは見た目ではなく構造です。高品質なコンプレッションは、単にレンジが狭いことによって定義されるのではありません。レンジの段階的な引き締まり、繰り返しのレンジ境界との有意な相互作用、そして徐々に形成される非対称性によって特徴づけられます。Compression Readinessインジケーターは、こうした観察結果を定量化するために設計されています。具体的には、レンジ収縮、ローソク足の重なり、テストおよびリジェクションの挙動、成熟度の進行、そして吸収に基づく方向性バイアスを評価します。本ツールの目的は将来の値動きを予測することではありません。コンプレッション局面が意味のある市場均衡を反映しているのか、それとも情報価値の低い単なる横ばい推移なのかを判断するための、構造化された分析コンテキストを提供することにあります。
主要概念と論理
Compression Readinessインジケーターは、これまで説明してきたプライスアクションの考え方を、体系化された検出フレームワークとして実装したものです。すべての計算は確定足のみを対象としているため、履歴データの検証環境とライブチャート環境のいずれにおいても、安定した非リペイント動作を実現しています。
DetectCompressionルーチンは、直近の価格ウィンドウ(デフォルトでは30本)を、その直前の参照ウィンドウと比較して評価します。具体的には、レンジ収縮、ローソク足の重なり、レンジ境界との相互作用、リジェクションの挙動、そして相対的なレンジサイズを測定します。これらの測定結果はポイントベースの評価モデルへ入力され、コンプレッションの成熟度判定に利用されます。一方で、方向性バイアスについては独立したロジックとして扱われ、ローソク足の形状情報のみを用いて評価されます。

本ロジックは、大きく4つの主要コンポーネントに分けられます。
1. コンプレッション検出
コンプレッションは、現在のウィンドウ構造を直前の参照期間と体系的に比較することで検出されます。
まずレンジ収縮は、現在ウィンドウの高値‐安値エンベロープを参照ウィンドウに対して測定することで評価されます。InpContractionMaxによって定義される基準を満たす十分な収縮が確認された場合、そのコンプレッションは高品質であると判断され、評価スコアに加点されます。ローソク足の重なりは、連続するローソク足同士で共有されている価格帯を計算することで評価されます。重なり率が高いほど方向性モメンタムの低下と参加者間の均衡状態を示唆するため、コンプレッション品質を高める要素として扱われます。レンジのタイトさは、絶対評価と相対評価の両方から検証されます。現在のレンジ高は固定上限値であるInpBoxTightMaxPtsと比較される一方、平均ローソク足サイズは過去期間の値と比較されます。これにより、単純に値動きが極端に小さいだけの非活発な相場環境を除外できます。
さらに堅牢性を高めるため、オプションのトリミングレンジ機能(InpUseTrimmedBox)を利用できます。この機能では、設定可能な本数(InpTrimCount)の極端なヒゲを除外してレンジを計算するため、一時的な価格スパイクがレンジ判定を歪めることを防ぎます。最後に、防御的な無効化ルールとして、いずれかのローソク足の終値が定義されたボックスレンジの外側で確定した場合、セットアップ全体を無効化することができます(InpInvalidateOnCloseOut)。これは、そのコンプレッションがすでに解消されたか、あるいは失敗したことを示すためです。
2. 成熟度評価システム
コンプレッションの品質は、シンプルな加算方式のスコアリングモデルによって評価されます。このアプローチにより、ロジックの透明性を維持しながら計算負荷を低く抑えています。
スコアは複数の独立した構造条件から構成されます。具体的には、レンジ収縮の強さ、ローソク足の重なり、絶対的なタイトさ、相対的なタイトさ、レンジ境界との相互作用、リジェクションローソク足の存在といった要素からポイントが加算されます。リジェクションは、十分に長い反対方向のヒゲを持ち、その後の終値がレンジ内部方向へ戻るローソク足として定義されます。
最終スコアは以下の4段階の成熟度状態へマッピングされます。
- 該当なし:構造的な根拠が不足している
- 初期段階:基本的なレンジ収縮とローソク足の重なりが確認されている
- 形成段階:レンジ境界との相互作用が増加し、コンプレッションがさらに進行している
- 成熟段階:収縮、境界テスト、リジェクションが最も強く組み合わさっている
閾値は入力(InpScoreNeedEarly、InpScoreNeedBuilding、InpScoreNeedMature)として公開されており、コードを変更することなく感度を調整できます。また、オプションのデッドドリフトフィルター(InpFilterDeadDrift)も用意されています。このフィルターは、コンプレッションレンジが直近の平均ローソク足サイズと比較して不自然に小さい場合に減点、あるいは無効化をおこないます。これにより、市場参加が乏しいだけの低品質なレンジを除外できます。
3. 吸収と方向性バイアス
方向性バイアスは、ローソク足の構造情報のみから導出されます。まず、一定期間における平均CLVを計算します。CLVは、終値が各ローソク足のレンジ内のどの位置で形成されたかを示す指標であり、市場の方向性圧力を評価するための基礎情報として利用されます。次に、リジェクションの非対称性を評価します。これは、上ヒゲによるリジェクション(上昇失敗)と下ヒゲによるリジェクション(下落防御)を比較することでおこなわれます。十分に長い反対方向のヒゲは、それぞれ方向性バイアスの重み付け要素として加算されます。
これらの要素を組み合わせることで、生のバイアススコアが生成されます。最終的な判定は、Bullish(強気)、Bearish(弱気)、Neutral(中立)のいずれかに分類されます。さらに、オプションの平滑化機能(InpSmoothBias)を利用することで、単発のローソク足による影響を軽減できます。バイアスの強さは「非常に低い」から「高い」までの定性的な表現で表示され、方向性のコンテキストを提供します。ただし、将来の値動きに対する確実性を示すものではありません。
4. 防御的フィルターの概要
構造的に意味のあるコンプレッションのみを残すために、いくつかの防御的フィルターが実装されています。
- ヒゲを除外したトリミングレンジ(スパイク除去)
- 終値によるレンジ逸脱無効化
- デッドドリフトフィルタリング
- より厳格な境界判定をおこなうための実体ベース境界テスト(InpUseBodyBoxForTests)
これらのフィルターを組み合わせることで、値動きが荒い相場、流動性の低い相場、あるいはすでに解消済みのコンプレッションから発生する誤検出を大幅に低減できます。
視覚的要素および情報要素
本ツールは、分析結果を視覚的に把握できるよう設計されています。すべての描画要素は確定足ベースの評価結果から生成され、内部状態が変化した場合にのみ更新されます。
コンプレッションレンジボックス
有効なコンプレッション状態が検出されると、インジケーターは現在の分析対象期間を覆う矩形レンジを描画します。このボックスは、オプションのトリミング処理および各種バリデーションを適用した後の実効的なコンプレッションレンジを表しており、将来の値動きやブレイクアウト水準を予測するものではありません。
ボックスの色は現在の分析状態を反映します。
- 有意なコンプレッションが存在しない場合は中立/非アクティブ状態
- コンプレッションが初期段階、形成段階、成熟段階のいずれかに分類された場合は、それぞれの状態に対応する色
- ボックスは基礎となる状態が変化した場合にのみ再描画されます。これにより、ライブチャート上でも視覚的な安定性が維持されます。
レンジ境界との相互作用マーカー
オプション機能として、コンプレッションレンジの上限および下限との接触を示すマーカーを表示できます。これらのマーカーは、価格が許容範囲内でレンジ境界をテストした箇所を示し、内部ロジックで評価されている吸収やリジェクション挙動を視覚的に確認するための補助情報として機能します。マーカーはあくまで記述的な情報であり、構造的な接触が発生した事実を示すものです。それ以上の特別な意味やシグナル性を持つものではありません。
構造コンテキストラベル
直近のスイング構造は、必要に応じてラベルとしてチャート上へ表示できます。これらのラベルは、確定したスイングポイントに基づき、Higher High(高値更新)、Lower High(高値切り下げ)、Higher Low(安値切り上げ)、Lower Low(安値更新)といった相対的なスイング関係を識別します。その目的は、より大きな価格構造の中でコンプレッションを解釈しやすくすることにあります。トレンドや方向性そのものを判定するための機能ではありません。
バイアス変化指標
有効化されている場合、バイアス変化を示す矢印は、内部的に算出されたバイアス状態が変化したときにのみ描画されます。具体的には、Neutral(中立)、Bullish(強気)、Bearish(弱気)のいずれかの状態へ移行したタイミングで表示されます。矢印は、状態変化が確定したローソク足の終値位置に正確に配置されます。これらの表示は方向性を予測するための売買シグナルではなく、内部状態の変化を視覚的に示すためのものです。また、バイアス状態が継続して有効でない限り、表示が継続することはありません。
情報パネル
コンパクトな情報パネルにより、現在の分析状態をテキスト形式で確認できます。パネルには以下の情報が表示されます。
- コンプレッション状態および成熟度レベル
- レンジ収縮率および重なりの測定値
- レンジ境界テスト回数およびリジェクション回数
方向性バイアスおよびその強度評価
情報パネルは確定足ごとにのみ更新されます。また、すべての視覚的要素と同一の判定ロジックを利用しているため、数値情報とチャート上の注釈との間で一貫性が保たれています。
設計意図
本ツールにおけるすべての視覚的要素および情報表示要素は、基礎となる分析ロジックを補助するために存在します。これらは構造的な状態を観察しやすくすることを目的としており、追加の解釈レイヤーや売買判断、エントリータイミングの示唆を提供するものではありません。
表示内容を状態ベースかつ記述的なものに限定することで、本インジケーターは過去チャートの研究用途だけでなく、ライブ環境におけるコンテキスト分析にも適した設計となっています。また、その過程で価格そのものの挙動や解釈を歪めることがないよう配慮されています。
入力パラメータ
Compression Readinessインジケーターでは、検出ロジックそのものを変更することなく、感度や表示挙動を調整できるよう、必要最小限の入力パラメータを公開しています。デフォルト値は一般的なプライスアクション環境を想定して設定されていますが、銘柄や時間足に応じて柔軟に調整することも可能です。

パラメータは内部コード上の並び順ではなく、機能ごとに分類して説明します。
ウィンドウ構成
これらのパラメータは、構造比較に使用する分析期間を定義します。
ウィンドウバー(InpWindowBars)
- 直近の分析対象ウィンドウのサイズを指定します。このウィンドウが、現在評価対象となるコンプレッション候補を表します。
前のウィンドウバー(InpPrevWindowBars)
- 相対的なレンジ収縮を評価するための参照期間を指定します。コンプレッションを単独で評価するのではなく、過去の市場状態と比較するために独立した参照ウィンドウを使用します。
デフォルト設定である30本/30本の組み合わせは、短期的な値動きを過度に平滑化することなく、十分な構造的コンテキストを提供します。
コンプレッション感度
これらのパラメータは、レンジ収縮や均衡状態をどの程度厳しく評価するかを制御します。
- 最大収縮率(InpContractionMax):コンプレッションとして認定されるために、直近期間の平均値幅が参照ウィンドウに対してどの程度まで許容されるかを定義します。
- 最小重なり率(InpOverlapMin):連続するローソク足同士に求められる価格帯の重なり率を指定します。
- 最大ボックス高さ(InpBoxTightMaxPts):コンプレッションレンジの最大高さを制限します。これにより、過度に広いレンジ構造がコンプレッションとして誤認されることを防ぎます。
これらのパラメータは、対象構造が実際に収縮しているのか、それとも単に緩やかな保ち合い状態にあるだけなのかを判断するための基準となります。
レンジ境界との相互作用とリジェクション
これらの入力は、コンプレッションレンジ境界に対する価格の反応をどのように評価するかを定義します。
- テスト許容度(InpTestTolerancePts):価格がレンジ境界にどの程度接近した場合に、境界テストとしてカウントするかを指定します。
- 最小リジェクションサイズ(InpRejectionMinPts):リジェクションとして認識されるために必要な最小ヒゲ長を定義します。
- 分類に必要な最小限のテスト数(InpMinTestsForEarly、InpMinTestsForMature):コンプレッションが各成熟度ステージへ進むために必要なレンジ境界との相互作用の回数を指定します。
これらのパラメータにより、有意な吸収と偶発的な接触を区別しやすくなります。
成熟度スコア閾値
コンプレッションの成熟度は、累積スコアを離散的な状態へマッピングすることで決定されます。
- 初期段階スコア(InpScoreNeedEarly)
- 形成段階スコア(InpScoreNeedBuilding)
- 成熟段階スコア(InpScoreNeedMature)
これらの閾値を調整することで、コンプレッションが各成熟度へ移行する速度を変更できます。ただし、個々の評価項目そのものが変化するわけではありません。
バイアス推定
バイアス関連のパラメータは、ローソク足構造から方向性圧力を推定する方法に影響します。
- CLVルックバック(InpCLVMeanBars):平均CLVの計算に使用するバー数を指定します。
- バイアス平滑化(InpSmoothBias、InpBiasSmoothBars):複数バーにわたるスムージングを有効化し、単発のローソク足による影響を軽減します。
バイアス関連の設定は、方向性そのものを変更するものではなく、分類結果の安定性に影響します。
堅牢性とバリデーション
これらのパラメータは、防御的な判定ロジックやノイズ除去機能を制御します。
- トリミングレンジ(InpUseTrimmedBox、InpTrimCount):コンプレッションレンジを構築する際に極端なヒゲを除外します。これにより、一時的な価格スパイクによるレンジ歪みを防ぐことができます。
- クローズアウト時に無効化(InpInvalidateOnCloseOut):いずれかのローソク足が定義されたレンジ外で終値確定した場合、そのコンプレッションを無効化します。
- デッドドリフトフィルタ(InpFilterDeadDrift、InpMinBoxToAvgRange):コンプレッションレンジが直近平均ローソク足サイズに対して不自然に小さい場合、減点または無効化をおこないます。これにより、市場参加が乏しいレンジを除外できます。
- 実体のみの境界テスト(InpUseBodyBoxForTests):レンジ境界との相互作用の判定をローソク足実体のみに限定します。より厳格なバリデーションをおこないたい場合に使用します。
表示関連のオプションは、チャート上での見せ方にのみ影響し、検出ロジックそのものには影響しません。
- コンプレッションボックスとマーカー:コンプレッションレンジボックスおよびレンジ境界との相互作用マーカーの表示/非表示を切り替えます。
- バイアス矢印と構造ラベル:内部状態の変化から生成されるバイアス矢印および構造ラベルの表示/非表示を切り替えます。
これらの入力パラメータは、検出ロジックの挙動を変更するためではなく、感度を調整するために設計されています。デフォルト値から大きく変更する場合は、一度に複数のパラメータを極端に調整するのではなく、段階的に変更することを推奨します。特に複数の条件を同時に厳しく設定すると、本来有効なコンプレッション構造まで除外してしまったり、低ボラティリティ環境において過剰なフィルタリングが発生したりする可能性があります。
MQL5での実装
将来的な構造解消に先立つコンプレッション状態を検出するために、本実装では、慎重に定義された過去ウィンドウ内で価格がどのように振る舞っているかを分析する、プライスアクションのみを用いたアプローチを採用しています。遅行性のあるインジケーターに依存するのではなく、レンジがどのように収縮しているか、ローソク足がそのレンジ内でどのように相互作用しているか、そして内部的な圧力がどのように変化しているかを測定することに重点を置いています。そのためには価格データを適切に準備する必要があり、これが以降のすべての分析の基盤となります。
WindowHighLow()およびWindowHighLowTrimmed()といった関数は、現在の分析ウィンドウと参照ウィンドウのそれぞれにおける最高値と最安値を算出するために使用されます。オプションのヒゲトリミング機能を利用することで、単発的なスパイクを伴うローソク足の影響を軽減できます。こうして得られた価格境界はコンプレッションボックスを定義し、このボックスは分析上の基準として機能すると同時に、チャート上における持ち合い状態を視覚的に表現する役割も果たします。
void WindowHighLowTrimmed(int start,int count,int trim,double &hi,double &lo) { hi=-DBL_MAX; lo=DBL_MAX; int totalBars = Bars(_Symbol,_Period); int n = MathMin(count, totalBars-start); if(n<=0){ hi=0; lo=0; return; } double highs[], lows[]; ArrayResize(highs,n); ArrayResize(lows,n); for(int i=0;i<n;i++) { highs[i] = iHigh(_Symbol,_Period,start+i); lows[i] = iLow (_Symbol,_Period,start+i); } ArraySort(highs); ArraySort(lows); int t = MathMax(0, MathMin(trim, (n-1)/2)); lo = lows[t]; hi = highs[n-1-t]; }
ボラティリティを文脈化し、過度に静かな市場環境が強調されることを避けるために、AvgRange()は同一ウィンドウ内におけるローソク足レンジの平均値を算出します。
double AvgRange(int start,int count) { double sum=0; int n=0; for(int i=start; i<start+count && i<Bars(_Symbol,_Period); i++) { double r=CandleRange(i); if(r>0){ sum+=r; n++; } } return (n>0 ? sum/n : 0.0); }
並行して、CandleCLV()およびOverlapRatioWindow()は、各ローソク足がそのレンジ内のどの位置でクローズしているか、そして連続するローソク足同士における価格の重なり度合いを評価します。これにより、レンジ内部構造に関する追加的な洞察が得られます。
double CandleCLV(int s) { double h=iHigh(_Symbol,_Period,s); double l=iLow (_Symbol,_Period,s); double c=iClose(_Symbol,_Period,s); if(h<=l) return 0.0; return (2.0*c - h - l) / (h - l); } double OverlapRatioWindow(int start,int count) { double sum=0; int n=0; for(int i=start; i<start+count-1 && (i+1)<Bars(_Symbol,_Period); i++) { double h1=iHigh(_Symbol,_Period,i), l1=iLow(_Symbol,_Period,i); double h2=iHigh(_Symbol,_Period,i+1), l2=iLow(_Symbol,_Period,i+1); double inter = MathMin(h1,h2) - MathMax(l1,l2); double uni = MathMax(h1,h2) - MathMin(l1,l2); if(uni<=0) continue; double r = (inter>0 ? inter/uni : 0.0); sum += r; n++; } return (n>0 ? sum/n : 0.0); }
コアとなる分析はDetectCompression()ルーチンに実装されており、一連のステップを通じてコンプレッション状態を評価します。このプロセスはまず、選択されたウィンドウサイズおよびトリミングオプションを考慮しながら、コンプレッションゾーンの境界レベルを確定するところから始まります。
void DetectCompression() { if(InpUseTrimmedBox) WindowHighLowTrimmed(1, InpWindowBars, InpTrimCount, boxTop, boxBot); else WindowHighLow(1, InpWindowBars, boxTop, boxBot); // Further processing follows... }
さらなる評価をおこなう前に、防御的なチェックが適用されます。直近のローソク足の終値が定義されたレンジ外で発生している場合(InpInvalidateOnCloseOut)、あるいはレンジの高さが低エンゲージメント環境を示している場合(InpFilterDeadDrift)、その構造は早期に無効化されます。
if(InpInvalidateOnCloseOut) { for(int i=1; i<=InPWindowBars && i<Bars(_Symbol,_Period); i++) { double cClose=iClose(_Symbol,_Period,i); if(cClose>boxTop || cClose<boxBot) { // Invalidate structure return; } } }
構造が維持されている場合、ルーチンは直近期間の平均値幅を参照ウィンドウのそれと比較し、収縮の度合いを定量化します。
double recentAvg=AvgRange(1, InpWindowBars); double prevAvg=AvgRange(1+InpWindowBars, InpPrevWindowBars); contraction= (prevAvg>0 ? recentAvg/prevAvg : 1.0);
続いて、レンジの上限および下限における相互作用の回数とリジェクション回数を通じて、境界インタラクションが評価されます。
topTests=0; bottomTests=0; topRejects=0; bottomRejects=0; double tol=InpTestTolerancePts*_Point; double rej=InpRejectionMinPts*_Point; for(int i=1; i<=InpWindowBars && i<Bars(_Symbol,_Period); i++) { double h=iHigh(_Symbol,_Period,i); double l=iLow(_Symbol,_Period,i); double o=iOpen(_Symbol,_Period,i); double c=iClose(_Symbol,_Period,i); if(h > boxTop - tol) { topTests++; // Additional boundary checks... } if(l < boxBot + tol) { bottomTests++; // Additional boundary checks... } }
これらの指標は、価格がコンプレッションゾーン内でどのように相互作用しているか、そしてその活動が放出されているのか、それとも吸収されているのかを示します。これらの観察結果を要約するために、加算型のスコアリングモデルが用いられ、収縮、オーバーラップ、ボックスタイトネス、リジェクション特性を、InpScoreNeedEarlyなどの事前定義された閾値と照合して評価します。最終的に得られたスコアに基づき、コンプレッションは初期段階、形成段階、成熟段階のいずれかに分類されます。この分類はコンプレッション構造の相対的な発達段階を表すものであり、方向性やタイミングを示唆するものではありません。
int score=0; if(contraction <= InpContractionMax) score+=2; // Additional scoring logic... if(score >= InpScoreNeedEarly) maturity=MAT_EARLY; // Further classification...
バイアス評価は成熟度評価とは独立して実行されます。短期ルックバック期間における平均CLVは、価格がそのレンジ内のどの位置でクローズしやすいかを捉え、一方でリジェクションの非対称性は、上昇の失敗と下落の防御を比較します。これらの要素は統合され、BiasFromRaw()を用いてBullish、Bearish、またはNeutralの状態へとマッピングされます。
double meanClv=MeanCLV(1, InpCLVMeanBars); double rawBias=CalculateBias(rawData); bias=BiasFromRaw(rawBias);
有効化されている場合、バイアス平滑化は複数バーにわたる情報を取り込み、単発のローソク足に対する過敏性を低減します。バイアス状態の変化は、遷移が発生した確定足の終値において視覚的にマークされます。視覚的要素は、この分析を文脈化するために使用されます。コンプレッションゾーンはDrawCompressionBox()によって描画され、必要に応じてトリミング処理が適用されることで明瞭性が確保されます。
DrawCompressionBox(t1, t2, top, bottom, boxColor);
マーカーはレンジとの反復的な相互作用領域をハイライトし、履歴区間の陰影表示は持続的なコンプレッション期間を示します。スイングハイおよびスイングローはDrawSwingDots()によってマークされ、直近構造ラベルは局所的な構造ピボット周辺に追加的なコンテキストを提供しますが、分析ロジック自体には影響しません。
情報パネルは、成熟度状態、スコア、レンジ高さ、収縮率、オーバーラップ、バイアス状態、リジェクション回数などの主要指標を集約し、RenderInfoを通じて簡潔な縦リストとして表示します。このパネルは確定足データのみに基づいて現在のコンプレッション状態を要約します。
本実装は確定済みの価格データのみを用いて動作するため、遅行性インジケーターや将来予測的な仮定を排除しています。さらに、ヒゲトリミングやデッドドリフトフィルタリングといった防御機構により構造ノイズが抑制され、またパラメータの調整によって異なる銘柄や時間足への適用が可能となります。その結果として、観測可能な価格挙動のみに基づいてコンプレッションの発展を識別・監視するための構造化フレームワークが実現されます。
ツールのテストと観察結果
このセクションでは、実施したテストおよび得られた結果について説明します。これらのテストは、ライブチャートデータと履歴データを用いたバックテストの両方で実行されており、主にEURUSD銘柄に焦点を当てています。下図はストラテジーテスターで生成されたGIFであり、履歴データ上でのシステム挙動を示しています。

破線の矩形はアクティブなコンプレッションウィンドウを示します。その高さは、オプションのヒゲトリミング後に測定されたレンジを反映しており、内部的なローソク足のオーバーラップおよび境界との相互作用がコンプレッション品質の評価のために分析されています。左側の情報パネルには現在の分析状態が要約表示されており、成熟度分類、スコア、ウィンドウ高さ、収縮率、オーバーラップ、そして境界テストやリジェクションといった吸収メトリクスを含みます。バイアスはローソク足構造、すなわちCLVおよびリジェクションの非対称性から導出される構造的状態として個別に報告され、定性的な強度指標が付与されます。なお、この可視化は売買ロジックを示すものではない点に注意が必要です。スイングアノテーション(HL/LH)は追加的な構造コンテキストを提供しますが、コンプレッションロジック自体には影響しません。バイアス変化矢印は存在する場合、バイアス状態が遷移した確定足の終値に正確にアンカーされており、確定足ベースの評価のみを反映しています。
以下の図でも、同様の可視化を確認できます。この図もストラテジーテスターでキャプチャされたものです。

最後に、ライブチャートでのテストにおける図を確認できます。以上で視覚面の紹介は終了です。ストラテジーテスターで示されたのと同一の構造要素および視覚的規則はライブチャート動作においても維持されており、履歴再現とリアルタイム評価の間で一貫した挙動が確認できます。

これらの視覚的な要素を総合すると、コンプレッション構造、その発展段階、そして方向性コンテキストが、すべて確定足ベースでどのように進行していくかを明確に観察することができます。この一貫性により、チャートが過去データとして閲覧される場合でもリアルタイムで観測される場合でも、同一の方法で市場の分析状態を監視することが可能となり、売買ロジックや将来予測的仮定を導入することなく評価することができます。
結論
本記事では、確定足ベースで評価されるコンプレッション分析モジュールの実装について説明しました。本ロジックは、レンジ収縮、境界との相互作用、リジェクション挙動、ローソク足構造を評価することでコンプレッションの成熟度および方向性コンテキストを分類します。インジケーターや執行ロジック、あるいは予測的仮定は一切含まれていません。本モジュールは、より広範なプライスアクション分析ワークフローの中で分析コンポーネントとして機能することを目的としており、異なる銘柄や時間足に対して適用可能です。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/21109
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
初心者からエキスパートへ:流動性ベースの取引戦略の構築
MQL5入門(第38回):MQL5のAPIとWebRequest関数の習得(XII)
MQL5取引ツール(第15回):Canvas/ja/ぼかし効果、影描画、滑らかなマウスホイールスクロール
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索