夜雨聆风学习资料网

ARTICLE · 1279182

通达信「妖股起爆」指标源码解读:一行 67 句,真正管用的只有 3 个条件

通达信「妖股起爆」指标源码解读:一行 67 句,真正管用的只有 3 个条件

名字里带「起爆」两个字的指标,最容易让人冲动装上去,听着就像能提前一步抓到要拉的那只票。装完打开副图,画面确实热闹:红绿柱子一排,一黄一蓝两条虚线斜着走,隔一阵还蹦出个「起爆」。

这份《妖股起爆》配了一份副图、一份同名选股,两段源码加起来不到 2,900 个字符,方向却很直白:用 MACD 画出波段结构,再叠一个「低位放量启动」的条件打标记。副图和选股用的条件完全一样,区别是副图把 MACD 那一整套画给你看,选股只留条件。

它值得认真拆一遍,原因不在名字,在写法:整份源码压在一行里,67 条语句拿分号隔开。这种写法最容易藏东西:哪几条在算信号、哪几条只是画图,不逐条对上号根本分不清。而这份公式里,画图的部分占了绝大多数。

我拿 513 只票、最近约 6 年日线(合计 67.6 万个交易日)把条件跑了一遍:起爆条件全部满足的只有 6,841 条,平均每只票每年约 2.2 次。更要紧的是,其中一条过滤条件把高价股几乎整个挡在门外。股价 100 元以上的 22 只样本里,有 10 只从来没出过信号。

图 1|600089 特变电工,2026-05 至 2026-10。上:日 K 与两次起爆标记;下:MACD 柱、DIF、DEA。两根竖虚线就是起爆当日的位置

先看一眼信号长什么样。上面这张窗口里只出现过两次「起爆」,相隔一个月,都是在一段下跌之后。副图里 40 条波段连线和 ADX/PDI 虚线属于纯画图语句,这张图没画,第五节会说明它们为什么会重排。

一、一行 67 句,先分清哪些在「算」、哪些在「画」

原文是一整行,拿分号切开是 67 条语句。配套的选股版只有 12 条,把两版逐条比对,差掉的那 55 条一眼就看明白了:MACD 柱、波段连线、前高前低、K 线重绘,全在副图里,选股里一条没有。

换句话说,副图里那 55 条,删掉不会改变任何一次信号。它们只负责把图形画好看。真正决定出不出信号的,只有这 12 条里的一句话:RVL:=X_3 AND GP AND CBT;

三类语句,一眼分家① 算信号(12 条):X_2、X_3、KVD1~KVD5、GP、DFV、CBT、RVL、XG② 画图形(约 50 条):MACD 柱、QG/QD 波段线、ADX/PDI 虚线、前高前低四个档位、40 条 DRAWLINE、4 条 STICKLINE③ 打标签(3 条):三处 DRAWTEXT 拼出「↖ 起 爆」三个字副图 67 条 = 上面三类;选股 12 条 = 只有第 ① 类。

这个结构决定了怎么看它:副图是给你看 MACD 的位置和波段结构,选股才是干活的那一份。如果你只想拿到信号,副图那一整行可以不装。

二、信号由三个条件决定,逐个拆

三个条件分别是 X_3(涨幅够不够)、GP(K 线形态对不对)、CBT(位置够不够低),三者同时成立才叫 RVL。

1. X_3:涨幅 ≥5%,但门槛比 5% 低一点点

写法是 (CLOSE-X_2)*100/X_2>=5-0.01*100/X_2,其中 X_2 是昨收。把右边的 0.01*100/X_2 化简就是 1/X_2,两边同乘 X_2、再除以 100,条件就等价于:今收 ≥ 昨收 × 1.05 − 0.01 元。

那 1 分钱是干嘛的?给报价精度留余量。昨收 10.00 元的票,5% 门槛是 10.50;而 10.49 在软件里显示的是 4.9%,看着没到 5%,按这个写法却算成立。差的就是这一分钱,正好卡在「按分报价」的精度边缘上。

顺便说清一件事:它是「涨 5%」,不是「涨停」。主板 10%、创业板科创板 20%,5% 只是「今天明显在动」的下限。

2. GP:一根上影很小的阳线,加上 RSV 在加速

GP 由三个子条件相乘(AND)而成,写在 KVD2、KVD4、KVD5 三条语句里:

