做这系列到第 12 期,我发现一个规律:最危险的错误不是"跑不动",而是"跑得动但你不知道它跑偏了"。这份公式属于后者——它甚至语法全对,只是藏着一条没人用的废代码链。
一、先说它能跑、逻辑也对
快速扫一遍,核心是一条"四重超卖共振"的抄底链:
D6 = RSI(7) 从低于 20 拐头向上(超卖反弹,5 日内去重)。
D8/D9 = 加权均价的 98% 与 DMA 动态支撑线对比(动态支撑区)。
D11 = KDJ 的 J 值拐头向上(低位回升)。
偏差 = CCI(14) 深度超卖(小于 -100)且拐头。
最后 XG = D6(RSI金叉)AND T1(动态支撑 + KDJ拐头 + CCI深度超卖拐头)。这是标准的"多指标超卖共振抄底"。
思路完全正确,属于"教科书级抄底公式"。但问题就藏在开头那几行。
二、一整条死代码链,从头死到尾
源码前两行到第四行:
D1:=SUM(IF(H>REF(H,1),H-REF(H,1),0),15);
D2:=SUM(IF(L>REF(L,1),0,REF(L,1)-L),15);
主升:=D1/(D1+D2);
D3:=CROSS(0.8,主升);
这四行算的是"主升动能"(15 日上涨动能占比 + 跌破 0.8 的拐点)。但翻到最后一行的 XG,D1、D2、主升、D3 一个都没出现。它们只互相喂养,最后谁也没进信号。
我做了张"变量存活表",一眼看清哪些变量真用上了:
| 变量 | 含义 | 最终去向 | 状态 |
|---|---|---|---|
| D1 / D2 | 上涨/下跌动能 | → 主升 | 死 |
| 主升 | 动能占比 | → D3 | 死 |
| D3 | 动能跌破0.8 | 无 | 死 |
| D4→D5→D6 | RSI(7)金叉 | → XG | 活 |
| D7→D8 | 动态支撑98% | → T1→XG | 活 |
| D9 | DMA动态线 | → T1→XG | 活 |
| D10→D11 | KDJ的J拐头 | → T1→XG | 活 |
| 偏差 | CCI(14)超卖 | → T1→XG | 活 |
这是典型的"复制粘贴没收干净"——作者大概率从某个"主升 + 抄底"复合公式里摘了一段,只留了抄底链,主升动能链既没删干净、也没接进 XG。通达信不报错,但会让读者以为这公式"既看主升又看抄底",其实主升部分压根没参与。
三、回测:弱市里接了 385 把飞刀
沪深 300 成分股,2025-09-22 到 2026-07-23(这段是弱市:煤炭涨、电子跌,宽度持续收窄),扫描 XG 信号:
| 信号数 | 20 日平均收益 | 胜率 |
|---|---|---|
| 385 个 | +0.15% | 45.5% |
胜率 45.5%(略低于抛硬币),20 日平均收益几乎归零。结论很扎心:在这段弱市里,RSI + KDJ + CCI 三重超卖共振,本质是"接飞刀"——超卖之后可以更超卖,四个指标一起超卖,往往意味着趋势还在加速向下。
四、适用环境
牛市初中期 ✓ 宽幅震荡 ✓ 单边熊市 ✗
抄底公式的死穴从来不是逻辑,是环境。它在"跌多了会反弹"的市场阶段有效,在"跌多了还能跌"的弱市里就是持续亏。这跟第 11 篇"主力超短线"一样——都需要大盘宽度够才该出手。
五、怎么用才对
清理:直接删掉 D1、D2、主升、D3 四个死变量,信号完全不变,公式更干净、更省算力。
加环境过滤:像第 1 篇"龙头启动"那样,给 XG 加一道"大盘强势时才出"的闸门,熊市自动熄火。
死代码不影响信号,但"以为自己考虑了主升动能"会误导你的判断——这才是真代价。
六、三个启发
看公式别只看"报不报错",要看"每个变量是不是真用上了"。不报错的死代码,比报错更会骗人。
四重共振听着高级,弱市里是四个一起接飞刀。指标越多,越要在对的环境里用。
抄底公式的死穴是环境,不是逻辑。逻辑再漂亮,熊市里也白搭。
清理版公式(已删除 4 个死变量,信号与原文一致,可直接复制进通达信):
D4:=REF(CLOSE,1);
D5:=SMA(MAX(CLOSE-D4,0),7,1)/SMA(ABS(CLOSE-D4),7,1)*100;
D6:=FILTER(REF(D5,1)<20 AND D5>REF(D5,1),5);
D7:=MA((2*C+H+L)/4,5);
D8:=D7*(200-102)/100;
D9:=(1-7/100)*DMA(C,ABS((2*C+H+L)/4-MA(C,20))/MA(C,20));
D10:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
D11:=3*SMA(D10,3,1)-2*SMA(SMA(D10,3,1),3,1);
偏差:=((H+L+C)/3-MA((H+L+C)/3,14))/(0.015*AVEDEV((H+L+C)/3,14));
T1:=D8<D9 AND D11>REF(D11,1) AND REF(D11,1)<REF(D11,2) AND 偏差<-100 AND 偏差>REF(偏差,1);
XG:D6 AND T1;
你打开自己写的公式,搜一下有没有"定义了、却从没在最后输出里出现"的变量——如果有,恭喜,你写了段没人看的代码。删了它,公式不会变,但你对自己在干什么会更清楚。
