ARTICLE · 1220015
通达信"通道捉牛妖"指标源码解读:双通道突破叠加量比放量的编程逻辑
温馨点击上方"风帆量化" → 点击右上角 "..." → 选 "设为星标"★
今天拆解一套结构很干净的通达信指标:「通道捉牛妖」。它只做一件事,用两条通道线加一个量比确认突破是不是真的。
第一层是箱顶线:取不含当日的 30 日最高收盘,再做 2 日均值。第二层是布林通道:以 20 日 EMA 为中轨,用收盘标准差算出上下轨,但判断时用的是昨日那条上轨。第三层是量比:今日成交量要放到昨日 5 日均量的 1.8 倍以上。三条同时成立,才输出信号。
这份公式一共两个版本:带标注的副图版、只出信号的选股版。两版逻辑完全相同,副图版只是末尾多了两行绘图语句。下面逐层拆解编程逻辑,最后附两版完整源码。
一、这个指标在做什么?(整体逻辑速览)
整段代码按分号切分是 14 条语句,可以归成 6 层,从划线一路推到信号。按这个顺序看,比从头读代码要快得多:
① 箱顶线层:取「不含当日」的 30 日最高收盘,再做 2 日均值,得到一条压制线
② 布林通道层:20 日 EMA 当中轨,用收盘价的标准差算出「中轨 ± 2 倍标准差」的上下轨
③ 上轨滞后层:判断用的是上轨的昨日值,把当日这一根剔出去
④ 量比层:今日成交量 ÷ 昨日为止的 5 日均量,阈值 1.8 倍
⑤ 信号层:上面三条同时成立,且是「7 日内首次」,再做 10 日冷却
⑥ 标注层:副图里写一个「爆」字、画一根紫色信号柱(只影响显示)
核心定位:突破当天的双线 + 放量确认,属于突破右侧的追强信号,不是抄底信号。它不判断趋势方向,也不判断股价位置,只管「今天有没有同时越过两条线并且放量」。
先说一个实测数字:用 700 只沪深主板与创业板个股、每只近 500 根日线(合计 35 万根 K 线,约 1400 个股票·年)跑了一遍,原公式共产生 3890 次信号,平均每股每年约 2.78 次。不是天天有的高频公式。
二、逐层拆解
原公式是一整行。下面我按语句顺序把它拆开讲:每处贴出来的代码,都是原文里连续的一段,我只做了分段排版,没有增删任何一个字符、也没有改动行序;完整原文(一字未改的一整行)在第七节,需要复制请用那一份。
第1层:箱顶线是怎么来的
先取不含当日的 30 日最高收盘价(REF(HHV(C,30),1)),再对这条序列取 2 日均值。先用 REF 把当日剔出去,是为了避免「今天的收盘自己刷新今天的最高值」这种自我确认;再取 2 日均值,是把单日跳空造成的毛刺磨掉一点。
学习要点:HHV(C,30) 取 30 日内收盘最高值,REF(...,1) 把整条序列后移一根,意思是「只看昨天及以前」。这段用的是收盘价而不是最高价,两者在长上影的日子会差出不少,所以箱顶线常低于肉眼看到的最高点。
第2层:中轨为什么用 EMA
中轨是 20 日指数移动平均,不是简单的 20 日均线。EMA 给越近的交易日越大的权重,所以它对最近的涨跌反应更快。系统自带的 BOLL 指标用的是 MA20 中轨,这里换成 EMA,算出来的轨道会和 BOLL 有差别,两者不能直接对照数值。
学习要点:EMA(X,N) 的平滑系数是 2/(N+1),N=20 时约 0.095。同一根 K 线上,EMA 一定比 MA 更贴近现价,涨势里 EMA 更高、跌势里 EMA 更低。
第3层:标准差的三步写法
先把收盘价减去中轨再平方,然后对平方值取 20 日均值,最后开方。这就是「围绕 EMA 计算的 20 日标准差」,也就是布林带的半宽。刻意不用 STD 函数而展开成 POW / MA / SQRT 三步,好处是老版本的通达信也认。
学习要点:方差的标准写法就是「先平方、再平均、最后开方」,顺序不能换。注意这里的标准差围着 EMA 算,不是围着 MA 算,所以它和系统 BOLL 的带宽数值不会相等。
第4层:上下轨,以及「上轨取昨日」这一手
AF5 是中轨加 2 倍标准差,即布林上轨;AF6 是中轨减 2 倍标准差,即下轨;AF7 是前一日的中轨。这三个变量里,真正被后面用到的只有 AF5,另外两个定义了却没有引用(见第五节)。
判断时用的是 REF(AF5,1),也就是昨日那条上轨。这一步很关键:当日收盘同时参与了上轨的计算,如果拿当日上轨比当日收盘,价格上涨会自己把上轨抬高,形成「自己抬高门槛再跨过去」的自我强化。换成昨日上轨,等于用「昨天收盘时画好的通道」来检验今天有没有越界,口径更干净。
学习要点:凡是「用当日数据算门槛、再拿当日价格去比」的写法,都要警惕自我确认。通用解法就是 REF(...,1)。箱顶线用 REF 剔当日,也是同一个思路。
第5层:量比,分母是「昨天为止」的 5 日均量
V 是当日成交量,分母是昨日往前 5 日的平均成交量。这一天之差很重要:如果写成当日的 5 日均量,今天的放量会先把自己的基准抬上去,量比反而被压低。
实测信号点的量比分布:最小值 1.80(刚好过线)、中位数 2.63、最大值 53.04。极端值都出现在平时成交极清淡的个股上,基数太小,一两笔大单就能把比值拉得很高。
学习要点:行情软件里显示的「量比」,多数是用当日已成交的分钟量折算成全日量再比 5 日均量;这里是直接用日线成交量比,属于收盘量比。盘中看两者会差得比较远,盘后也未必相等,阈值 1.8 是按这套日线口径定的。
第6层:信号合成,两道冷却
这一条同时卡了四件事:收盘价高于箱顶、收盘价高于昨日上轨、量比大于 1.8,以及 COUNT(...,7)=1 —— 同一个条件在最近 7 天里只能成立过 1 次。换成白话说:今天必须是这波突破的第一天,第二天、第三天都不算。外面再套一层 FILTER(...,10),10 天内只允许输出一次信号。
这两道冷却功能高度重叠。实测:只去掉 COUNT 保留 FILTER,信号 4089 次(多 5.1%);只去掉 FILTER 保留 COUNT,信号 3949 次(多 1.5%);两个都去掉,信号 6528 次(多 68%)。也就是说,单留任意一道,密度就接近原公式;两道都拆掉,信号会明显变密。
学习要点:COUNT(X,N)=1 是「区间内首次」的经典写法,写成 >0 就等于「N 天内出现过」,一次突破后面几天会连续出信号;FILTER(X,N) 是「信号后 N 根内不再出」,两者解决的是同一类问题,同时用属于双保险。
第7层:副图里那两个标注
DRAWTEXT 在 0.5 的高度写一个「爆」字,STICKLINE 从 0 画到 0.6 一根紫色柱。这里的 0.5 和 0.6 是副图的纵坐标,不是股价:XG 输出只有 0 和 1 两个值,副图坐标轴就是 0 到 1,所以在 0.5 附近标字、在 0 到 0.6 之间画柱,视觉上就是「信号出现时冒一根短柱 + 一个爆字」。
学习要点:STICKLINE(条件, 起点, 终点, 宽度, 空心) 五个参数都不能省;DRAWABOVE 表示文字画在指定位置上方。这两行只负责显示,删掉不影响 XG 的任何取值。
三、实战图例:信号在图上长什么样?
加载副图版后,副图只有一条 0 到 1 的信号线;信号出现时,那一根会竖起一根紫色短柱,并在上方标出「爆」字。选股版不画任何东西,只负责在盘后列出当天命中的个股。

