乐于分享
好东西不私藏

通达信"超跌反弹"指标源码解读:WR超卖信号的编程逻辑

通达信"超跌反弹"指标源码解读:WR超卖信号的编程逻辑

温馨点击上风帆量化”→点击右上角“ ... →选“设为星标

今天拆解一个叫做"超跌反弹"的通达信副图指标。

这个名字听着像是帮你抓反弹买点的,但你如果直接拿源码去用,大概率会发现信号出得非常少。为什么?因为这个指标不是"跌了就可能反弹"这么简单——它一口气塞了15个条件,全部同时满足才出信号。

我逐层拆开它的逻辑,看完你就明白为什么信号少,也知道每个条件到底在筛什么。

一、这个指标在做什么?(整体逻辑速览)

先把大框架讲清楚,后面再逐行看代码。

这个指标的思路是:在上升趋势中,找到短期超跌的股票。但它加了一堆过滤条件来排除"假超跌"——真崩的不要、ST不要、没成交的不要、高价股不要、跳空缺口的不要。

核心信号来自威廉指标(WR)的超卖判定,偏离度、涨停历史、换手率等都是辅助过滤器。

整体逻辑可以画成6层过滤链:

① 基础过滤层:只看主板非ST,排除垃圾股

② 涨停历史层:250天内至少涨停2次,排除没有资金关注的票

③ 偏离度层:价格偏离长期均值6%以上,确认"够超跌"

④ 跌幅保护层:当天跌幅不能太大,排除真崩盘

⑤ WR超卖层:收盘价在6日价格区间底部15%以内,确认超卖

⑥ 综合触发层:上面15个条件全部满足,才出信号

二、逐层拆解

第一层:基础过滤(排除不合适的股票)

换手率计算:

HSL:=IF((SETCODE==0||SETCODE==1||SETCODE==2),100*VOL,VOL)/(FINANCE(7)/100);

HSL是换手率。SETCODE判断市场类型(0=深市、1=沪市、2=北交所等),不同市场成交量单位不同,所以要先判断再算。FINANCE(7)取流通股本,除以100后得到以手为单位的股数。成交量除以流通盘 = 当天换手率百分比。

换手率后面会用来过滤——只看有成交活跃度的票,死票不看。

板块和ST过滤:

只做:=CODELIKE('60')||CODELIKE('00')||CODELIKE('30');QST:=NAMELIKE('ST')=0 AND NAMELIKE('*ST')=0 AND NAMELIKE('SST')=0 AND NAMELIKE('S*ST')=0;TJ:=只做 AND QST;

只选沪市主板(60)、深市主板(00)、创业板(30)。排除所有ST类。TJ就是"主板+排除ST"的综合条件。

学习要点CODELIKE()和 NAMELIKE()是通达信里做字符串匹配的函数,做选股过滤时非常常用。CODELIKE('60')匹配代码以60开头的,NAMELIKE('ST')匹配名称含ST的。

第二层:涨停识别(辅助条件,不是筛"今天涨停的票")

ZT:=(CLOSE>=ZTPRICE(REF(CLOSE,1),IF(FINANCE(3)=4 OR FINANCE(3)=3,0.2,0.1)));

ZT判断当天是否涨停。ZTPRICE是通达信内置函数,计算涨停价。FINANCE(3)取股票类型:4和3是科创板和创业板(涨跌幅20%),其他是10%。

注意:这个变量后面不是筛"今天涨停的票",而是用在 COUNT(ZT,250)>=2——要求250天内至少涨停2次。为什么?经常涨停说明有资金关注,超跌反弹才有意义。从来不涨停的票跌下去可能就起不来了。

第三层:偏离度计算(核心逻辑之一)

BX_1:=(CLOSE+HIGH+OPEN)/3;BX_2:=EMA(BX_1,112);YJL:=(CLOSE-BX_2)/CLOSE*100;

BX_1是简化版价格均值(收盘+最高+开盘除以3),BX_2是这个均值112周期的EMA,YJL就是当前价格偏离长期EMA的百分比——偏离越大,价格越远离"均值重心"。

