📘

CCI 改造的起点:从计算逻辑换视角

◍ CCI 改造的起点:从计算逻辑换视角

CCI(商品通道指数)常规用法里,多数改动只动计算方法,不动指标本质。作者在前作中已验证过这类表层变体,本文转向更底层的计算逻辑重构,试图让指标从另一个角度刻画价格通道。 这种思路切换的直接价值在于:你能立刻在 MT5 里新建一个自定义指标,把标准 CCI 的均值与偏差公式替换掉,对比两条曲线在同一品种上的相位差。外汇与贵金属杠杆高、滑点突变频繁,这类实验仅作概率参考,不代表信号更优。 原文基于 2022 年 11 月 9 日发布的讨论,当时帖文获得 2580 次查看、2 条评论,说明通道类指标的算法微调在实盘社群中有稳定关注度。打开 MT5 自带的 CCI 源码,先读懂原逻辑,再动手改,是验证本文后续结论的唯一路径。

CCI 的对称陷阱与新口径分级

CCI 的计算很直白:当期价与均值的差,除以样本标准偏差。序列 2,1,1 和 21,11,1 翻译成盘面是横盘与强趋势,但两者算出的 CCI 值完全相同——小差值配小标准差,大差值配大标准差,除法把差异吃掉了。这显然违背交易者的直觉:特殊行情该有特殊的指标反应。 把除法换成乘法,差值和标准差同大时指标才会高亮。代价是指标量纲失控,无法预判边界。解法是指标自己按出现频率收集正负值分别建数组,再切百分比级别:设 70 级,即只有 30% 的值会超出该线。正负统计分开收集后,实测各选项正负级别互不相同,说明涨跌在指标视角下本就不对称。 回测 EURUSD H1(2021 全年)给了硬数据:经典 CCI 净利润 248.21,交易 823 笔;平方口径净利 -304.83,交易 3581 笔;新式净利 -567.15,交易 3251 笔。后两者笔数暴涨,提示触发级该往上提,降频才可能把效率拉回来。外汇与贵金属属高风险品种,上述结果仅反映历史样本,实盘须自测。 下面这段是分级存储的核心片段,正负值分开入数组、排序后按百分比写回级别线: int array_dn[], // array for storing positive values(存负向 CCI 转正的容器) array_up[], // array for storing negative values(存正向 CCI 的容器) size_dn=0,size_up=0;// array sizes(两个数组的当前长度) ArrayResize(array_up,size_up,rates_total);(按总柱数预扩正向数组) ArrayResize(array_dn,size_dn,rates_total);(按总柱数预扩负向数组) if(cci>0)(若当期 CCI 为正) { ArrayResize(array_up,size_up+1);(正向数组加一个槽位) array_up[size_up]=(int)MathRound(cci/_Point);(CCI 转点值四舍五入存入) size_up++;(正向计数加一) } if(cci<0)(若当期 CCI 为负) { ArrayResize(array_dn,size_dn+1);(负向数组加一个槽位) array_dn[size_dn]=(int)MathRound(-cci/_Point);(取反后存,方便统一排序) size_dn++;(负向计数加一) } ArraySort(array_up);(正向数组升序排) IndicatorSetDouble(INDICATOR_LEVELVALUE,0,array_up[size_up*level/100]*_Point);(按百分比索引写正级别线) ArraySort(array_dn);(负向数组升序排) IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-array_dn[size_dn*level/100]*_Point);(写回负级别线并复原负号)

MQL5 / C++
class="type">int array_dn[],         class=class="str">"cmt">// array for storing positive values
    array_up[],         class=class="str">"cmt">// array for storing negative values
    size_dn=class="num">0,size_up=class="num">0;class=class="str">"cmt">// array sizes
ArrayResize(array_up,size_up,rates_total);
ArrayResize(array_dn,size_dn,rates_total);
if(cci>class="num">0)
  {
   ArrayResize(array_up,size_up+class="num">1);
   array_up[size_up]=(class="type">int)MathRound(cci/_Point);
   size_up++;
  }
if(cci<class="num">0)
  {
   ArrayResize(array_dn,size_dn+class="num">1);
   array_dn[size_dn]=(class="type">int)MathRound(-cci/_Point);
   size_dn++;
  }
ArraySort(array_up);
IndicatorSetDouble(INDICATOR_LEVELVALUE,class="num">0,array_up[size_up*level/class="num">100]*_Point);
ArraySort(array_dn);
IndicatorSetDouble(INDICATOR_LEVELVALUE,class="num">1,-array_dn[size_dn*level/class="num">100]*_Point);