KVD2C/P>1.01 AND HIGH/CLOSE<1.010 AND KVD1>0——涨幅超过 1%、上影不到 1%、当天收涨。翻译过来就是「收在高位、几乎没被砸下来」,一根干净的小阳线。

KVD4 先把 34 日 RSV 取 3 日 EMA,再除以 4,得到 KVD3;要求它单日上升超过 1。因为除过 4,换算回 RSV 就是「一天之内 RSV 上升超过 4 个点」。位置在往上抬,而且抬得不慢。那个「除以 4」纯是为了把曲线压进 0~25,画图好看。

KVD5C/REF(C,1)<1.2——当日涨幅不到 20%,把一字板、连板那种当天根本没机会成交的情况排除掉。

这里有两处写了等于没写的代码,可以放心看过去:① KVD2 里那个 IF(...,91,0)>1——91>1 恒真、0>1 恒假,所以这个 IF 就等于条件本身,那个 >1 是多余的;② KVD1 要求「当天收涨」,但 KVD2 已经要求 C/P>1.01,本来就包含了收涨,KVD1 是冗余条件。写法啰嗦,逻辑没错,不影响结果。

3. CBT:位置够低,这一行最需要留神

原式是 CBT:=(SMA(DFV,5,1)+2*STD(CLOSE,37))<50。前半截 SMA(DFV,5,1) 是 37 日 RSV 的 5 日均,取值 0~100,含义清楚:价格在最近 37 天区间里偏低。问题出在后半截 2*STD(CLOSE,37):这是收盘价的 37 日标准差,单位是「元」。

一个 0~100 的百分比,加上一个以元为单位、随股价放大的数,再拿去跟 50 比大小。量纲对不上。结果就是:股价越高,这个和式越大,条件越难成立,到某个价位之后干脆永远不成立。

三、实测:这条 CBT 把高价股整个挡在门外

我按价位分了五档,每档统计三件事:该档 2*STD(CLOSE,37) 的中位数、和式的中位数、以及 CBT 实际成立的比例(样本 514 只、最近 1,500 根日线):

股价区间
只数
CBT 成立
近乎静默
0~5 元
76
60.4%
0.0%
5~10 元
123
57.7%
0.0%
10~30 元
195
56.4%
0.0%
30~100 元
98
50.7%
0.0%
>100 元
22
17.5%
45.5%

图 3|同一组数据画成柱状:蓝柱是该价位档 CBT 成立的天数占比,红柱是「几乎不再出信号」的股票占比,横轴下方是各档样本只数

两列分开看:一是该档 CBT 成立的天数占比,二是「几乎不再出信号」(成立比例低于 2%)的股票占比。同一档里 2*STD(CLOSE,37) 的中位数从 0.39 一路涨到 38.09,和式中位数从 41.56 涨到 87.85。

5 元以下到 30 元的票,CBT 大约一半到六成的日子成立;一旦股价过百,只剩 17.5%,而且近一半的票从此基本静默。

极端的例子更直白。样本里股价最高的几只,2*STD(CLOSE,37) 的中位数到了 266 甚至 421,光这一项就把和式顶到 300 以上,CBT 的成立比例是 0.0%,装上去永远不会打「起爆」。

为什么会这样:股价翻倍,标准差也翻倍

收盘价的 37 日标准差,量级本来就是「股价的百分之几」。股价 10 元的票,日波动 2%~3%,37 日标准差常在 1~2 元;股价 100 元的票,同样的波动率,标准差就是 10~20 元。乘 2 之后,光后半截就已经吃掉 50 的预算。而公式还要它加上一个 0~100 的 RSV 均值再小于 50。

想修的话,一句话就够:把价格标准换成百分比标准。比如改成 CBT:=(SMA(DFV,5,1)+2*STD(DFV,37))<50,让两项都用 RSV 的波动率,量纲就统一了;或者干脆把后半截去掉,只留 SMA(DFV,5,1)<50,含义变成「5 日均 RSV 在中位以下」。改哪一版都行,但改完就不是原来那份指标了,信号数量和分布都会变——这一点得说在前面。

四、条件漏斗:每一条砍掉多少

把五个条件按顺序套上去,看每一层剩多少。样本 513 只、最近 1,500 根日线(约 6 年),合计 675,527 个交易日:

