RSIが70以上・30未満で逆張りするEAと同じ発想で、「CCIが+100を超えたら」
「-100を下回ったら」という条件だけでCCI逆張りEAを作ろうとすると、
1つ見落としがちな違いがあります。
RSIは0〜100の範囲に収まる指標ですが、CCIには上限・下限がなく、
強いトレンド時には±300やそれ以上まで振れます。
同じ「閾値を超えたら逆張り」という設計でも、CCIでは閾値の意味がRSIとは異なります。
この記事では、CCIが+100を上回った・-100を下回ったタイミングで逆張りエントリーするEAを、
RSI版との設計上の違いと、確定足で判定してシグナルのブレを防ぐ実装とあわせて、
実際に動くコードで解説します。
設計の考え方: CCIは「閾値を超えた量」に上限がない
RSIは0〜100に正規化された指標のため、70や30という閾値は「全体のどの位置にいるか」
を表す固定的な基準として機能します。
一方CCIは移動平均からの乖離を統計的な標準偏差で正規化した指標で、
理論上の上限・下限がありません。
+100を超えた状態が、そのまま+250、+300まで伸びることも珍しくありません。
つまり、「CCIが+100を超えたら売られすぎ/買われすぎ」
という判定は、RSIの70/30ほど絶対的な基準にはならず、
強いトレンドの初動でもすぐに条件を満たしてしまいます。
この記事のEAでは、閾値(Level)をinput変数として外に出し、
通貨ペアや時間足ごとにバックテストで検証しながら調整することを前提にします。
固定値をそのまま信じず、検証対象にする、という考え方自体がCCI設計の核心です。
RSI版との差分: 確定足で判定する
RSI逆張りEAの記事のコードは`iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,0)`のように`shift=0`(形成中の最新足)でRSIを取得していました。
形成中の足は価格が動くたびにRSIの値も変わり続けるため、同じ足の中で条件を満たしたり満たさなくなったりを繰り返す(エントリー判定がブレる)ことがあります。
この記事のCCI版では、CCI矢印インジケーターの記事と同じく`shift=1`(1つ前の確定足)を使います。
確定済みの値で判定するため、一度エントリー条件が成立すればその足の間に条件が覆ることはありません。
double cci = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, 1);//1本前の確定足
実際に動くコード全体
自分のポジションだけを判定する`HasPosition()`と損切り設定を含めた、
実際にMetaEditorでコンパイルできるEAです。
//+------------------------------------------------------------------+
//| CCIReversalEA.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
input int CCIPeriod = 14;//CCIの計算期間
input double Level = 100.0;//これを超えたら逆張り対象とみなす閾値
input double Lots = 0.1;//ロット数
input int StopLoss = 200;//損切り(pips)
input int TakeProfit = 200;//利確(pips)
input int Slippage = 3;//スリッページ
input int MagicNumber = 20260913;//マジックナンバー
//+------------------------------------------------------------------+
//| このEA(マジックナンバー)のポジションを保有しているか判定する |
//+------------------------------------------------------------------+
bool HasPosition()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//既にポジションを持っている場合は新規エントリーしない
if(HasPosition())
return;
//1本前の確定足でCCIを判定する(形成中の足はシグナルがブレるため使わない)
double cci = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, 1);
int ticket = -1;
//CCIが+Levelを超えている(買われすぎ)なら逆張りショート
if(cci > Level)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage,
Bid + StopLoss * Point,
Bid - TakeProfit * Point,
"CCI Reversal Short", MagicNumber, 0, Red);
if(ticket < 0)
Print("売り注文に失敗しました。エラーコード=", GetLastError());
}
//CCIが-Levelを下回っている(売られすぎ)なら逆張りロング
else if(cci < -Level)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage,
Ask - StopLoss * Point,
Ask + TakeProfit * Point,
"CCI Reversal Long", MagicNumber, 0, Lime);
if(ticket < 0)
Print("買い注文に失敗しました。エラーコード=", GetLastError());
}
}
//+------------------------------------------------------------------+
MetaEditorで実際に動かす手順
- MT4の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」からウィザードで「Expert Advisor(テンプレートを使用)」を選び、名前を「CCIReversalEA」にして作成する(あとの画面は「次へ」を数回押して「完了」まで進めれば構いません)
- テンプレートの中身を全て削除し、上のコードを丸ごと貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- 「表示」→「ストラテジーテスター」でExpert Advisorに「CCIReversalEA」を選び、通貨ペアと期間を指定してバックテストで動作を確認する
- デモ口座でのフォワードテストを経てから、本番運用を検討してください
コピペしてコンパイルが通らない・想定通りエントリーしないときに確認すること
- 拡張子が「.mq4」になっているか
- Levelを極端に低い値(例: 50)にしていないか(低すぎるとCCIが頻繁に閾値を超え、トレンド相場でも逆張りを連発してしまう)
- OrderSend失敗時にエラーコード130(Invalid stops)が出た場合、StopLoss・TakeProfitの値をブローカーの最小ストップ距離より大きくしてください
- バックテストで一度もエントリーしない場合、対象期間・通貨ペアでLevelを一時的に下げて動作自体を確認してから、実際の閾値に戻すとデバッグしやすくなります
実運用する前に確認しておきたいこと
CCIの逆張りは、レンジ相場では有効に機能しやすい一方、CCIには上限・下限がないため、
強いトレンドが発生すると閾値を超えたままさらに同方向へ伸び続け、
逆張りエントリーが連続して損切りになることがあります。
実運用する前に、次の点を確認してください。
- トレンド相場かレンジ相場かを判断する指標(ADXやMAの傾きなど)と組み合わせることを検討する
- Levelの値は通貨ペア・時間足ごとにバックテストで検証し、固定値を信じ切らない
- ロット数(Lots)は口座残高に対して過大にならないよう調整する
- バックテストの結果は過去データに基づくものであり、将来の相場でも同じ成績になるとは限らない
まずはデモ口座、または少額のロットでのフォワードテストを行ってから、
本番運用を検討してください。
まとめ
CCIはRSIと違って0〜100のような範囲の上限・下限がないため、
「閾値を超えたら逆張り」という設計そのものはRSI版と同じでも、
閾値(Level)の妥当性を通貨ペア・時間足ごとに検証する必要があります。
またこの記事では、形成中の足ではなく確定足(shift=1)でCCIを判定することで、
同じ足の中でエントリー判定がブレる問題を避けています。
RSI逆張りEAと並べて比較すると、指標の性質に応じてEA設計をどう変えるべきかが見えてきます。
コメント