做这系列到第 11 期,我最怕两种公式:一种是上期那种一眼报错的有 bug 版;另一种是能跑、但你永远不知道它跑错了的暗坑版。
这份"主力超短线选股"属于后者。语法完全合法,通达信能存、能出信号。我逐行扫完,差点以为又是份干净公式——直到看到最后那行。
一、先说它写对了什么
快速扫一遍,逻辑其实挺完整:
TJ = 价格低于 15 日均线,且最低价低于近 20 日最高价的 90%(深调支撑区)。
HYX = 20 日 EMA;QD = 20 日加权慢线(典型价加权)。
HY = 收盘价同时上穿 HYX 和 QD,且 QD 在 HYX 下方(多头雏形)。
HY2 = HYX 上穿 QD(均线金叉)。
HY3 = HY 再加 TJ 深调约束。
YYCDXNH = 同时上穿至少 3 条均线 + 四条均线高度粘合(最大/最小比值 ≤ 1.03)+ 站上 60 日线 + 20 日均线向上。
这部分是"均线粘合后多头起爆"的经典写法,没问题。
核心思路很清楚:多条均线粘合发散 + 价格上穿 + 深调支撑,是典型的超短线起爆形态。逻辑自洽,能直接用。
二、致命暗坑在最后一行
原版最后一行是这么写的:
主力起爆:(HY AND HY2) OR (HY AND HY3) OR (HY2 AND HY3) OR (HY AND HY2 AND HY3) AND YYCDXNH;
问题就在这:在通达信(和几乎所有编程语言)里,AND 的优先级高于 OR。所以这一长串,实际被解析成:
A OR B OR C OR (D AND YYCDXNH)
(A/B/C/D 是前四个金叉组合,YYCDXNH 是均线粘合约束)
看懂了吗?前面三个分支(A、B、C)根本不需要 YYCDXNH 就能触发。只有最后一个分支 D 需要满足均线粘合——而 D 是 A/B/C 的交集,本来就是最严的。
作者真正想要的,显然是:
主力起爆:((HY AND HY2) OR (HY AND HY3) OR (HY2 AND HY3) OR (HY AND HY2 AND HY3)) AND YYCDXNH;
(把前面所有 OR 用括号包起来,再统一 AND YYCDXNH)
就差一对括号,意思完全变了。
三、回测数据:93% 的假信号
沪深 300 成分股,2025-09-22 到 2026-07-23,两种写法分别扫描,统计 20 日收益:
| 版本 | 触发信号 | 20 日平均收益 | 胜率 |
|---|---|---|---|
| 原版(YYCDXNH 基本失效) | 454 个 | +1.40% | 44.0% |
| 修复版(加括号约束) | 31 个 | +1.86% | 53.3% |
加上那对括号,信号从 454 个骤减到 31 个(缩减 93.2%),胜率从 44%(约等于随机)拉到 53.3%,收益也更高。
这就解释了为什么暗坑比语法错更可恨:语法错你会立刻发现公式跑不动;暗坑让你以为在选股,其实在随机买。
四、公式体检评分
语法合规: 9 / 10(能保存、能运行,无语法错)
逻辑严谨: 4 / 10(AND/OR 优先级暗坑,YYCDXNH 形同虚设)
信号质量(原版): 2 / 10(泛滥 454 个,胜率随机)
信号质量(修复版): 8 / 10(精选 31 个,胜率 53%)
五、适用环境
牛市初中期 ✓ 震荡转多头 ✓ 单边熊市 ✗
这公式本质是"均线粘合后发散",依赖的是多空平衡被打破后的趋势惯性。熊市里均线黏合少、假突破多,即使修复了括号,信号质量也会下降——适合在宽度够的市场阶段用。
六、三个启发
OR 和 AND 混用,永远加括号。不要赌自己记得优先级,一对括号成本为零,漏一对代价是 93% 假信号。
能跑的公式不代表跑对了。语法错是明枪,优先级暗坑是暗箭;后者更该警惕。
好公式该让你"等得有点不耐烦"。从 454 砍到 31,不是信号变少,是噪音被滤掉了。
修复版公式(可直接复制进通达信,请先删除同名旧公式):
TJ:=L<MA(C,15) AND L<REF(HHV(C,20),1)*0.9 AND MA(C,15)<REF(HHV(C,20),1)*0.9;
HYX:=EMA(CLOSE,20);
ZJ:=(3*CLOSE+LOW+OPEN+HIGH)/6;
QD:=(20*ZJ+19*REF(ZJ,1)+18*REF(ZJ,2)+17*REF(ZJ,3)+16*REF(ZJ,4)+15*REF(ZJ,5)+14*REF(ZJ,6)+13*REF(ZJ,7)+12*REF(ZJ,8)+11*REF(ZJ,9)+10*REF(ZJ,10)+9*REF(ZJ,11)+8*REF(ZJ,12)+7*REF(ZJ,13)+6*REF(ZJ,14)+5*REF(ZJ,15)+4*REF(ZJ,16)+3*REF(ZJ,17)+2*REF(ZJ,18)+REF(ZJ,19))/210;
(顺手修了 QD 权重:原版漏了 REF(ZJ,19)、多写了 REF(ZJ,20),这里补回,影响极小但更规范)
HY:=CROSS(C,HYX) AND CROSS(C,QD) AND QD<HYX;
HY2:=CROSS(HYX,QD);
HY3:=CROSS(C,HYX) AND CROSS(C,QD) AND QD<HYX AND TJ;
MA5:=MA(C,5);MA10:=MA(C,10);MA20:=MA(C,20);MA30:=MA(C,30);
CS5:=CROSS(C,MA5);CS10:=CROSS(C,MA10);CS20:=CROSS(C,MA20);CS30:=CROSS(C,MA30);
CS_NUM:=CS5+CS10+CS20+CS30;
MAX_MA:=MAX(MAX(MA5,MA10),MAX(MA20,MA30));
MIN_MA:=MIN(MIN(MA5,MA10),MIN(MA20,MA30));
YYCDXNH:=CS_NUM>=3 AND MAX_MA/MIN_MA<=1.03 AND C>MA(C,60) AND MA20>REF(MA20,1);
主力起爆:((HY AND HY2) OR (HY AND HY3) OR (HY2 AND HY3) OR (HY AND HY2 AND HY3)) AND YYCDXNH;
你打开自己写的公式,搜一下有没有"OR"和"AND"挤在同一行的——如果有,先确认括号加对了没有。很多人以为自己在写"同时满足 A 或 B,且 C",实际跑的是"A 或 B 或(C 且 D)"。
把这条转给你身边也在手写公式的朋友——他可能写了三年,一直少一对括号。
