CCIとADXを組み合わせる考え方 — トレンド強度でシグナルの読み方を切り替える設計

平均的な価格水準からの乖離(かいり)をもとに過熱感を測るCCI(商品チャネル指数)と、上昇・下降の向きを問わず「トレンドがどれだけ強いか」だけを測るADX(平均方向性指数)。本記事では、この2つを組み合わせて、ADXで相場環境を仕分け、その結果に応じてCCIシグナルの読み方そのものを切り替える設計を整理します。想定読者は、CCIの±100タッチで逆張りしてトレンドに切られた経験のある方、環境認識を組み込んだcBotを自作してみたい方です。特定の設定が成果を保証するという話ではなく、実装へ落とし込む際の考え方を共有することが目的です。

上段に価格、中段にCCI、下段にADXを並べ、ADXが低いレンジ局面ではCCIの反転を逆張り候補、ADXが高いトレンド局面では順方向の動きを手がかりとして読み分ける模式図

CCIの役割

CCIは、現在の価格が「平均的な水準からどれだけ離れているか」を指数化した指標です。典型的には±100の外側を過熱の目安とし、レンジ相場では+100超からの反落や-100割れからの反発を逆張り候補として読む使い方が知られています。一方で、+100の上抜けを「勢いの発生」と捉えて順張りの手がかりにする流儀もあります。指標そのものの読み方はCCIの基礎で解説しています。

単独使用時の最大の問題は、この2つの読み方が正反対だという点です。いま逆張りで読むべき局面なのか、順張りで読むべき局面なのかを、CCI自身は教えてくれません。トレンド発生中に±100からの逆張りを続ければ一方向に切られ続け、レンジの最中に+100超えを追いかければ往復のノイズに巻き込まれる。どちらの失敗も、指標の欠陥というより「環境に合わない読み方を適用したこと」から生じる構造的な弱点です。

ADXの役割

ADXは、方向を示さず「トレンドの強さ」だけを数値化する指標です。一般に25以上でトレンドが明確、20未満でレンジ気味という水準が目安として使われます。読み方の詳細はADXの基礎にまとめています。

ADXの限界は、単独ではエントリーの向きもタイミングも決められないことです。加えて、計算の性質上、トレンドの発生から数値の上昇までには遅れがあり、ADXが25を超えた頃には初動が終わっている場合もあります。あくまで「いまの相場がどういう性格か」を測る環境認識の物差しであり、引き金は別の指標に任せる必要がある指標だと考えられます。

なぜこの組み合わせか

多くの組み合わせでは、一方が他方のダマシをふるい落とす「フィルター」として働きます。CCIとADXの関係はもう一歩踏み込んでいて、ADXの水準によってCCIシグナルの意味づけ自体を切り替えるところに核心があります。

「CCIが-100を上抜けた」という同じ事象でも、レンジなら反発の始まりかもしれませんが、下降トレンドの最中なら一時的な戻りにすぎない可能性が残ります。この文脈の違いを数値として与えてくれるのがADXです。CCIの弱点(読み方が環境に依存する)をADXが補い、ADXの弱点(向きと引き金を持たない)をCCIが補う補完関係と考えられます。

ただし、前述のとおりADXには遅れがあるため、環境の切り替わり目では仕分けを誤る場面が生じます。レンジからトレンドへの移行初期に「レンジモードの逆張り」が新しいトレンドに切られるケースは残るので、損切りを前提にした設計と、どの銘柄・時間足でどの程度機能するかをバックテストで確かめる工程が前提になります。似た発想でオシレーターとADXを組み合わせる設計はADXとRSIの組み合わせでも扱っています。

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

CCIは期間14や20が出発点としてよく使われます。短くするほど±100の外側への往復が増えて敏感になり、長くするほどシグナルは減って滑らかになります。ADXは期間14が広く知られた出発点です。

この組み合わせで効き方を大きく左右するのは、CCIの期間よりも環境判定のしきい値(20/25など)の置き方です。ここを動かすと「レンジモードで動く時間」と「トレンドモードで動く時間」の配分が変わり、ロジック全体の性格が変わります。しきい値に唯一の正解はなく、対象の銘柄・時間足でのADXの分布を観察しながらバックテストで決めていく領域です。短期足ほど環境の切り替わりが頻繁になり、中間帯での見送りも増える点は考慮に入れておきます。

cBot化する際の考慮点

実装の中心は、判定順序を「環境 → シグナル」に固定することと、モードが切り替わった瞬間の挙動を先に決めておくことです。

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

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

double adx = dms.ADX.Last(1);

if (adx < 20)
{
    // レンジモード: -100からの反発を逆張り候補として評価
    bool crossedUp = cci.Result.Last(2) <= -100 && cci.Result.Last(1) > -100;
    // → 候補が成立した場合のみリスク確認へ進む
}
else if (adx >= 25)
{
    // トレンドモード: 逆張り条件は評価しない
    // 順方向の条件(例: 上昇方向への+100再上抜け)だけを見る
}
// 20〜25の中間帯は見送り(次の足まで何もしない)

実装の流れ

処理を上流から並べると、次のようになります。

  1. 足の確定: OnBarで確定バーの値のみを使います。
  2. 環境判定: ADXの値でレンジ・トレンド・中間帯を仕分けます。中間帯は以降を評価せず見送ります。
  3. シグナル判定: 現在のモードに対応するCCI条件だけを、2時点比較で検出します。
  4. リスク確認: 変動幅を基準に損切り幅を先に設計し、成立しないセットアップは見送ります。
  5. 発注・記録: 判定時のADX・CCIの値とモードを記録し、後からモード別に成績を検証できるようにします。

足の確定からADXによる環境仕分け、モード別のCCI判定、リスク確認、発注・記録までの処理フロー図。中間帯では判定を見送り次の足へ進む

どう活用するか

「環境で読み方を切り替える」という骨格は、CCIをRSIやストキャスティクスに置き換えても崩れない、使い回しの効く設計です。自分で組んでみたい方は、Claude Codeを併走させたcBot開発の設計メモとして本記事の構成を活用してみてください。作るより相談したいという方は、ai-programming.xyzで個別の実装相談を承っています。体系的に学びたい方に向けては、スクールでこうした環境認識つきロジックを実装しながら学べます。

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