后面条件 YJL>6(副图1)或 YJL>7(副图2)的意思:价格必须偏离均值重心6%以上才算"超跌"。只有偏离足够大,才有反弹空间。

学习要点EMA(X,N)是指数移动平均,对近期数据权重更大,反应比MA更灵敏。112周期相当于半年线级别的重心。你可以把112换成55或89试试,偏离度敏感度会不同。

第四层:跌幅保护(不能跌太狠)

ZF:=(C-REF(C,1))/REF(C,1)*100;ZB:=ZF>-6;CB:=ZF>-10;YH:=IF(CODELIKE('30'),CB,ZB);

ZF当天涨跌幅。ZB跌幅不超过6%,CB跌幅不超过10%。YH用 IF分支:创业板放宽到跌幅不超过10%,主板不超过6%。

逻辑:创业板涨跌幅限制20%,跌8%不算极端;主板限制10%,跌6%已经比较狠了。但这个条件同时排除了跌太多的票——跌超过6%或10%的,可能不是"超跌反弹"而是"真在崩"。

第五层:WR超卖信号(真正的核心信号)

WR1:=100*(HHV(HIGH,6)-CLOSE)/(HHV(HIGH,6)-LLV(LOW,6));

威廉指标(Williams %R)。计算方式:6日内最高价减收盘价,除以6日内振幅,乘100。值越大说明收盘价越接近6日最低价,即越"超卖"。

副图1:WR1>85,收盘价在6日价格区间的底部15%以内。

副图2:增加 WR2(10日和6日双WR),WR1>80 AND WR2>80,两个周期都确认超卖。

学习要点:WR取值0-100。0=收盘等于N日最高价(超买),100=收盘等于N日最低价(超卖)。通达信WR是0-100正向版本,有些平台是0到-100反向版本,移植公式时注意区别。

第六层:综合触发条件(15个条件全部满足才出信号)

看完上面5层过滤,到了最终的触发条件。副图1的完整逻辑:

X:=C/REF(LLV(L,5),1)<0.99          ← 收盘价低于5日最低价前值(跌破近期低点)    AND C!=L                         ← 收盘不等于最低(不是直接砸到底)    AND MA(C,60)>REF(MA(C,60),1)     ← 60日均线还在向上(大趋势没崩)    AND REF(ST>2,1)                  ← 昨天实体振幅>2%(不是横盘死票)    AND HSL>=2                       ← 换手率>=2%(有成交活跃度)    AND TJ                            ← 主板+非ST    AND H/O*100>100.1                ← 最高价高于开盘价0.1%以上(盘中冲高过)    AND REF(H/O*100>100.1,1)         ← 昨天也满足这个条件    AND COUNT(ZT,250)>=2             ← 250天内至少涨停2次(有资金关注历史)    AND YJL>6                        ← 偏离长期均值6%以上(够"超跌")    AND H!=O                         ← 最高不等于开盘(有盘中波动)    AND C<o ←="" 收盘低于开盘(当天是阴线)AND YH                            ← 跌幅在保护范围内    AND NOT(QK)                       ← 不是跳空低开(没有缺口)    AND C<60                          ← 股价低于60元(排除高价股)    AND WR1>85                        ← WR超卖

看完这15个条件你就明白了:大趋势还在向上、有过资金关注、当天阴线但盘中冲高、跌幅不过分、价格够低、WR确认超卖、没有跳空缺口、换手率够活跃——全部同时满足才出信号。

FILTER(X,10)表示信号触发后10天内只保留第一次,避免连续重复出信号。

画图输出部分:

STICKLINE(超跌反弹1,0,2,0.8,0),COLORFF00FF;DRAWTEXT(超跌反弹1, 0.7, '超跌反弹1'),COLORWHITE;

触发时画紫红色竖线,标注"超跌反弹1"文字。

三、三个变体的差异对比

副图1、副图2、选股三个版本逻辑几乎一样,只差几个细节:

差异点
副图1
副图2
选股
WR参数
WR1周期=6,阈值>85
WR1周期=10,WR2周期=6,双WR阈值>80
同副图1
偏离度
YJL>6
YJL>7(更严格)
同副图1
换手率保护
ZB: ZF>-6 / CB: ZF>-10
ZB: ZF>-6 AND HSL>2 / CB: ZF>-10 AND HSL>4
同副图1
画图
紫红色竖线+文字
浅蓝色竖线+文字
无画图,只输出信号