看图重点:先确认信号当根是不是实体阳线(公式本身不要求阳线,只要求收盘价过线,所以理论上也可能在阴线上触发),再看是不是第一次越过两条线,最后看量能柱有没有明显高于前面几天。图中信号仅展示公式输出形态,不构成投资建议。
四、两个版本的差异对照
把两版源码逐条比过之后,差异只有末尾两行绘图语句,前面的 12 条逐字节完全相同:
两个版本都只有一条 XG 输出,其余变量全部用 := 定义,属于中间变量,不会画线。
五、实战使用注意事项(必看)
① 信号频率实测:700 只沪深主板与创业板、每只近 500 根日线(35 万根 K 线、约 1400 个股票·年),共 3890 次信号,平均每股每年 2.78 次。放在全市场 5000 多只个股上,一个交易日平均会有十几只命中,适合盘后做初筛,不适合当唯一条件。
② 有三个变量定义了没有用到:AF1:=MA(C,20)、AF6:=中轨-2*AF4、AF7:=REF(中轨,1)。按引用次数统计,这三条在后续语句里出现 0 次,删掉不会改变任何信号。其中 AF1 是一条 20 日简单均线,和 EMA 中轨并列放着却没用上,猜测原本是想对比两条均线的差别,最后没写完。
③ 颜色和线宽写在了不输出的变量上:箱顶:=...,COLORYELLOW,LINETHICK2 这类写法,因为用的是 :=(中间变量,不画线),后面的颜色、线宽属性不会生效,图上不会出现黄线红线。想看这两条通道线,只能把对应变量改成输出的 :,并且建议单独做一个主图版本,因为副图的坐标轴是 0 到 1,塞进价格线会把信号挤成一条直线。这属于改公式,本文不动原文,只把现象讲清楚。
④ 量比是最紧的一条:去掉「量比>1.8」,信号从 3890 次涨到 5482 次(+41%);去掉「收盘高于上轨」是 +20%,去掉「收盘高于箱顶」是 +14%。换句话说,这套公式主要靠量能在收敛信号,把阈值从 1.8 调到 2.5 会明显变稀,调到 1.2 会明显变密。
⑤ 两条线里,布林上轨更紧:全样本里「收盘高于箱顶」出现 28883 根,「收盘高于布林上轨」只有 20351 根,所以真正卡住大多数交易日的是上轨,箱顶只在部分区间起作用。
⑥ 两道冷却高度重叠:COUNT(...,7)=1 与 FILTER(...,10) 解决的是同一件事,实测只留任一道,信号量变化都在 6% 以内;两道都去掉才会多出 68%。想调信号密度,改这两个参数比改量比阈值更温和。
⑦ 它不判断位置,高位低位都会出信号:实测信号时点相对 EMA20 的乖离率中位数 7.70%,只有 23.2% 在 5% 以内,33.3% 超过 10%;前 60 日涨幅中位数 8.0%,其中 24.2% 是下跌之后的突破,12.0% 是 60 日已涨超 30% 的强势股再突破;还有 19.3% 的信号当根直接创出 250 日新高。结论很明确:这个公式不管你在什么位置,只管今天有没有双线突破加放量。实际使用时务必自己加一层位置或趋势约束(比如限制乖离率、要求中期均线向上)。
⑧ 没有未来函数:全程只用到 REF / HHV / MA / EMA / POW / SQRT / COUNT / FILTER 这类基于历史数据的函数,没有 ZIG,没有负值 REF,历史信号不会因为后面的行情而漂移。
六、延伸学习
1. REF(HHV(C,N),1):先剔除当日再取区间极值,是防止「自己确认自己」的通用手法,做箱体、做压力位都用到它;
2. POW + MA + SQRT:标准差的展开写法,理解这三步就能改出「围绕任意均线、任意倍数的通道」;
3. COUNT(X,N)=1 与 FILTER(X,N):控制信号密度的两种常用手段,一个管「区间首次」,一个管「冷却期」;
4. V/REF(MA(V,5),1):自建量比的标准写法,换成 MA(V,5) 就是把今天的量算进基准,量比会被系统性低估。
七、完整源码(复制前请先对照上方逐层解读)
第一段:副图版,14 条语句,加载到「技术指标公式 - 副图」,带「爆」字标注与紫色信号柱。
第二段:选股版,12 条语句,只到 XG 为止,放进「条件选股公式」就能盘后海选。前 12 条与副图版逐字节相同。
互动问答:
使用指标时遇到任何问题(如安装、信号解读等),欢迎在留言区提问,我会第一时间解答。
也可以分享你的用法:这套公式你通常配什么位置条件一起用。
制作不易,麻烦点亮右下角的 "赞" + "在看" 支持一下。
转发给身边朋友,一起交流进步。
喜欢我的分享,记得关注我,持续更新干货。
免责声明
本文所有源码及解读内容仅为通达信公式编程教学,目的在于帮助读者理解指标编写逻辑和函数用法。文中提到的任何指标名称、信号条件、参数设置均不构成任何投资建议。
指标是辅助分析工具,其信号仅反映特定数学条件是否满足,不代表对未来走势的预测。实际使用时请务必结合自身判断和其他分析方法,理性决策。投资有风险,入市需谨慎。















































