「窗口函数替换掉标准偏差后的真实表现」

CCI 的原始计算用的是价格与均值的差再除以平均绝对偏差,本质依赖差值服从正态分布。把样本量缩小并剔掉零值后画出来,分布形状很怪,根本不像正态钟形曲线。既然经验分布不买正态假设的账,继续用标准偏差做归一化就站不住脚,这一步直接退化成「半个 CCI」。 退化后指标不再做偏差标准化,数值散布会变大,大波段一来视觉上很冲;但换来的是对价格结构的裸暴露,这点比观感重要。原 CCI 里的均化环节,背后可以是算术中值、数学期望或矩形窗口,我们盯最后一种——为什么默认是矩形?因为窗口函数候选太多了,有名有姓的约五十个,没名字的无穷无尽。 实验挑了矩形、三角形、平顶(部分权重为负,很另类)三个对称窗,加线性、幂、指数三个不对称窗。MT5 移动平均线菜单里能直接见到线性和指数权重的平均值。图里最底下那条是经典 CCI,上面各窗型长得像但级别差很多:有的滞后重、大值频发,有的贴价、小偏差多。 顺手给指标加了两道平滑,不改计算本质,只让曲线顺眼些。另写个 EA 跑 hCCI,开平仓信号和前面完全一致,测试区间与参数不变。结果里只有指数窗净亏 -317.41,其余都正:矩形 224.57、三角形 94.17、平顶 236.54、LWMA 243.62、幂 44.57(单位按原测试标的计)。指数窗亏不代表不能交易,只是参数和平仓规则要重调——这条对所有版本 EA 都适用。外汇与贵金属品种波动剧烈,此类回测不代表实盘概率,请先在 MT5 策略测试器用历史数据自验。

◍ 把 CCI 搬上主图才有看头

前面一直把 CCI 当副图振荡器用,其实挪到主图表看更有意思。多数振荡指标的逻辑都是压住主信号、放大细微的价格动作,所以要把 CCI 移回主图,得给它的数值叠一个参考信号。 对 CCI 来说,参考信号可以选当前价格,也可以选平均值。两种算法都不算稳,数值可能大幅偏离价格线,但好处是能很清楚地把价格走势的趋势勾出来,这一点盖过了漂移的毛病。 在 MT5 里自定义指标时,把 CCI 缓冲区加上 Price 或 SMA 缓冲区的差值输出,就能直接在蜡烛图上画出这条线,肉眼比对趋势转折比看副图更快。外汇与贵金属波动大,这类主图叠加仅作辅助判断,高风险依旧存在。

别急着下结论

这套派生指标族把经典 CCI 拆成了 pCCI、hCCI、lCCI 三类可调变体,外加差值分布脚本与两套 EA,核心参数里 iPeriod 下限都是 2,iLevel 有效区间锁在 1–99,Window 与 Smoothing 决定窗函数和平滑方式。下载包里 mq5 与 mq4 双版齐全,pCCI.mq5 占 5.11 KB,EA_hCCI.mq5 为 8.6 KB,直接拖进 MT5 就能编译跑。 作者确认水平线按全历史计算,前约 1000 根 K 线内数值会浮动,之后稳定;这意味着回看早期信号时看到的是“事后水平”,做历史验证要留这段 warm-up 误差。外汇与贵金属杠杆高,这类自定义 CCI 变体只提供概率倾向,实盘前先用策略测试器跑够样本。 真要落地,建议先开 MT5 加载 Difference_Distribution.mq5,把 Length 设小一点看样品分布形状,再决定用哪版 CCI 接 EA。指标优势在可自定义,但优势不等于胜率,参数乱调反而放大噪音。

常见问题

对称口径下 CCI 把涨跌同等对待,容易在趋势中段误判反转;先检查是否用默认 14 周期且未区分趋势方向,再考虑换非对称分级。
窗口函数平滑了极端值扰动,小时图上假信号减少,但滞后略增;可用 20 周期窗口回看近 3 个月 XAUUSD 验证。
小布可在对应品种页直接叠加改造口径并标出分歧点,你只需打开看盘页选择指标变体即可省去手算。
主图只留关键阈值线(如 +100/-100 分级带),配合收盘价位置关系判强弱,避免把副图震荡细节全搬上来扰乱视线。
高风险品种里把 CCI 超买超卖当反转令是最常见坑;应结合结构位且默认概率倾向而非确定性,单笔控仓。