条件
剩余条数
本层砍掉
全部交易日
675,527
—
X_3 涨幅 ≥5%
34,339
94.9%
+ KVD2 小上影阳线
18,657
45.7%
+ KVD4 RSV 加速
16,279
12.7%
+ KVD5 涨幅 <20%
15,747
3.3%
+ CBT 位置偏低
6,841
56.6%
= RVL 起爆条件
6,841
—

图 2|五道条件逐层过滤,条长按剩余条数等比缩放。第一刀砍掉九成半,最后一刀(CBT)砍掉一半多

两个数字值得记住。第一,「涨幅 5%」这一个条件就砍掉 94.9%,它决定了信号的上限;第二,CBT 砍掉 56.6%,是第二大过滤器。也就是说,这条件不是「稍微收紧一点」,而是直接决定了六成的去留。偏偏它又是量纲有问题的那一条,这一点值得心里有数。

最终 6,841 条信号落在 501 只票上(占样本 97.7%),平均每只 13.3 条 / 6 年 ≈ 每年 2.2 条;单票最多 64 条,中位 13 条。这个密度适合做选股,一天全市场也就几十条,看得过来;不适合当盯盘提示音。

上面这组数字还有一个口径要交代:全部用本地 vipdoc 日线的原始价、没做除权处理跑的。同一套条件换成前复权数据,最终是 7,167 条、年均 2.3 条,比这里多 4.6%。差别来自等差前复权本身是减法:派息 1 元、原价 10 元,复权后历史价变 9 元,同样涨 5 毛,不复权算 5.0%、复权算 5.6%,更容易碰上 5% 这道门槛。两种口径的层级结构完全一样,结论不受影响,但你自己复现时数字会对不上,先知道原因。

关于 XG 最后那一步

副图里 XG 写的是 BARSSINCEN(RVL,5)=0。BARSSINCEN 的作用是在 N 个周期的窗口里做「首次成立」判定,换成白话:同一个位置连着几天都满足 RVL,只在第一天挂标记,不重复刷屏。不同版本的通达信对这个函数返回值 0 的边界解释略有出入,你装上以后拿几只票对一下标记位置就能确认,但「5 日窗口去重」这个作用是确定的。

如果你自己写选股,XG 直接换成 RVL 也可以,区别只是同一个位置会连续选出来几天。

五、还有一处会变:前高前低跟着新信号挪位置

前面四节说的都是条件:哪三条在算、哪条把高价股挡住了、每条砍掉多少。这一节换个方向,说的是画图。副图里那 40 条 DRAWLINE 靠四个「前高」、四个「前低」定位,而这八个变量是这么算出来的:

基准:=CONST(SUM(VA2,0))——把整段历史上 VA2 成立的次数累加成常数;然后 前高:=基准=SUM(VA2,0) AND VA2 是「最新那个高点」,前高1:=基准-1=SUM(VA2,0) AND VA2 是「倒数第二个」,往后依次类推。

问题在于:只要来一个新的高点,基准就加 1,所有的「前高 1~4」整体往前挪一格,靠它们连出来的黄绿线段会跟着重画。这不是未来函数(每一步都没用到明天),但它意味着你昨天截图上的那条斜线,今天可能已经不在原来的位置了。拿它做形态复盘的话,务必看一下图形是不是被重排过。

同一类的还有 ADX 和 PDI 两条虚线。它们画到 ISLASTBAR 为止,起点的纵坐标是最近一个波段高(低)点的 MACD 值,终点的纵坐标取的是同一个值(REF(MACD,BARSLAST(VA2))),所以这两条线其实是水平的——高度不变,只是末端每天往后延一个交易日,长度会变。看的时候别把它当成「跟着最新价走」的压力位。

六、怎么用:三句话

① 想拿信号,只用选股版。12 条语句,装进「条件选股」;副图那 55 条是画 MACD 波段结构的,跟你今天买不买没关系。

② 高价股自己改 CBT。如果你常做的票在 100 元以上,原样装上去大概率的体验是「一条信号都没有」,先按第三节那两种改法之一动手,再用自己的票池对比信号数量。

