逐行拆解80行通达信源码,我总结了8个核心编程技巧|"超强主升浪"指标深度教学
免责声明:本文为通达信指标公式的编写教学与技术分析知识分享,旨在帮助读者理解指标源码的逻辑结构和编程技巧。本文不构成任何投资建议,不推荐任何个股或交易策略。股市有风险,投资需谨慎,请读者根据自身情况独立判断,理性投资。
前言
很多朋友在通达信里导入了各种指标,知道”出信号就买、消失就卖”,但从来没有认真看过指标的源码。这就好比你每天开车上下班,却完全不知道发动机是怎么工作的——能用,但一出问题就抓瞎。
之后,我将专注于拆解指标,分享一些指标编写心得,方法。欢迎大家交流
今天我们拿一个结构非常完整的指标——**”超强主升浪”**来做拆解教学。这个指标涉及量价分析、趋势判断、多周期共振、能量计算等多个模块,是一个非常好的学习样本。读完这篇文章,你不仅能看懂这个指标,还能掌握通达信公式编写中的很多常用技巧。

一、指标总览:它在干什么?
在拆解源码之前,我们先从整体上理解这个指标想做什么。
这个指标的核心目标是:找到同时满足以下条件的时刻——
-
1. 资金在净流入(量价配合良好) -
2. 趋势指标刚刚突破关键位置 -
3. 市场能量为正 -
4. 短、中、长期趋势全部向上 -
5. 价格创出阶段新高
当所有条件同时满足时,指标会在副图中显示”★超强主升”的信号。
副图底部还有两组彩色柱状条,分别是”价格跟踪线”和”量能跟踪线”,用红色和绿色直观显示当前市场状态。
下面我们一个模块一个模块来拆。
二、模块一:量价关系判断
超强主升浪:=(HHV(H,3)+LLV(L,3))/2;A:=IF(C>超强主升浪,VOL,0);B:=IF(C<超强主升浪,VOL,0);主升浪启动:=(A-B);变盘节点:=EMA(主升浪启动,3)/SUM(VOL,5)*100;AAC6:=变盘节点>=0;
逐行解读:
第1行超强主升浪:=(HHV(H,3)+LLV(L,3))/2;
-
• HHV(H,3)是最近3天的最高价中的最大值 -
• LLV(L,3)是最近3天的最低价中的最小值 -
• 两者相加除以2,得到一个3日价格中轴 -
• 这就像画了一条”最近3天的中间价”线
第2-3行A:=IF(C>超强主升浪,VOL,0);和 B:=IF(C<超强主升浪,VOL,0);
-
• 如果今天的收盘价高于这个中轴,就把今天的成交量记为”多头量”(A) -
• 如果低于中轴,就记为”空头量”(B) -
• 这是一个非常经典的量价分类技巧:用价格位置来给成交量”贴标签”
第4行主升浪启动:=(A-B);
-
• 多头量减去空头量,得到”净多头量” -
• 正值说明资金偏多头,负值说明资金偏空头
第5行变盘节点:=EMA(主升浪启动,3)/SUM(VOL,5)*100;
-
• 对净多头量做3日指数平滑,再除以5日总成交量 -
• 这样就把绝对数值变成了一个比例指标,不同股票之间可以比较 -
• 乘以100是为了让数值更直观
第6行AAC6:=变盘节点>=0;
-
• 最终判断:变盘节点大于等于0,说明资金面偏多,条件满足
编程技巧总结:这个模块展示了一个常见的公式设计思路——先设定一个”分界线”(这里用3日中轴),然后用IF函数把成交量分成多空两类,最后看净值。这比单纯看成交量大小要有意义得多。
三、模块二:趋势指标(核心模块)
ABC3:=(2*CLOSE+HIGH+LOW)/4;ABC4:=LLV(LOW,34);ABC5:=HHV(HIGH,34);趋势:=EMA((ABC3-ABC4)/(ABC5-ABC4)*100,13);人气1:=EMA(0.667*REF(趋势,1)+0.333*趋势,2);T:=人气1<趋势;
逐行解读:
第1行ABC3:=(2*CLOSE+HIGH+LOW)/4;
-
• 这不是普通的收盘价,而是一个加权平均价 -
• 收盘价的权重是2,最高价和最低价各权重1 -
• 这样做的好处是:更重视收盘价(因为收盘价最能反映多空博弈的结果),同时也考虑了日内波动
第2-3行ABC4:=LLV(LOW,34);和 ABC5:=HHV(HIGH,34);
-
• 34天内的最低价和最高价,构成了一个价格通道 -
• 34这个参数不是随便选的,它是斐波那契数列中的一个数
第4行趋势:=EMA((ABC3-ABC4)/(ABC5-ABC4)*100,13);
-
• (ABC3-ABC4)/(ABC5-ABC4)*100的含义是:当前价格在34天通道中的位置 -
• 如果价格在通道底部,这个值接近0;在顶部则接近100 -
• 再做13日指数平滑,去掉毛刺 -
• 这个公式的原型其实是大家熟悉的**威廉指标(WR)**的变体
第5行人气1:=EMA(0.667*REF(趋势,1)+0.333*趋势,2);
-
• 这是趋势的一条”慢线” -
• 0.667*REF(趋势,1)+0.333*趋势让昨天的趋势值占三分之二、今天占三分之一 -
• 再做2日平滑,效果就是:人气1的反应比趋势更慢 -
• 用途:快线(趋势)和慢线(人气1)的交叉关系可以判断方向变化
第6行T:=人气1<趋势;
-
• 当快线在慢线上方时,说明趋势在加速向上——这是一个多头排列的信号
编程技巧总结:把价格标准化到0-100的区间是指标编写中非常实用的技巧。这样不管股价是5块还是500块,指标值都在同一个范围内,方便设定统一的阈值(比如后面用到的30和60)。
四、模块三:交叉信号判断
ACB1:=CROSS(趋势,30)<1;ACB2:=CROSS(REF(趋势,1),30) AND REF(人气1,1)<REF(趋势,1);ACB3:=CROSS(REF(趋势,2),30) AND REF(人气1,2)<REF(趋势,2);ACB4:=ACB2 OR ACB3;ACB5:=T AND ACB1 AND ACB4;ACB6:=CROSS(趋势,60) AND 人气1<趋势;
逐行解读:
第1行ACB1:=CROSS(趋势,30)<1;
-
• CROSS(趋势,30)返回1表示趋势今天刚好上穿30 -
• <1就是说今天没有上穿30,即趋势已经在30以上了 -
• 换句话说:趋势之前就已经突破了30
第2-3行ACB2和ACB3分别检查:1天前或2天前趋势是否刚好上穿30,并且当时快线在慢线上方
第4行ACB4:=ACB2 OR ACB3;
-
• 1天前或2天前有上穿,满足其一即可
第5行ACB5:=T AND ACB1 AND ACB4;
-
• 当前多头排列 + 已在30以上 + 近期刚突破过30 -
• 但注意,ACB5在最终的信号里没有被直接使用,它是一个中间过渡变量
第6行ACB6:=CROSS(趋势,60) AND 人气1<趋势;← 这才是最终用到的
-
• 趋势上穿60(进入强势区)+ 快线在慢线上方 -
• 这是一个更严格的条件:不仅要多头排列,还要趋势值突破60这个高位
编程技巧总结:这里展示了一个重要的设计模式——用CROSS函数配合REF回溯来检测”最近几天内是否发生过某个事件”。直接用CROSS只能判断”今天是否发生”,加上REF就可以把检测窗口拉宽。
五、模块四:能量计算
能量:=SQRT(VOL)*(((C-(H+L)/2))/((H+L)/2));平滑能量:=EMA(能量,10);人气A:=EMA(平滑能量*5,10);ACB7:=人气A>=0 OR 人气A<0;ACB8:=人气A>=0;
逐行解读:
第1行能量:=SQRT(VOL)*(((C-(H+L)/2))/((H+L)/2));
-
• SQRT(VOL)对成交量取平方根——这是为了压缩大成交量的影响,防止某天放巨量时能量值暴涨 -
• (C-(H+L)/2)/(H+L)/2是收盘价相对于日内中间价的偏离百分比 -
• 整体含义:成交量越大、收盘价越接近当日高点,能量越大;越接近低点,能量越小(甚至为负) -
• 这个公式把”量”和”价格位置”结合在了一起,比单纯看量更有信息量
第2-3行两次EMA平滑,消除噪音
第4行ACB7:=人气A>=0 OR 人气A<0;
-
• 大于等于0或者小于0——这永远为真! -
• 这行实际上没有任何筛选作用,属于一个预留的条件接口,当前并未起到筛选效果
第5行ACB8:=人气A>=0;
-
• 这才是真正的条件:能量指标为正,说明市场做多能量占优
编程技巧总结:
SQRT(VOL)是处理成交量的一个好方法。在指标编写中,成交量的绝对数值差异巨大(几百万到几十亿),取平方根可以有效缩小这种差异,让指标更稳定。另外,ACB7这种”恒真”的写法在实际开发中应该避免,它不产生任何效果,只增加了代码的混乱。
六、模块五:多周期趋势共振
EM01:=EMA(C,13);EM:=EMA(C,21);UP:=EMA(EM,13);DOWN:=EMA(EM,17);短期趋势:=(EMA(EM01,2)+EMA(EM01,7))/2;中期趋势:=(UP+DOWN)/2;长期趋势:=EMA(C,144);AAC8:=短期趋势>REF(短期趋势,1) AND 中期趋势>REF(中期趋势,1) AND 长期趋势>REF(长期趋势,1);
逐行解读:
这个模块构建了三条不同周期的趋势线:
-
• 短期趋势:基于13日EMA,取2日和7日平滑的均值——反映最近一两周的方向 -
• 中期趋势:基于21日EMA再分别做13日和17日平滑——反映一两个月的方向 -
• 长期趋势:144日EMA——约半年的大方向(144也是斐波那契数)
关键判断AAC8:短期、中期、长期趋势全部在上升(今天的值大于昨天的值)。
这就是所谓的多周期共振——三个时间维度同时向上,说明趋势非常强劲。
编程技巧总结:“多层EMA嵌套”是通达信公式里的常见手法。
EMA(EMA(C,21),13)比单独用一个EMA(C,34)更平滑,对价格变化的反应也不同。选择13、21、144这些参数,可能与斐波那契数列有关,这在技术分析中很常见。
七、模块六:新高突破检测
AAC1:=C=HHV(C,20);AAC2:=BARSLAST(AAC1);AAC3:=IF(AAC2>0,REF(C,AAC2),REF(C,AAC2));AAC4:=CROSS(C,REF(AAC3,1));AAC5:=AAC4 AND COUNT(AAC4,5)=1;
逐行解读:
第1行AAC1:=C=HHV(C,20);
-
• 今天的收盘价等于20天内的最高收盘价——也就是创了20日新高
第2行AAC2:=BARSLAST(AAC1);
-
• BARSLAST返回上一次创新高距今的天数 -
• 比如3天前最后一次创新高,AAC2就是3
第3行AAC3:=IF(AAC2>0,REF(C,AAC2),REF(C,AAC2));
-
• 获取上一次创新高那天的收盘价 -
• 注意:这里的IF语句两个分支是一样的,逻辑上可以简化为 AAC3:=REF(C,AAC2); -
• 这也是一处可以优化的冗余代码
第4行AAC4:=CROSS(C,REF(AAC3,1));
-
• 今天的收盘价上穿了”上一次新高的价格”——即突破前高
第5行AAC5:=AAC4 AND COUNT(AAC4,5)=1;
-
• 突破前高,且5天内只发生了一次——去重,避免连续几天反复突破时重复发信号
编程技巧总结:
BARSLAST+REF的组合是通达信编程的经典模式,用于获取”上一次某个条件成立时的数据”。COUNT(条件,N)=1则是一种常用的去重技巧。值得注意的是,AAC5在最终信号中没有被直接使用——这种情况在复杂指标中很常见,一些中间变量在设计过程中被更简洁的逻辑替代了,但代码保留了下来,大家在学习时注意区分哪些变量真正参与了最终判断。
八、模块七:最终信号生成
人气:=AAC6 AND ACB6 AND ACB8 AND AAC8,COLORCYAN;STICKLINE(人气,60,0,2,0),COLORYELLOW;DRAWTEXT(人气,38,' ★超强主升'),COLORYELLOW;DRAWICON(人气,8,18);DRAWICON(人气,55,18);
逐行解读:
信号条件人气同时要求:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
四个条件缺一不可——这就是为什么信号出现的频率并不高。
显示效果:
-
• STICKLINE(人气,60,0,2,0):画一根从0到60的黄色柱子 -
• DRAWTEXT(人气,38,' ★超强主升'):在38的位置显示文字 -
• DRAWICON(人气,8,18)和DRAWICON(人气,55,18):在8和55的位置各画一个图标(18号是系统预设图标)
编程技巧总结:用AND连接多个条件是”宁缺毋滥”的设计思路——宁可少发信号,也不轻易误判。但也要注意,条件越多,信号越稀少,实际使用中要根据自己的需求调整条件数量。
九、模块八:趋势状态可视化(彩色柱状条)
这一段代码比较长,但逻辑是重复的。它画了两组彩色柱状条来直观展示市场状态。
第一组:牛线和马线系统(位置:65-68区域)
MID:=(3*CLOSE+LOW+OPEN+HIGH)/6;牛线:=(20*MID+19*REF(MID,1)+18*REF(MID,2)+...+REF(MID,20))/210;马线:=MA(牛线,6);
-
• MID是一个六分之一加权的综合价格(收盘价权重最大) -
• 牛线是一个加权移动平均——越近的数据权重越大(20、19、18…1),这比普通均线对近期价格更敏感 -
• 马线是牛线的6日均线,更平滑 -
• 收盘价在牛线以上 → 红色柱(看多);在马线以下 → 绿色柱(看空);介于两者之间 → 绿色柱(观望)
接下来还有类似的判断用到了60日和120日均线、45日和90日均线、30日和60日均线——本质上就是从多个时间周期来确认趋势方向,然后用颜色堆叠显示,让你一眼就能看到当前的多空状态。
第二组:短期趋势确认(位置:70-73区域)
M3:=MA(CLOSE,3);M13:=MA(CLOSE,13);M34:=MA(CLOSE,34);STICKLINE(M3>=M13 AND M34>=REF(M34,1),70,73,8,0),COLORRED;
用3日、13日、34日三条均线的排列关系来判断短期状态:
-
• M3在M13上方 + M34在上升 → 红色(强势) -
• 其他情况 → 绿色(弱势或调整)
编程技巧总结:
STICKLINE函数在副图中画彩色柱状条是通达信指标可视化的常用手段。通过在不同纵坐标位置(65-68、70-73)画柱子,可以实现”多行状态灯”的效果——就像仪表盘上的信号灯一样直观。
十、这个指标的优点和局限
优点
-
1. 多维度验证:不是单一条件,而是量价、趋势、能量、多周期四个维度同时确认,减少了误判 -
2. 可视化清晰:底部的彩色柱状条让你不用看数字就能判断当前状态 -
3. 信号明确:出现”★超强主升”就是明确的提示,不存在模糊地带
局限
-
1. 严重滞后:四个条件同时满足时,股价往往已经涨了一段,信号出现时股价通常已经离底部有一定距离 -
2. 不适合震荡市:这种趋势型指标在横盘震荡中会频繁失效 -
3. 缺少止损逻辑:指标只告诉你”什么时候可能开始主升”,但没有告诉你”什么时候应该离场” -
4. 代码有冗余:ACB7是恒真条件、ACB5和AAC5没有被最终使用、AAC3的IF两个分支相同——这些都是我们学习时需要识别的”无效代码”,实际编写指标时应当避免
十一、学到了哪些通达信编程技巧?
通过这个指标的拆解,我们学到了以下实用技巧:
-
1. 量价分类法:用IF函数根据价格位置给成交量贴标签 -
2. 标准化处理:把价格映射到0-100区间,方便设置统一阈值 -
3. 多层EMA嵌套: EMA(EMA(X,N1),N2)获得更平滑的趋势线 -
4. BARSLAST+REF组合:获取”上一次满足某条件时”的历史数据 -
5. COUNT去重: COUNT(条件,N)=1避免信号重复触发 -
6. SQRT压缩成交量:用平方根缩小成交量的数量级差异 -
7. STICKLINE画状态灯:在副图不同位置画彩色柱子做可视化仪表盘 -
8. 多条件AND组合:多个维度同时满足才发信号,提高可靠性
附:完整源码
(如需在通达信中使用,直接复制以下内容到公式管理器新建副图指标即可)
超强主升浪:=(HHV(H,3)+LLV(L,3))/2;A:=IF(C>超强主升浪,vol,0);B:=IF(C<超强主升浪,VOL,0);主升浪启动:=(A-B);变盘节点:=EMA(主升浪启动,3)/SUM(VOL,5)*100;AAC6:=变盘节点>=0;ABC3:=(2*CLOSE+HIGH+LOW)/4;ABC4:=LLV(LOW,34);ABC5:=HHV(HIGH,34);趋势:=EMA((ABC3-ABC4)/(ABC5-ABC4)*100,13);人气1:=EMA(0.667*REF(趋势,1)+0.333*趋势,2);T:=人气1<趋势;ACB1:=CROSS(趋势,30)<1;ACB2:=CROSS(REF(趋势,1),30) AND REF(人气1,1)<REF(趋势,1);ACB3:=CROSS(REF(趋势,2),30) AND REF(人气1,2)<REF(趋势,2);ACB4:=ACB2 OR ACB3;ACB5:=T AND ACB1 AND ACB4;ACB6:=CROSS(趋势,60) AND 人气1<趋势;能量:=SQRT(VOL)*(((C-(H+L)/2))/((H+L)/2));平滑能量:=EMA(能量,10);人气A:=EMA(平滑能量*5,10);ACB7:=人气A>=0 OR 人气A<0;ACB8:=人气A>=0;EM01:=EMA(C,13);EM:=EMA(C,21);UP:=EMA(EM,13);DOWN:=EMA(EM,17);短期趋势:=(EMA(EM01,2)+EMA(EM01,7))/2;中期趋势:=(UP+DOWN)/2;长期趋势:=EMA(C,144);AAC8:=短期趋势>REF(短期趋势,1) AND 中期趋势>REF(中期趋势,1) AND 长期趋势>REF(长期趋势,1);AAC1:=C=HHV(C,20);AAC2:=BARSLAST(AAC1);AAC3:=IF(AAC2>0,REF(C,AAC2),REF(C,AAC2));AAC4:=CROSS(C,REF(AAC3,1));AAC5:=AAC4 AND COUNT(AAC4,5)=1;人气:=AAC6 AND ACB6 AND ACB8 AND AAC8,COLORCYAN;STICKLINE(人气,60,0,2,0),COLORYELLOW;DRAWTEXT(人气,38,' ★超强主升'),COLORYELLOW;DRAWICON(人气,8,18);DRAWICON(人气,55,18);MID:=(3*CLOSE+LOW+OPEN+HIGH)/6;牛线:=(20*MID+19*REF(MID,1)+18*REF(MID,2)+17*REF(MID,3)+16*REF(MID,4)+15*REF(MID,5)+14*REF(MID,6)+13*REF(MID,7)+12*REF(MID,8)+11*REF(MID,9)+10*REF(MID,10)+9*REF(MID,11)+8*REF(MID,12)+7*REF(MID,13)+6*REF(MID,14)+5*REF(MID,15)+4*REF(MID,16)+3*REF(MID,17)+2*REF(MID,18)+REF(MID,20))/210,COLORGREEN;马线:=MA(牛线,6),COLORMAGENTA;STICKLINE(C>牛线,65,68,8,0),COLORRED,LINETHICK2;STICKLINE(C<马线,65,68,8,0),COLOR99CC32,LINETHICK2;STICKLINE(牛线>=C AND C>=马线,65,68,8,0),COLOR99CC32,LINETHICK2;A1:=MAX(MA(C,60),MA(C,120));B1:=MIN(MA(C,60),MA(C,120));STICKLINE(C>=A1,65,68,8,0),COLORRED,LINETHICK2;STICKLINE(C<=B1,65,68,8,0),COLOR99CC32,LINETHICK2;STICKLINE(A1>=C AND C>=B1,65,68,8,0),COLOR99CC32,LINETHICK2;E:=MAX(MA(C,45),MA(C,90));F:=MIN(MA(C,45),MA(C,90));STICKLINE(C>E,65,68,8,0),COLORRED,LINETHICK2;STICKLINE(C<F,65,68,8,0),COLOR99CC32,LINETHICK2;STICKLINE(E>=C AND C>=F,65,68,8,0),COLOR99CC32,LINETHICK2;J:=MAX(MA(C,30),MA(C,60));K:=MIN(MA(C,30),MA(C,60));STICKLINE(C>J,65,68,8,0),COLORRED,LINETHICK2;STICKLINE(C<K,65,68,8,0),COLOR99CC32,LINETHICK2;STICKLINE(J>=C AND C>=K,65,68,8,0),COLOR99CC32,LINETHICK2;M3:=MA(CLOSE,3),COLORRED;M13:=MA(CLOSE,13),COLORRED;M34:=MA(CLOSE,34),COLORRED;X:=BARSLAST(REF(CROSS(C,MA(C,120)),1)) AND CROSS(MA(C,20),MA(C,120));STICKLINE(M3>=M13 AND M34>=REF(M34,1),70,73,8,0),COLORRED;STICKLINE(M3<M13 AND M34>=REF(M34,1),70,73,8,0),COLOR99CC32;STICKLINE(M3<M13 AND M34<REF(M34,1),70,73,8,0),COLOR99CC32;STICKLINE(M3>=M13 AND M34<REF(M34,1),70,73,8,0),COLORRED;DRAWTEXT_FIX(ISLASTBAR,0.855,0.009,0,'★价格跟踪线★'),COLORFFFFFF;DRAWTEXT_FIX(ISLASTBAR,0.855,0.080,0,'★量能跟踪线★'),COLORYELLOW;
免责声明:本文仅为通达信指标公式的编写教学与逻辑拆解,所有内容均基于技术分析理论的知识分享,不构成任何投资建议。技术指标存在固有的滞后性和局限性,任何单一指标都不能保证盈利。股市有风险,入市需谨慎。读者请根据自身风险承受能力和投资经验独立做出决策,盈亏自负。
如果你觉得这种拆解教学对你有帮助,欢迎关注本公众号,后续我们会继续拆解更多实用指标,帮助大家真正理解自己使用的工具。

夜雨聆风