副图2比副图1严格:偏离度要求更高(7%而非6%),换手率加了最低门槛,WR双周期确认。代价是信号更少,筛选理论上更精准。

编程学习点:做指标的多个版本时,先做基础版,然后在关键阈值上加严,而不是完全重写。改动越小对比越清晰,你也能清楚看到每个条件的边际效果。

四、使用时的注意事项

1. 15个条件同时满足,信号非常稀少。如果回测发现几乎不出信号,可以先放宽WR阈值(85降到75),或去掉YJL条件,逐步加严而不是一步到位。

2. MA(C,60)>REF(MA(C,60),1)要求60日线还在向上。市场整体下行时这个条件会过滤掉几乎所有票——所以这个指标更适合上升趋势中的超跌回踩,不适合熊市。

3. C<60排除了高价股。可以改成 C<100或去掉来适配你的需求。

4. COUNT(ZT,250)>=2要求250天内有涨停历史。刚上市的新股可能满足不了。

5. 修改参数建议用通达信"指标调试"逐步验证,不要一口气改太多条件。

6. SETCODE==0||SETCODE==1||SETCODE==2的判断是为了换手率计算准确性。如果数据源只覆盖沪深主板,这段可以简化。

五、延伸学习

后续文章会逐一展开这些方向:

· EMA函数:和MA的区别、权重衰减原理、不同周期的含义

· WR指标:数学含义、与KDJ超卖判断的对比、不同周期的灵敏度差异

· FILTER函数:通达信信号过滤机制、不同过滤天数的实际效果

· CODELIKE/NAMELIKE:字符串匹配函数的完整语法和常见用法

六、完整源码

拆解完逻辑了,下面是三个版本的完整源码。建议你先对照上面的逐层解读看一遍,理解每行在做什么,再复制去用。

副图1:

HSL:=IF((SETCODE==0||SETCODE==1||SETCODE==2),100*VOL,VOL)/(FINANCE(7)/100);ST:=ABS(C-O)/MIN(C,O)*100;只做:=CODELIKE('60')||CODELIKE('00')||CODELIKE('30');QST:=NAMELIKE('ST')=0 AND NAMELIKE('*ST')=0 AND NAMELIKE('SST')=0 AND NAMELIKE('S*ST')=0;TJ:=只做 AND  QST;ZT:=(CLOSE>=ZTPRICE(REF(CLOSE,1),IF(FINANCE(3)=4 OR FINANCE(3)=3,0.2,0.1)));BX_1:=(CLOSE+HIGH+OPEN)/3;BX_2:=EMA(BX_1,112);YJL:=(CLOSE-BX_2)/CLOSE*100;ZF:=(C-REF(C,1))/REF(C,1)*100;ZB:=ZF>-6;CB:=ZF>-10;YH:=IF(CODELIKE('30'),CB,ZB);QK:=H<REF(L,1);WR1:=100*(HHV(HIGH,6)-CLOSE)/(HHV(HIGH,6)-LLV(LOW,6));X:=C/REF(LLV(L,5),1)<0.99 AND C!=L AND MA(C,60)>REF(MA(C,60),1)     AND REF(ST>2,1) AND HSL>=2 AND TJ AND H/O*100>100.1     AND REF(H/O*100>100.1,1) AND COUNT(ZT,250)>=2 AND YJL>6     AND H!=O AND C<O AND YH AND NOT(QK) AND C<60 AND WR1>85;信号:=FILTER(X,10);超跌反弹1:=信号;STICKLINE(超跌反弹1,0,2,0.8,0),COLORFF00FF;DRAWTEXT(超跌反弹1, 0.7, '超跌反弹1'),COLORWHITE;

副图2:

