温馨点击上方“风帆量化”→点击右上角“ ... ”→选“设为星标★”
今天拆解一个叫做"超跌反弹"的通达信副图指标。
这个名字听着像是帮你抓反弹买点的,但你如果直接拿源码去用,大概率会发现信号出得非常少。为什么?因为这个指标不是"跌了就可能反弹"这么简单——它一口气塞了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); ⚠️ 互动问答: 使用指标时遇到任何问题(如安装、信号解读等),欢迎在留言区提问,我会第一时间解答!
也可以分享你的使用心得 —— 这个指标帮你抓住过哪些机会。
🙏 制作不易,麻烦点亮右下角 “👍” + “❤️” 支持一下!📤 转发给身边朋友,一起交流进步~👉 喜欢我的分享?记得 关注我,持续更新干货! ⚠️ 免责声明
本文所有源码及解读内容仅为通达信公式编程教学,目的在于帮助读者理解指标编写逻辑和函数用法。文中提到的任何指标名称、信号条件、参数设置均不构成任何投资建议。指标是辅助分析工具,其信号仅反映特定数学条件是否满足,不代表对未来走势的预测。实际使用时请务必结合自身判断和其他分析方法,理性决策。投资有风险,入市需谨慎。
夜雨聆风