我跑回测的时候,遇到一只股票:均线多头排列成立、MACD 在零轴上方、20日涨幅不到15%——所有条件全绿,公式出了信号。
第二天,跌停了。
我回去把源码一行一行拆开,发现这个公式的问题根本不在参数,而在一个结构性的矛盾——两种战法套在同一个 OR 里面,逻辑强度根本不在一个量级。
说清楚那只让我停下来的票:它当天4日均线上穿20日均线,20日均线上穿62日均线,MACD 在零轴上金叉,20日涨幅只有 12%——完全符合公式里所有"看起来对"的条件。信号出来之后我盯了一晚上,觉得稳了。
第二天低开,三个点的时候我没走,想等反弹。结果一路往下,封了跌停板。
我当时第一反应是:是我买点选得不对吗?后来我把前后十几只满足条件的票全部回溯了一遍,发现问题不是"这一只买错了"——是公式本身有一个结构性的问题,它允许两种完全不同的信号逻辑混在一起,其中一种根本不需要放量确认就出信号。
一、先把公式拆开,看看它到底在干什么
最终输出只有这一行:
尾盘战法:(JCXH OR TQXH) AND MACDGZ AND DWQD;
三个条件并列:JCXH(均线蓄力)或 TQXH(尾盘放量突破),叠 MACDGZ 和 DWQD 两道过滤。我把两个子路径的核心变量整理出来之后,发现了一个有意思的问题——
| 路径 | 需要放量(FLQR)? | 需要突破10日高点(JGTP)? | 描述的场景 |
|---|---|---|---|
| JCXH(均线蓄力) | 不需要 ✗ | 不需要 ✗ | 均线形态到位就出信号 |
| TQXH(尾盘放量突破) | 需要 ✓ | 需要 ✓ | 放量 + 突破10日最高价 |
两个路径用 OR 叠加,结果就是:走 JCXH 路径的信号,根本不需要放量确认,也不需要突破任何价位,只要均线形态对上了就出。
这就好比你开了一道门,一半钥匙带指纹锁,一半钥匙是万能钥匙,然后你说"双重保险"。
二、让我停下来的那只票,走的就是 JCXH 路径
均线多头排列成立、MACD 在零轴上方——JCXH 路径直接出信号,FLQR 和 JGTP 两个条件完全没参与。
而 TQXH 路径要求放量 1.5 倍 + 收盘突破 10 日最高价,这两个条件虽然更严格,但在同一个公式里被 JCXH 的弱路径稀释掉了。
三、还有一个隐蔽的笔误:62日均线约束自相矛盾
JCXH 和 TQXH 共用这两个条件:
CQJXPW:=ABS(SLOPE(LSERJX,3))<0.19;
CQXLZQ:=SLOPE(LSERJX,3)>REF(SLOPE(LSERJX,3),1);
→ 62日均线斜率 |值| < 0.19(几乎走平)同时 斜率 > 前一期(刚抬头)
作者的真实意图应该是判断"62日均线从下跌转为走平",想捕捉行情从下降趋势进入横盘整理的节点。但这两个条件硬放在一起,只有在斜率刚好在 0 附近且刚刚转正时才能同时满足——窗口极窄,导致整个约束链几乎卡死。
正确的逻辑是"斜率由负转正",而不是"斜率接近零且大于前一期"。
四、MACDGZ 这一层,对 JCXH 路径完全没意义
JCXH 路径里已经有 ZQQSXS(20日线向上)和 CQXLZQ(62日线抬头),这两个条件成立时,DIF>0 必然成立。
最后再加 MACDGZ:=DIF>0 OR CROSS(DIF,DEA) 这一层,对 JCXH 来说只有 DIF>0 那条分支有意义,OR CROSS(DIF,DEA) 那条支路完全成了废代码——它在 JCXH 路径里永远不会走到。
五、DWQD 这一层过滤,方向可能帮倒忙
"20日涨幅 < 20%"的本意是"还没涨太多,空间还在"。但这个逻辑配合均线多头路径,反而会在真正的启动点把信号拦掉:
均线多头排列成立 → 行情已经走出中期趋势
20日涨幅还不到 20% → 均线刚发散,资金刚进场,还没加速
加 DWQD<20 → 保护的是还没涨的,这类票往往趋势刚走好但还没确认
真正"涨太多"的票反而被 DWQD 拦在门外——拦的是对的,但拦错了阶段。
六、变量存活表:哪些行真的在干活?
| 变量 | 含义 | 最终去向 | 状态 | 死因 |
|---|---|---|---|---|
| ESRJX / LSERJX | 20日线 / 62日均线 | → ZQQSXS / CQXLZQ | 活 ✓ | — |
| CQJXPW | 62日均线走平 | → JCXH / TQXH | 矛盾笔误 ✗ | ABS(<0.19) 与"刚抬头"无法同时成立 |
| ZRS / ZQCSZQ | 均线位置 + 金叉开口 | → JCXH | 活 ✓ | — |
| DNJS1 / DNQW | 4日线企稳 + 拐头 | → JCXH | 活 ✓ | — |
| JGTP | 收盘突破10日高点 | → TQXH(JCXH不要求) | 路径不一致 ✗ | OR把不需要JGTP的JCXH也放进了信号池 |
| FLQR | 放量1.5倍 | → TQXH(JCXH不要求) | 路径不一致 ✗ | 同上,JCXH路径完全绕过了放量条件 |
| MACDGZ(CROSS支路) | MACD刚金叉 | → 仅对TQXH有意义 | 冗余过滤 ✗ | JCXH里DIF>0已隐含成立,OR支路永不触发 |
| DWQD | 20日涨幅<20% | → 统一过滤 | 方向存疑 ✗ | 均线多头+未加速≠风险,可能是起涨点 |
七、适用环境
宽幅震荡市 ✓ 均线多头趋势后的回踩确认 ✓ 单边熊市 ✗ 弱势窄幅整理 ✗
JCXH 路径适合均线多头后的回踩蓄力买点,但前提是叠加放量确认;TQXH 路径适合尾盘放量突破确认。原版把两个完全不同场景套在一起,实操中建议二选一,不要并联使用。
八、修复版源码
针对四个问题全部修复:修斜率笔误 → JCXH 补放量确认 → 去掉冗余 MACD 支路 → 去掉方向存疑的 DWQD。
{=== 均线参数 ===}
ESRJX:=MA(C,20);
LSERJX:=MA(C,62);
{=== 趋势条件 ===}
ZQQSXS:=SLOPE(ESRJX,3)>0;
{修复:斜率由负转正(去掉ABS走平约束,它与"刚抬头"矛盾)}
CQXLZQ:=SLOPE(LSERJX,3)>0 AND SLOPE(LSERJX,3)>REF(SLOPE(LSERJX,3),1);
ZQCSZQ:=COUNT(CROSS(ESRJX,LSERJX),20)>=1 OR (ESRJX>LSERJX AND ESRJX-LSERJX>REF(ESRJX-LSERJX,1));
SJRJX:=MA(C,4);
ZRS:=REF(SJRJX,4)>ESRJX;
JL10:=ABS(SJRJX-MA(C,10));
DNQW:=REF(SJRJX>ESRJX,3) AND REF(JL10,2)>REF(JL10,1) AND JL10>REF(JL10,1) AND SLOPE(SJRJX,2)<0 AND SLOPE(SJRJX,2)>REF(SLOPE(SJRJX,2),1);
{=== 放量 + 突破(统一要求,TQXH原本就有,JCXH原本没有)===}
JGTP:=C>O AND C>REF(HHV(H,10),1);
FLQR:=VOL>REF(VOL,1)*1.5;
{=== MACD 零轴确认 ===}
DIF:=EMA(C,12)-EMA(C,26);
DEA:=EMA(DIF,9);
{修复:去掉对JCXH无效的CROSS支路,只保留DIF>0}
MACDGZ:=DIF>0;
{=== 信号:两条路径统一加放量确认,去掉DWQD ===}
JCXH:=ZQQSXS AND CQXLZQ AND ZQCSZQ AND DNQW AND FLQR;
TQXH:=ZQQSXS AND CQXLZQ AND DNQW AND JGTP AND FLQR;
尾盘战法:(JCXH OR TQXH) AND MACDGZ;
九、实战操作建议
用法:下午 14:30 之后筛选。JCXH 路径当天放量确认(量比≥1.5),次日关注开盘是否延续;TQXH 路径当天必须是放量+突破,次日高开延续概率更高。两个路径信号同时出现时,视为同一信号,不叠加仓位。
止损:收盘跌破 4 日均线减半,跌破 20 日均线清仓。
环境判断:大盘站稳 20 日均线时 JCXH 路径胜率更高;大盘横盘时 TQXH 路径更有效。
单票仓位:≤ 5%。
十、三条启发
启发一:OR 不是双保险,是信号稀释。 当两个逻辑强度不同的路径用 OR 并联,弱的那条会把强的拉低。如果要融合两种战法,用 AND 才叫双保险,用 OR 只是把信号池混在一起——你根本不知道端上来的是哪个版本。
启发二:修参数之前,先修逻辑矛盾。 "斜率几乎为零"和"斜率刚抬头"描述的是两个完全不同的市场阶段,硬塞在一起会让整个条件链失效。数学上它们不是互斥的,但在有物理含义的公式里,这种矛盾会让信号几乎消失。
启发三:不报错的死代码,比报错更会骗人。 JCXH 路径里 DIF>0 已经隐含成立,但 OR CROSS 那条支路永远不会触发,它在代码里安静地躺着,通达信不会报错,你也不会发现——直到你遇到那只跌停的票,你才会回头问:为什么所有条件都绿了,还是赔了?