③ 别直接把「起爆」当买点。这三个条件只说明「今天涨了 5%、上影很小、RSV 在加速、位置不高」,是一组描述当前状态的数学条件,不是对未来走势的判断。本文也没做收益统计:本地日线没做除权处理,直接算未来涨幅会失真,这种数字不如不给。要评效果,用你自己常做的票池重跑一遍才作数。

七、完整源码

① 副图(67 条语句,一整行)

原文就是一行,由分号分隔,没有做任何断行处理:

DIF:=EMA(CLOSE,12)-EMA(CLOSE,26);DEA:=EMA(DIF,9);X_2:=REF(CLOSE,1);X_3:=IF((CLOSE-X_2)*100/X_2>=5-0.01*100/X_2,1,0);中线:0,COLORYELLOW;MACD:=(DIF-DEA)*2;KVD1:=IF(CLOSE>REF(CLOSE,1),88,0);KVD2:=IF(CLOSE/REF(CLOSE,1)>1.01 AND HIGH/CLOSE<1.010 AND KVD1>0,91,0)>1;KVD3:=EMA(100*(CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3)/4;KVD4:=(KVD3-REF(KVD3,1))>1;KVD5:=C/REF(C,1)<1.2;GP:=KVD2 AND KVD4 AND KVD5;DFV:=(CLOSE-LLV(LOW,37))/(HHV(HIGH,37)-LLV(LOW,37))*100;CBT:=(SMA(DFV,5,1)+2*STD(CLOSE,37))<50;VA1:=HHVBARS(MACD,BARSLAST(MACD<0)+1);VA2:=CROSS(BACKSET(CROSS(0,MACD),REF(VA1,1)+2),0.5);QG:=DRAWLINE(VA2,MACD,REF(VA2,1),REF(MACD,1),1);VA3:=LLVBARS(MACD,BARSLAST(MACD>0)+1);VA4:=CROSS(BACKSET(CROSS(MACD,0),REF(VA3,1)+2),0.5);QD:=DRAWLINE(VA4,MACD,REF(VA4,1),REF(MACD,1),1);ADX:DRAWLINE(VA2,MACD,ISLASTBAR,REF(MACD,BARSLAST(VA2)),1),COLORWHITE,DOTLINE;PDI:DRAWLINE(VA4,MACD,ISLASTBAR,REF(MACD,BARSLAST(VA4)),1),COLORLIBLUE,DOTLINE;RVL:=X_3 AND GP AND CBT;XG:BARSSINCEN(RVL,5)=0,COLORRED,NODRAW;基准:=CONST(SUM(VA2,0));前高:=基准=SUM(VA2,0) AND VA2;前高1:=基准-1=SUM(VA2,0) AND VA2;前高2:=基准-2=SUM(VA2,0) AND VA2;前高3:=基准-3=SUM(VA2,0) AND VA2;前高4:=基准-4=SUM(VA2,0) AND VA2;距离G1:=BARSLAST(前高1);距离G2:=BARSLAST(前高2);距离G3:=BARSLAST(前高3);距离G4:=BARSLAST(前高4);基准2:=CONST(SUM(VA4,0));前低:=基准2=SUM(VA4,0) AND VA4;前低1:=基准2-1=SUM(VA4,0) AND VA4;前低2:=基准2-2=SUM(VA4,0) AND VA4;前低3:=基准2-3=SUM(VA4,0) AND VA4;前低4:=基准2-4=SUM(VA4,0) AND VA4;距离D1:=BARSLAST(前低1);距离D2:=BARSLAST(前低2);距离D3:=BARSLAST(前低3);距离D4:=BARSLAST(前低4);STICKLINE(MACD>0,MACD,0,2.5,1),COLORRED;STICKLINE(MACD<0,MACD,0,2.5,1),COLORCYAN;STICKLINE(MACD>QG,MACD,QG,1,0),COLORYELLOW;STICKLINE(MACD<0 AND MACD<QD AND QD<0,MACD,QD,1,0),COLORBLUE;DRAWTEXT(XG,中线-0.03,'↖'),COLORYELLOW;DRAWTEXT(XG,中线-0.03,' 起'),COLORLIMAGENTA;DRAWTEXT(XG,中线-0.03,'    爆'),COLORYELLOW;DRAWLINE(前高1,MACD,前高 AND MACD>=REF(MACD,距离G1),MACD,0),COLORYELLOW;DRAWLINE(前高1,MACD,前高 AND MACD<REF(MACD,距离G1),MACD,0),COLORGREEN;DRAWLINE(前高2,MACD,前高1 AND MACD>=REF(MACD,距离G2),MACD,0),COLORYELLOW;DRAWLINE(前高2,MACD,前高1 AND MACD<REF(MACD,距离G2),MACD,0),COLORGREEN;DRAWLINE(前高3,MACD,前高2 AND MACD>=REF(MACD,距离G3),MACD,0),COLORYELLOW;DRAWLINE(前高3,MACD,前高2 AND MACD<REF(MACD,距离G3),MACD,0),COLORGREEN;DRAWLINE(前高4,MACD,前高3 AND MACD>=REF(MACD,距离G4),MACD,0),COLORYELLOW;DRAWLINE(前高4,MACD,前高3 AND MACD<REF(MACD,距离G4),MACD,0),COLORGREEN;DRAWLINE(前低1,MACD,前低 AND MACD>=REF(MACD,距离D1),MACD,0),COLORYELLOW;DRAWLINE(前低1,MACD,前低 AND MACD<REF(MACD,距离D1),MACD,0),COLORGREEN;DRAWLINE(前低2,MACD,前低1 AND MACD>=REF(MACD,距离D2),MACD,0),COLORYELLOW;DRAWLINE(前低2,MACD,前低1 AND MACD<REF(MACD,距离D2),MACD,0),COLORGREEN;DRAWLINE(前低3,MACD,前低2 AND MACD>=REF(MACD,距离D3),MACD,0),COLORYELLOW;DRAWLINE(前低3,MACD,前低2 AND MACD<REF(MACD,距离D3),MACD,0),COLORGREEN;DRAWLINE(前低4,MACD,前低3 AND MACD>=REF(MACD,距离D4),MACD,0),COLORYELLOW;DRAWLINE(前低4,MACD,前低3 AND MACD<REF(MACD,距离D4),MACD,0),COLORGREEN;

② 选股(12 条语句,一整行)

同一套条件,去掉全部画图部分:

{XG}X_2:=REF(CLOSE,1);X_3:=IF((CLOSE-X_2)*100/X_2>=5-0.01*100/X_2,1,0);KVD1:=IF(CLOSE>REF(CLOSE,1),88,0);KVD2:=IF(CLOSE/REF(CLOSE,1)>1.01 AND HIGH/CLOSE<1.010 AND KVD1>0,91,0)>1;KVD3:=EMA(100*(CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3)/4;KVD4:=(KVD3-REF(KVD3,1))>1;KVD5:=C/REF(C,1)<1.2;GP:=KVD2 AND KVD4 AND KVD5;DFV:=(CLOSE-LLV(LOW,37))/(HHV(HIGH,37)-LLV(LOW,37))*100;CBT:=(SMA(DFV,5,1)+2*STD(CLOSE,37))<50;RVL:=X_3 AND GP AND CBT;XG:BARSSINCEN(RVL,5)=0;
复制说明:上面两段都是从原文逐字复制,没有加过一个换行、没有改过一个字符。手机屏幕上这个块会自动折行——折行不代表换行,语句边界一律看分号。从公众号复制到通达信时,建议整段一次贴入;副图装进「副图指标」,选股装进「条件选股公式」。注意 ' 起' 和 '    爆' 引号里的空格是原样保留的排版占位,作用是把三个字摆到同一行的不同位置,别手动删掉,删了字会挤在一起。

互动问答

使用指标时遇到任何问题(如安装、信号解读等),欢迎在留言区提问,我会第一时间解答。

也可以说说:像 CBT 这种「量纲对不上」的写法,你在别的指标里还见过哪些?

制作不易,麻烦点亮右下角的 "赞" + "在看" 支持一下。

转发给身边朋友,一起交流进步。

喜欢我的分享,记得关注我,持续更新干货。

免责声明

本文所有源码及解读内容仅为通达信公式编程教学,目的在于帮助读者理解指标编写逻辑和函数用法。文中提到的任何指标名称、信号条件、参数设置均不构成任何投资建议。

指标是辅助分析工具,其信号仅反映特定数学条件是否满足,不代表对未来走势的预测。实际使用时请务必结合自身判断和其他分析方法,理性决策。

相关学习资料