プライスアクション分析ツールキットの開発(第33回):Candle Range Theory Tool
内容
はじめに
ボラティリティは市場の主要な言語です。オシレーターが反転する前や、多くのトレンドフォロー型フィルタが反応する前に、価格はすでに1本のローソク足の中で明確な方向性を示しています。突然の値幅拡大は、大口参加者の積極的な取引を示すことが多く、長期的な収縮は次の動きを予測して流動性が引き上げられている可能性を示唆します。 また、前のローソク足の範囲内に収まる足は、一時的な迷いを示し、前の範囲を包み込む足は決定的なオーダーフローを示します。これらの挙動は明白ですが、堅牢で機械可読なプロセスとして形式化されることはほとんどありません。
本記事では、Candle-Range Theory (CRT)を紹介します。これは、完成したローソク足を以下の4種類の相互排他的なカテゴリーのいずれかに分類する簡潔なフレームワークです。
- Large-Range (LR):ローソク足の真の値幅が、最近のATRの設定可能な倍率を超える場合
- Small-Range (SR):値幅がATRの下限倍率よりも小さい場合で、収縮を示す
- Inside Bar (IB):ローソク足が直前の高値–安値範囲内に完全に収まる場合
- Outside Bar (OB):ローソク足が直前の高値と安値の両方を突破し、前の範囲を包み込む場合
CRTは、新しい不透明なインジケーターを導入するのではなく、以下の軽量で実運用に耐えるMetaTrader 5用ツールセットを通じて、これらの概念を明確に提供します。
- CRangePattern.mqh:ローソク足を定数時間で分類するヘッダー専用クラスです。 4つの価格配列(O/H/L/C)だけを使用し、各パターンのブール値フラグを返し、動的メモリは使用しません。
- CRT Indicator.mq5:各LR、SR、IB、OBローソク足を半透明の矩形や任意の矢印で強調表示するオーバーレイです。色、透明度、矢印、サイズは完全にカスタマイズ可能で、複雑なチャートテンプレートにも対応し、MT5の8バッファ制限を超えることはありません。
- CRT Expert Advisor.mq5:確定足のみに基づいて動作し、シグナルのリペイントを回避するアラートエンジンです。どのパターンでポップアップ、サウンド、プッシュ通知を出すかをフィルタ可能で、必要に応じてインジケーターを自動で添付し、視覚情報と音声情報を同期させたライブ取引や視覚的バックテストがおこなえます。
すべてのコンポーネントはMetaTrader 5 build 4180以降で警告なしにコンパイル可能で、#property strictに準拠しています。ATR計算に必要な最小限の履歴だけをコピーするため、高頻度チャートでもCPUへの負荷はごくわずかです。システムは各ローソク足の確定時にのみデータを処理するため、時間軸、通貨ペア、テストモードにかかわらず、出力は安定しています。
本チュートリアルの目的は以下の4つです
- LR、SR、IB、OBの正確な数学的定義を提供する
- CRangePatternクラスをインジケーター、EA、スクリプトに統合する方法を示す
- 軽量でチラつきのない表示、複雑なチャートレイアウトとの互換性を実現した設計方針を説明する
- テスターで安全なアラートを提供するエキスパートアドバイザー(EA)の動作を解説し、履歴・リアルタイム環境の両方でCRT信号を包括的に評価できるようにする
この記事を読み終える頃には、コンパクトで拡張可能なフレームワークを手に入れ、ボラティリティを明確で実用的な情報に変換し、裁量分析、自動取引、さらなる研究にすぐ活用できるようになります。
Candle-Range Theory Toolkitの利点
| 利点 | 詳細 | 実践的の効果 |
|---|---|---|
| 正確な定義 | LR、SR、IB、OBをATRベースの明確な価格関係式で計算 | 曖昧さを排除し、各ローソク足は1つのカテゴリにのみ属す |
| ノンリペイントロジック | 確定足でのみ計算、値の更新なし | チャート更新、最適化、ライブ取引でもシグナルが安定する |
| 最小データフットプリント | インジケーター、EAともにATR_Period+3本だけコピー | RAM使用量を削減し、ストラテジーテスターを高速化 |
| バッファを使用しない表示 | インジケーターバッファではなくチャートオブジェクトを使用して描画 | MT5の8バッファ制限を回避、複雑なテンプレートでも互換性あり |
| 完全なカスタマイズ | 色、透明度、矢印、ATR期間、大/小倍率を入力可能 | 個人・法人のチャートスタイルに柔軟に対応 |
| モジュール式アーキテクチャ | クラス、インジケーター、EAは独立ファイル(明確に定義されたインターフェースで連携) | 他のプロジェクトへのクラスの組み込みやインジケーターの差し替えがリファクタリングをおこなわずに可能 |
| strictモード準拠 | ビルド4180以降の#property strict buildで警告なくコンパイル | 将来のMTビルドでも互換性を維持 |
| ATR正規化 | 値幅の閾値がボラティリティに自動で調整 | 設定が通貨ペア、CFD、暗号資産、指数、先物間で再現可能 |
戦略の概要
Candle-Range Theory (CRT)は、完成したローソク足を4つのカテゴリーのうち1つにのみ分類します。直近のボラティリティを大幅に超える値幅を持つローソク足はLarge-Range (LR)とラベル付けされ、通常の値幅のごく一部に収まる場合はSmall-Range (SR)として扱われます。新しいローソク足の高値–安値が前のローソク足の範囲内に収まる場合はInside Bar (IB)となり、逆に前の高値と安値の両方を超える場合はOutside Bar (OB)としてマークされます。以下のセクションでは、これら4つのパターンを検出するための統計的基盤と正確なルールについて説明します。
True Range (TR)
TRはワイルダーによる生のボラティリティ指標です。期間中のすべての価格変動(ギャップも含む)を捉えるため、次の3つのうち最大値を取ります。
- 現在の高値 − 現在の安値
- |現在の高値 − 前回の終値|
- |現在の安値 − 前回の終値|
TR = max( Highₜ – Lowₜ, │Highₜ – Closeₜ₋₁│, │Lowₜ – Closeₜ₋₁│ )
単なる高値–安値幅ではなくTrue Rangeを用いることで、前日の終値と当日の始値のギャップも完全に捕捉でき、すべての銘柄や取引セッションで一貫したボラティリティ測定が可能になります。
ATR (Average True Range)
ボラティリティを文脈に置くためには、単なるTrue Rangeだけでは意味がありません。たとえば、EURUSDで25ピップスは大きな値幅ですが、XAUUSDで25ピップスは無視できる値幅です。Candle-Range Theoryでは、各期間のTrue Rangeを直近N本の平均で正規化することで、値幅の急激な変動を平滑化し、一貫したボラティリティの基準を提供します。
// Simple arithmetic ATR double ATR(const int shift,const int period, const double &H[],const double &L[],const double &C[]) { double sum = 0.0; for(int i = shift; i < shift + period; ++i) sum += MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); return sum / period; }
実際のCRTでは、ワイルダーの指数平滑法ではなく、単純算術平均を使用します。これは高速で透明性が高く、価格の挙動を分類する目的には十分だからです。デフォルトでは14本のローソク足を対象としており、ATRの標準設定と一致しています。
値幅倍率 – 客観的閾値
ATRをカテゴリ閾値に変換するために、ユーザー定義の2つの倍率を使用します。- largeMult(デフォルト = 1.5)
- smallMult(デフォルト = 0.5)
// ---- User-defined ATR multipliers -------------------------------------- input double largeMult = 1.5; // Bars ≥ 1.5 × ATR are flagged “Large-Range” input double smallMult = 0.5; // Bars ≤ 0.5 × ATR are flagged “Small-Range”これらのパラメータは次の疑問に答えます。
- 平均よりどれだけ大きければ「異常に大きい」と判断するか
- どれだけ小さければ「圧縮された値幅」と判断するか
ATR単位で閾値を定義することで、CRTは銘柄、時間軸、ボラティリティ環境に依存せず、設定をそのまま移植可能になります。
Large-Range (LR)バー:即時エントリーの根拠
ローソク足のTrue RangeがATRの選択倍率(largeMult)以上の場合、その足はLarge-Rangeとみなされます。// ---- Large-Range (LR) test --------------------------------------------- bool isLargeRange = (trueRange >= largeMult * atrCurrent);
大幅な値幅は、予定されたニュースやブロック取引によって引き起こされることが多く、このような大きな足は、持続的な方向性の動きの始まり、または前のトレンドの最終的な降参(キャピチュレーション)を示唆することがあります。情報量は非常に多く、何が起きたか(異常に広い値幅)は明確ですが、なぜ起きたか(決算発表、マクロデータ、強制清算など)は必ずしも明確ではありません。
Small-Range (SR)バー:ボラティリティ圧縮
逆に、True RangeがATRの選択倍率(smallMult)以下の場合、そのローソク足はSmall-Rangeと分類されます。 連続する小さな値幅は、流動性の低下、ディーラーのヘッジ、あるいは均衡したオーダーブックを示すことがあります。
// ---- Small-Range (SR) test --------------------------------------------- bool isSmallRange = (trueRange <= smallMult * atrCurrent);
SRバーが複数連続する場合、市場が次の拡張に入る前の小休止を示すことが多く、ブレイクアウトやストラドル戦略で有用です。
Inside Bars (IB):含みと迷い
ローソク足の範囲が前のローソク足の範囲内に完全に収まる場合、その足はInside Barとして分類されます。
// Inside-Bar test for the candle at 'shift' (e.g., shift = 1 → just-closed bar) bool isInsideBar = (High[shift] < High[shift + 1]) && // current high is lower than previous high (Low[shift] > Low[shift + 1]); // current low is higher than previous low
IBは活発なオーダーフロー(ストップ狩り、強制清算、積極的な蓄積・分配など)を示すことがあります。市場が前のローソク足の両側を通過するため、Inside Barは複数のストップ層を1セッションに圧縮し、(a)吸収が優勢なら持続的な反転、または(b)ブレイクアウトの流動性がすぐに消費される場合は元のトレンドの加速、の結果をもたらすことがあります。
相互排他性と優先順位
4つのカテゴリーは相互排他的に設計されており、1本のローソク足は最大で1つの定義にしか該当しません。
- LRまたはSRの場合、値幅の大きさルールが優先される
- LR・SRでない場合はIBを判定する
- IBでもなければOBを判定する
この優先順位により、解釈の重複がなくなり、アラートや視覚マッピングなどの下流ロジックも明確になります。
時間的規律 – 確定足処理
CRTは直近の確定ローソク足(bar 1)のみを分析し、形成中の足(bar 0)は無視します。これにより、ノンリペイントシグナルが保証され、リアルタイムで見ているものは、過去のバックテストで得られたものと正確に一致します。
生データから実用的な指標へ
各ローソク足を4つの状態のいずれかに分類することで、CRTは次を提供します。
- 自動売買戦略用の二値シグナルストリーム(各カテゴリごとのtrue/falseフラグ)
- 裁量取引用の視覚言語(色分けされたバーと矢印)
- アラートや追加フィルタ(トレンド、セッション、出来高)用のトリガーフレームワーク
コード解説
Candle-Range Theory (CRT)ツールキットは、意図的にモジュール化されています。各コンポーネント(ヘッダーファイル、インジケーター、EA)は、単一の明確に定義されたタスクを実行し、最小限のインターフェースを通じて他のコンポーネントと通信します。このセクションでは、MetaTraderが実行する順序に沿ってソースコードを解説し、各主要ブロックの目的と実装上の選択理由を説明します。
CandleRangeTheory.mqh:分類エンジン
このヘッダーは、まず「#property strict」で始まります。これにより、最新の型チェックが強制され、古いコンパイラの緩い規則が排除されます。その直後に、CRangePatternクラスが宣言されます。クラスのpublicデータメンバーであるatrPeriod、largeMult、smallMultは、ハードコーディングされた定数ではなくランタイムパラメータとして機能します。これにより、このヘッダーを含む任意のスクリプトが、クラス自体を再コンパイルすることなく挙動を調整できます。出力インターフェースは4つのブール値フラグisLarge、isSmall、isInside、isOutsideで構成されています。Calculate()が実行されると、正確に1つだけがtrueになります。呼び出し側のプログラムは、分析対象のローソク足で何が起きたかを判断するために追加の計算を行う必要はありません。
#property strict // enforce modern type checking #ifndef __CANDLE_RANGE_THEORY_MQH__ #define __CANDLE_RANGE_THEORY_MQH__ class CRangePattern { public: int atrPeriod; // ATR length double largeMult,smallMult; // LR / SR thresholds bool isLarge,isSmall, isInside,isOutside; // output flags double atr,trueRange,bodyRange;
コンストラクタでは実用的なデフォルト値を割り当てます。具体的には、ATRは14期間、large multiplierは1.5、small multiplierは0.5です。その後、privateのReset()ヘルパーを呼び出して、すべての結果フィールドを既知の状態にクリアします。ヘルパー関数を使用することで、コードの重複を避けられます。この同じルーチンは、コンストラクタ時と各計算の開始時の両方で呼び出されます。
private: void Reset() { isLarge=isSmall=isInside=isOutside=false; atr=trueRange=bodyRange=0.0; } public: CRangePattern() // default parameters { Reset(); atrPeriod=14; largeMult=1.5; smallMult=0.5; }
Calculate()自体は意図的に簡潔に設計されています。まず、十分な履歴があるかを確認します(bars < atrPeriod + sh + 2)。これは、ATRおよびTrue Rangeの計算が評価対象の前に少なくとも1本のローソク足を参照する必要があるためです。True Rangeおよび実体の範囲はWilderの定義に従って計算されます。これにより、このスクリプト内でも外部インジケーターでも、標準的なATRの読み取りと互換性が保証されます。
bool Calculate(const int sh, const double &H[],const double &L[], const double &O[],const double &C[], const int bars) { Reset(); if(bars < atrPeriod + sh + 2) // enough candles? return false; // true range of target candle trueRange = MathMax(H[sh]-L[sh], MathMax(MathAbs(H[sh]-C[sh+1]), MathAbs(C[sh+1]-L[sh]))); bodyRange = MathAbs(O[sh]-C[sh]);
ATRループは正確にatrPeriod回繰り返されます。前述の履歴チェックにより「i + 1」が必ず範囲内であることが保証されているため、内部の条件「&& i+1 < bars」は冗長となり、省略されています。このガードを削除することで、コードの経路が簡素化され、分岐が1つ減るため、高頻度データでのパフォーマンスが向上します。安全性を損なうことはありません。
double sum = 0.0; for(int i = sh; i < sh + atrPeriod; ++i) // exactly atrPeriod { double tr = MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); sum += tr; } atr = sum / atrPeriod;
平均が算出されると、関数はローソク足を分類します。True Rangeが上側の倍率を超える場合はisLargeが設定され、下側の倍率を下回る場合はisSmallが設定されます。さらに、前のローソク足の高値・安値との関係を評価する第二の比較層があり、状況に応じてisInsideまたはisOutsideが切り替わります。4つのフラグは相互排他的であるため、追加のチェックは不要であり、関数は完了を確認するためにtrueを返します。
if(trueRange >= largeMult*atr) isLarge = true; else if(trueRange <= smallMult*atr) isSmall = true; if(H[sh] < H[sh+1] && L[sh] > L[sh+1]) isInside = true; else if(H[sh] > H[sh+1] && L[sh] < L[sh+1]) isOutside = true; return true; } #endif
CRT Indicator.mq5:視覚表示
インジケーターファイルではバッファを一切使用せず、代わりにチャートオブジェクトのみを利用します。バッファを避けることで、MetaTraderの8バッファ制限を回避し、トレーダーが他のインジケーターと重ねて表示する余地を確保できます。初期化時には、Inputsダイアログからの入力値が、内部のCRangePatternインスタンス(名前はpat)のpublicフィールドに直接書き込まれます。その他のデータはグローバルに保存されないため、MetaTrader上でパラメータを変更すると、部分的な状態の引き継ぎではなく、完全な再初期化がおこなわれます。
#property indicator_chart_window #include <CandleRangeTheory.mqh> input int ATR_Period = 14; ... CRangePattern pat; int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return(INIT_SUCCEEDED); }
OnCalculate()は、MetaTraderが新しいデータが利用可能と判断した際に呼び出されます。関数はまず、チャートに少なくともatrPeriod + 3本のローソク足があるかを確認します。これは、ATRループが現在の足の前の1本を必要とすること、そしてCalculate()自体がshift + 1のローソク足を参照するためです。このサイズの履歴のごく一部だけが、4つのローカル配列(H、L、O、C)にコピーされます。各配列はシリーズとしてフラグ設定され、インデックス0が常に最新のローソク足を示すようになっています。
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { const int need = pat.atrPeriod + 3; if(rates_total < need) return rates_total; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C);
データが準備されると、pat.Calculate(1, …)が呼び出されます。shiftに1を渡すことで、解析は常に直近で確定したローソク足に対しておこなわれ、まだ形成中のローソク足には適用されません。分類の結果、どのフラグもアクティブにならなかった場合(すなわち、ローソク足がLargeでもSmallでもInsideでもOutsideでもない場合)、関数は即座に終了し、チャートには何も描画されません。パターンが検出された場合、インジケーターは表示プロパティを選択します。具体的には、ARGB値から算出される矩形の色(透明度の調整が可能)や、ユーザー設定に応じた矢印の種類と色です。
if(!pat.Calculate(1,H,L,O,C,need)) return rates_total; uint rClr = 0; // rectangle colour (ARGB) int aCode = 221; // ● default arrow color aClr = clrYellow; if(pat.isLarge) { bool bull = (C[1] > O[1]); rClr = ColorToARGB(bull?clrLime:clrRed,Opacity); aCode = bull ? 233 /*▲*/ : 234 /*▼*/; aClr = bull ? clrLime : clrRed; } else if(pat.isSmall) { rClr = ColorToARGB(clrYellow,Opacity); } else if(pat.isInside) { rClr = ColorToARGB(clrAqua,Opacity); } else if(pat.isOutside) { rClr = ColorToARGB(clrMagenta,Opacity);} else return rates_total; // nothing to draw
矩形の作成では、2つの時間座標が使用されます。shift 2のローソク足の始値と、shift 1のローソク足の始値です。これにより、対象ローソク足の全期間をカバーします。対象ローソク足の高値と安値が縦方向の境界を定義します。OBJPROP_FILLはtrueに設定されているため、矩形は枠だけでなく半透明のブロックとして表示されます。さらに、任意で矢印がローソク足の上または下に配置されます。矢印のオフセットはATRに比例して調整され、異なる銘柄やティックサイズでも視認性が確保されます。矩形と矢印の両方には、ローソク足の始値のタイムスタンプがタグ付けされます。これにより名前が一意となり、新しいオブジェクトを描画する前に、スクリプトが以前の重複を削除できるようになります。
datetime tClosed = iTime(_Symbol,_Period,1); string tagR = "CRT_RECT_"+(string)tClosed; string tagA = "CRT_ARW_" +(string)tClosed; ObjectDelete(0,tagR); // avoid duplicates ObjectCreate(0,tagR,OBJ_RECTANGLE,0, iTime(_Symbol,_Period,2),H[1], tClosed,L[1]); ObjectSetInteger(0,tagR,OBJPROP_COLOR,rClr); ObjectSetInteger(0,tagR,OBJPROP_FILL,true); ObjectSetInteger(0,tagR,OBJPROP_BACK,true); double y = (aCode==233 ? H[1]+0.2*pat.atr : L[1]-0.2*pat.atr); ObjectCreate(0,tagA,OBJ_ARROW,0,tClosed,y); ObjectSetInteger(0,tagA,OBJPROP_ARROWCODE,aCode); ObjectSetInteger(0,tagA,OBJPROP_COLOR,aClr); return rates_total; }
CandleRangeTheory.mq5:アラート生成
EAは同じヘッダーを共有しているため、分類ロジックも同一で決定的です。初期化時には、インジケーターでおこなわれたパラメータ転送の手順を複製します。さらに、EAがストラテジーテスターの非表示モードで動作しているかを確認します。その場合、Alert()やPlaySound()といったGUI機能を抑制し、バッチ最適化中の実行時エラーを防ぎます。
#include <CandleRangeTheory.mqh> input bool Push_Alerts = false; ... CRangePattern pat; const bool NonVisualTest = (bool)MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE); int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return INIT_SUCCEEDED; }
EAがライブチャートまたは視覚モードのテストにアタッチされると、iCustom()を使用してインジケーターを自動的に読み込みます。成功または失敗は、透明性を確保するためにエキスパート操作ログに記録されます。初期化解除時には、メモリリークやチャートの混雑を防ぐために、インジケーターのハンドルは手動で解放されます。
int indHndl = INVALID_HANDLE; int OnInit() { ... if(!NonVisualTest) { indHndl = iCustom(_Symbol,_Period,"CRT Indicator", ATR_Period,LargeXATR,SmallXATR); if(indHndl != INVALID_HANDLE) ChartIndicatorAdd(0,0,indHndl); } return INIT_SUCCEEDED; } void OnDeinit(const int reason) { if(indHndl != INVALID_HANDLE) IndicatorRelease(indHndl); }
コアロジックはOnTick()内にあります。EAはshift 1のローソク足の始値を記録し、その値が変化するまで再実行をおこないません。これにより、ティックの頻度に関係なく、確定したローソク足ごとに必ず1回だけ評価がおこなわれることが保証されます。コンパクトな履歴ブロックがコピーされます。このとき、配列は明示的にシリーズに変換され、CRangePatternの要件に整合させます。分類の結果、パターンが検出された場合、EAは銘柄、時間足、検出されたカテゴリを含む平易なメッセージを作成します。ポップアップ、サウンド、プッシュ通知はユーザー設定に従って発行されますが、現在の実行環境で許可されている場合に限られます。
datetime lastDone = 0; void OnTick() { datetime tClosed = iTime(_Symbol,_Period,1); if(tClosed == lastDone) return; // already processed lastDone = tClosed; const int need = pat.atrPeriod + 3; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C); if(!pat.Calculate(1,H,L,O,C,need)) return; string sig; if(pat.isLarge) sig="Large-Range bar"; else if(pat.isSmall) sig="Small-Range bar"; else if(pat.isInside) sig="Inside bar"; else if(pat.isOutside) sig="Outside bar"; if(sig=="") return; string msg = _Symbol+" "+EnumToString(_Period)+" "+sig; Print("[CRT-EA] ",msg); if(!NonVisualTest) Alert(msg); if(Push_Alerts) SendNotification(msg); }
EA全体で、オプションのデバッグ文が使用されており、インジケーターの正常なアタッチや十分な履歴がない場合などの動作に関する簡潔なフィードバックを提供します。これらのメッセージはDebugLogフラグに依存しているため、本番環境では通知なしで静かに動作させることができ、開発や研究のセッションでは詳細な情報を取得することが可能です。
input bool DebugLog = true; if(DebugLog) PrintFormat("[CRT-EA] Attached on %s %s (tester=%d)", _Symbol,EnumToString(_Period), (int)MQLInfoInteger(MQL_TESTER));
このツールキットでは、動作に明示的に必要なオブジェクト以外には、静的またはグローバルな可変状態を使用していません。チャート上で作成された動的オブジェクトは、親インジケーターが削除されるとMetaTraderによって自動的に解放されるか、コード内で明示的に削除されます。永続的に増加する配列は存在せず、各ティックごとに固定サイズのコピーと分類処理がおこなわれ、その計算時間はチャートの長さに依存しません。したがって、システムは週足チャートから1秒足まで、変更やパフォーマンスの劣化リスクなしにスケーリング可能です。
// inside any function needing history const int need = pat.atrPeriod + 3; double H[need], L[need], O[need], C[need]; // stack allocation in C++17 style // (or ArrayResize + quick release when the function exits)
テストと結果
このセクションでは、以下に示すライブテストの結果を検証します。
下のGIFは、CRT_EAによって動作するライブの5分足Step-Indexチャートを示しています。各バーが確定するたびに、色付きのボックス、マーカー、矢印が表示され、ボラティリティが縮小しているのか、拡大しているのか、前のレンジを完全に包み込んでいるのかが示されます。静かで狭い「Inside」バーが連続した後、突然大きな値幅のローソク足が現れ、勢いの急増を示します。舞台裏では、すべてのローソク足が現在のATRと瞬時に比較され再分類されるため、過去のバーをリペイントすることなく、連続した色分けされた市場エネルギーのスナップショットを取得できます。このリアルタイム表示により、市場が収束している時、ブレイクしている時、そして各バーがより大きなボラティリティサイクルにどのように寄与しているかを容易に把握できます。

| クラス | 矩形の色 | 矢印/マーカー | 意味 |
|---|---|---|---|
| Large-Range Bar (LR) | ロイヤルブルーの枠 | 強気ならライム、弱気なら赤 | 異常に広い範囲(範囲 ≥ largeMult × ATR) |
| Small-Range Bar (SR) | 黄色の枠 | 小さな黄色の点 | 圧縮範囲(範囲 ≤ smallMult × ATR) |
| Inside-Bar (IS) | アクアの枠 | アクアの点 | 高値 < 前回の高値、かつ、安値 > 前回の安値 |
| Outside-Bar (OB) | マゼンタの枠 | マゼンタの点 | 高値 > 前回の高値、安値 < 前回の安値 |
- Step Indexチャート
- Crash 1000 Indexチャート
- Boom 1000 Indexチャート
B
結論
Candle-Range Theoryツールキットは、MetaTrader 5におけるレンジ分析のための完全かつモジュール式のソリューションを提供します。
- CRangePattern:Large-Range、Small-Range、Inside、Outsideバーをリペイントせずに識別するコンパクトで自己完結型のクラス
- CRT_Indicator:色分けされたボックスと矢印でシグナルをチャート上にオーバーレイし、即座に視覚的解釈を可能にする
- CRT_EA:同じシグナルをアラートや自動注文に変換する
すべてのパラメータ(ATR期間、小/大倍率、アラートルール)は完全に設定可能で、任意の銘柄、時間足、ボラティリティ環境に適応できます。検出ロジックが描画や実行層から分離されているため、スキャナー、ダッシュボード、あるいはフル取引システムに最小限のコード変更で組み込むことも可能です。
このツールキットは教育目的で設計されており、ライブ運用の前に必ずデモ口座でテストされるべきです。客観的なレンジシグナルを、ご自身の取引選択ルールやリスク管理ルールと組み合わせることで、方法論が全体の戦略に適合していることを確認できます。
このように活用することで、Candle-Range Theoryはボラティリティイベントを迅速に識別して視覚化し、明確かつ自信を持って行動するための力を提供します。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18911
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5サービスからPythonアプリケーションへのMetaTraderティック情報アクセス(ソケット使用)
MQL5取引ツール(第6回):パルスアニメーションとコントロールを備えたダイナミックホログラフィックダッシュボード
初心者からエキスパートへ:MQL5を使用したアニメーションニュースヘッドライン(VII) - ニュース取引におけるポストインパクト戦略
MQL5入門(第19回):ウォルフ波動の自動検出
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索