CCIとATRの組み合わせ — 過熱感の判定にリスク幅の物差しを添える設計

CCI(商品チャネル指数)は、価格が平均的な水準からどれだけ離れているかを数値化し、±100の外側を過熱の目安として使う指標です。ただし、その数値だけを見ていても「反転したときにどれだけの値幅を見込んで損切りを置くか」は分かりません。本記事では、CCIが出す反転候補に対して、ATRで値幅の大きさを測り、損切り幅の設計と静かすぎる局面のフィルターとして添える組み立て方を整理します。想定読者は、CCIの反転シグナル自体はあるのに、損切り幅をどう決めるかで手が止まっている方です。

上段に価格とCCIの±100ライン、下段にATRのバーを配置し、CCIの反転点でATRの水準を確認してから損切り幅を決める様子を示す模式図

CCIの役割

CCIは、典型的価格が移動平均からどれだけ乖離しているかを指数化した指標で、±100の外側からの戻りを反転候補として読む使い方が知られています。読み方の詳細はCCIの基礎にまとめています。

CCIが示すのは「どの方向へ、どのタイミングで反応しやすいか」という入口の候補だけです。反転がどれくらいの値幅で進みやすいか、損切りをどこに置けば早すぎず遅すぎないかという出口側の情報は持っていません。同じ±100超えからの戻りでも、値動きが乏しい時期と荒い時期とでは、その後に必要な損切り幅がまったく違います。この点を無視して固定幅の損切りを当てはめると、静かな時期には広すぎ、荒い時期には浅すぎるという食い違いが常に起こります。

ATRの役割

ATR(Average True Range)は、前の足の終値を含めた実質的な値幅を一定期間で平均した指標です。上げ下げの方向は持たず、「いまどれくらい動いているか」という大きさだけを返します。

方向を持たないぶん、単独ではエントリーの根拠になりません。もう一つの限界は、過去の値幅を平均している性質上、状態の急変には追随が遅れることです。またATRの値は価格の単位で返るため、銘柄や時間足が変われば桁も変わり、固定値のしきい値をそのまま使い回すことはできません。比較に使う前に、価格に対する比率などへ相対化する工程が必要になります。

なぜこの組み合わせか

CCIとATRの関係は、シグナルの発生源を分け合うのではなく、入口をCCIに、出口側の設計をATRに割り当てる役割分担です。CCIの弱点である「値幅の情報を持たない」という部分を、ATRがそのまま補います。

具体的には二つの使い方があります。ひとつは損切り幅そのものの決定で、CCIが反転候補を示した時点のATRを基準に、そのときの値幅に見合った幅を置きます。固定pips幅ではなく変動幅基準にすることで、時期ごとの値動きの大小に合わせた幅を毎回計算できます。もうひとつはフィルターとしての使い方で、ATRが極端に小さい局面ではCCIの±100超えがわずかな値動きだけで起きている可能性が高いため、判定そのものを見送る候補にします。値幅が乏しい時期の反転候補は、反発の始まりというより誤差に近い振れであることが多いためです。

この組み合わせは、シグナルの信頼性を多角的に判定する材料として機能することが期待できますが、ATRも遅行指標であるため、値幅が急に広がり始めた直後は判定が追いつかない場面が残ります。損切り幅の計算に使うATRの参照タイミングを一つに固定し、後から値幅の測り方自体を見直せるように記録を残しておくことが前提になります。似た構成でATRを局面判定のスイッチとして使う設計はATRとRSIの組み合わせ、CCIを環境認識で読み替える設計はCCIとADXの組み合わせでも扱っています。

パラメータをどう考えるか

CCIは期間14や20が出発点としてよく使われます。短くすると±100外への往復が増えて反応が早まり、長くすると滑らかになる代わりにシグナルは減ります。ATRの期間は、短くすると直近の変化に敏感になり、長くすると平均的な水準へ寄ります。

この構成で効き方を左右しやすいのは、損切り幅に掛けるATRの倍率と、フィルターとして使う「値幅が乏しい」の線引きです。倍率を大きくすれば損切りまでの余地は広がりますが、その分リスクリワードの比率が悪化しやすくなります。どちらも唯一の正解があるわけではなく、対象銘柄と時間足でのATRの分布を確認しながら、バックテストで検証する前提の値です。

cBot化する際の考慮点

実装の中心は、CCIの反転判定とATRの値幅計算を独立させたうえで、判定順序を固定することです。

判定部分の骨組みを疑似コードで示します。

// OnBar内: 確定した1本前の足で判定する
var cci = Indicators.CommodityChannelIndex(20);
var atr = Indicators.AverageTrueRange(14, MovingAverageType.Exponential);

double cciPrev = cci.Result.Last(2);
double cciNow  = cci.Result.Last(1);
double atrNow  = atr.Result.Last(1);

bool crossedUp = cciPrev <= -100 && cciNow > -100;   // 2時点比較での反転候補
double stopDistance = atrNow * StopAtrMultiplier;     // 値幅基準の損切り幅
double lots = RiskAmount / (stopDistance / SymbolInfo.PipSize * SymbolInfo.PipValue);
// → crossedUp かつ ATRが下限を上回る場合のみ発注候補へ

実装の流れ

処理は、CCIで反転候補を検出する系列と、ATRで値幅を測る系列を並行して更新し、両者を合流させて発注可否を決める流れになります。

CCIとATRを並行して更新し、CCIの反転候補とATRの値幅フィルターを合流させ、損切り幅とロットを計算してから発注・管理へ進むフロー図

  1. 入力: 対象と時間足を決め、CCIとATRを確定済みのバーで更新します
  2. 反転候補の検出: CCIの2時点比較で±100超えからの戻りを検出します
  3. 値幅フィルター: ATRが下限を上回っているかを確認し、乏しい局面は見送ります
  4. リスク計算: 通過した候補に対し、ATR基準の損切り幅から発注ロットを計算します
  5. 発注・管理: 計算済みの幅とロットで発注し、決済の管理へ引き継ぎます

CCI側の判定とATR側の判定を1つの複合条件にまとめず、それぞれ独立した値として記録しておくと、どちらの条件で何回弾かれたかを後から集計でき、しきい値や倍率の見直しに使える材料が残ります。

どう活用するか

自作派の方は、Claude Codeでこの構成のcBotを組む際、入口の指標と出口側のリスク計算を別クラスに分けておく設計メモとして流用してみてください。委託派の方は、ai-programming.xyzで実装を相談するとき、「損切り幅はATR基準で可変にしたい」という要件を最初に共有すると仕様の詰めが早く進みます。教育派の方は、手元にあるCCI単体のロジックへ値幅基準の損切り計算を後から足す課題として扱うと、入口と出口を分けて設計する考え方を確認できます。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。