HSL:=IF((SETCODE==0||SETCODE==1||SETCODE==2),100*VOL,VOL)/(FINANCE(7)/100);ST:=ABS(C-O)/MIN(C,O)*100;只做:=CODELIKE('60')||CODELIKE('00')||CODELIKE('30');QST:=NAMELIKE('ST')=0 AND NAMELIKE('*ST')=0 AND NAMELIKE('SST')=0 AND NAMELIKE('S*ST')=0;TJ:=只做 AND  QST;ZT:=(CLOSE>=ZTPRICE(REF(CLOSE,1),IF(FINANCE(3)=4 OR FINANCE(3)=3,0.2,0.1)));BX_1:=(CLOSE+HIGH+OPEN)/3;BX_2:=EMA(BX_1,112);YJL:=(CLOSE-BX_2)/CLOSE*100;ZF:=(C-REF(C,1))/REF(C,1)*100;ZB:=ZF>-6 AND HSL>2;CB:=ZF>-10 AND HSL>4;YH:=IF(CODELIKE('30'),CB,ZB);QK:=H<REF(L,1);N:=10;N1:=6;WR1:=100*(HHV(HIGH,N)-CLOSE)/(HHV(HIGH,N)-LLV(LOW,N));WR2:=100*(HHV(HIGH,N1)-CLOSE)/(HHV(HIGH,N1)-LLV(LOW,N1));X:=C/REF(LLV(L,5),1)<0.99 AND C!=L AND MA(C,60)>REF(MA(C,60),1) AND REF(ST>2,1)AND  TJ AND H/O*100>100.1 AND REF(H/O*100>100.1,1) AND COUNT(ZT,250)>=2 AND YJL>7 AND H!=O AND C<O AND YH AND NOT(QK) AND C<60 AND WR1>80 AND WR2>80;超跌反弹2:=FILTER(X,10);STICKLINE(超跌反弹2,0,2,0.8,0),COLORAFEEEE;DRAWTEXT(超跌反弹2,0.9,'超跌反弹2'),COLORWHITE;

选股公式:

HSL:=IF((SETCODE==0||SETCODE==1||SETCODE==2),100*VOL,VOL)/(FINANCE(7)/100);ST:=ABS(C-O)/MIN(C,O)*100;只做:=CODELIKE('60')||CODELIKE('00')||CODELIKE('30');QST:=NAMELIKE('ST')=0 AND NAMELIKE('*ST')=0 AND NAMELIKE('SST')=0 AND NAMELIKE('S*ST')=0;TJ:=只做 AND  QST;ZT:=(CLOSE>=ZTPRICE(REF(CLOSE,1),IF(FINANCE(3)=4 OR FINANCE(3)=3,0.2,0.1)));BX_1:=(CLOSE+HIGH+OPEN)/3;BX_2:=EMA(BX_1,112);YJL:=(CLOSE-BX_2)/CLOSE*100;ZF:=(C-REF(C,1))/REF(C,1)*100;ZB:=ZF>-6;CB:=ZF>-10;YH:=IF(CODELIKE('30'),CB,ZB);QK:=H<REF(L,1);WR1:=100*(HHV(HIGH,6)-CLOSE)/(HHV(HIGH,6)-LLV(LOW,6));X:=C/REF(LLV(L,5),1)<0.99 AND C!=L AND MA(C,60)>REF(MA(C,60),1) AND REF(ST>2,1)AND HSL>=2 AND TJ AND H/O*100>100.1 AND REF(H/O*100>100.1,1) AND COUNT(ZT,250)>=2 AND YJL>6 AND H!=O AND C<O AND YH AND NOT(QK) AND C<60 AND WR1>85;信号:FILTER(X,10);
⚠️ 互动问答:

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

也可以分享你的使用心得 —— 这个指标帮你抓住过哪些机会。

🙏 制作不易,麻烦点亮右下角 “👍” + “❤️” 支持一下!📤 转发给身边朋友,一起交流进步~👉 喜欢我的分享?记得 关注我,持续更新干货!

⚠️ 免责声明

本文所有源码及解读内容仅为通达信公式编程教学,目的在于帮助读者理解指标编写逻辑和函数用法。文中提到的任何指标名称、信号条件、参数设置均不构成任何投资建议。指标是辅助分析工具,其信号仅反映特定数学条件是否满足,不代表对未来走势的预测。实际使用时请务必结合自身判断和其他分析方法,理性决策。投资有风险,入市需谨慎。