
简介这是一份通达信指标公式源码文档围绕「国外MACD」在主图上的改版实现展开面向已具备一定技术分析基础、熟悉通达信公式编辑器的股票、期货及外汇投资者与量化爱好者。资源为单个doc文档压缩包约226KB体量轻巧解压后可直接对照公式管理器逐行研读与调试。文档完整收录了RR、R、M三个核心变量的计算逻辑以EMA(C,5)与EMA(C,13)之差为基准再经一次EMA平滑分别结合HHV、LLV与ABS函数在3周期、100周期上测算波动区间从而把MACD的收敛散度关系映射为主图上的多空参考线。配套的绘图与着色指令如四段式上下轨、POINTDOT零轴、LINETHICK2主线以及ISLASTBAR触发的▲▼文字提示可直观标注当前趋势的转向信号。目前已有131人学习下载适合希望理解公式构造原理、并按自身习惯调整参数与显示效果的中高级用户参考。1. 从一根主图通道线说起国外MACD主图公式的构成与用途很多人拿到.doc格式的通达信指标公式源码第一反应是复制到公式管理器但往往因为主图坐标和数值量级对不上看到的是几条挤在零轴附近的线。这份“国外MACD-主图 周线”源码把 MACD 的差值做了一次 EMA 平滑再用 3 周期和 100 周期的 HHV/LLV 构造出两个动态通道最后用四分之一分割线画出上轨、上中轨、零轴、下中轨和下轨。它解决的不是传统副图 MACD 的金叉死叉而是把趋势强度直接叠加到 K 线主图上让周线波段交易者一眼看到当前价差处于短期通道还是长期通道的哪个位置。适合已经熟悉通达信指标公式、想改 MACD 主图显示、或者需要做量化指标公式源码二次开发的人。代码里用到了DRAWTEXT、ISLASTBAR、COLOR等绘图指令读懂它就能迁移到其他主图指标。2. 拆解 RR 与 R 的 HHV/LLV 通道算法2.1 核心差值 M 的构造EMA 嵌套与参数含义先看最核心的一行M:EMA(EMA(C,5)-EMA(C,13),1),LINETHICK2,COLORYELLOW;。通达信里C是收盘价序列EMA(C,5)是 5 周期指数移动平均EMA(C,13)是 13 周期指数移动平均。两者相减得到的是一个类似 MACD 中 DIF 的差值记为DIF EMA(C,5) - EMA(C,13)。外面再套一层EMA(...,1)周期为 1 的 EMA 在数学上等于原序列但这样写保留了“再做一次平滑”的语义也方便后续把周期 1 改成 2 或 3 来增加平滑度。M用黄色粗线输出因为它是主图上的趋势主线。{ 核心差值 M 的构造 } DIF : EMA(C,5) - EMA(C,13); { 快慢 EMA 差值类似 MACD DIF } M : EMA(DIF,1); { 二次 EMA 平滑周期 1 表示暂不额外平滑 }逻辑说明先算快慢线差值再套一层 EMA。参数说明C是收盘价5 和 13 是快慢周期1 是二次平滑周期。常见做法是把 5/13 改成 12/26 以贴近传统 MACD但周线级别下 5/13 更灵敏。改动二次平滑周期会改变M的滞后周期越大线条越平信号越少。参数原文取值作用可调范围周线建议快线周期5短期 EMA3-125 或 8慢线周期13长期 EMA10-3013 或 21二次平滑1对差值再平滑1-51-2短通道周期3HHV/LLV 回溯2-103-5长通道周期100HHV/LLV 回溯50-200100 或 1202.2 RR 短周期通道与 R 长周期通道的差异RR和R的公式结构完全一样区别只在HHV和LLV的回溯周期。原文RR : (HHV(EMA(EMA(C,5)-EMA(C,13),1),3) ABS(LLV(EMA(EMA(C,5)-EMA(C,13),1),3))) / 2; R : (HHV(EMA(EMA(C,5)-EMA(C,13),1),100) ABS(LLV(EMA(EMA(C,5)-EMA(C,13),1),100))) / 2;把内层EMA(EMA(C,5)-EMA(C,13),1)记作M上面两行等价于RR : (HHV(M,3) ABS(LLV(M,3))) / 2; R : (HHV(M,100) ABS(LLV(M,100))) / 2;HHV(M,3)是最近 3 根 K 线内M的最高值LLV(M,3)是最低值。ABS取绝对值是为了处理LLV为负数的情况如果最低值是负的取绝对值后变成正数再与最高值相加除以 2就得到通道的半宽。这个半宽被当作正数基准后面用RR/4*4、RR/4*3等比例画出上下轨。RR用 3 周期通道窄反应快适合捕捉短期波动R用 100 周期通道宽代表长期波动范围适合判断大级别趋势位置。项目RRR回溯周期3100通道宽度窄宽反应速度快慢主要用途短期超买超卖长期趋势边界颜色线红/青深蓝/青周线含义3 周波动约 2 年波动2.3 四分之一分割线与颜色标识原文接下来的绘图指令把RR和R各分成四份画出多条水平参考线RR/4*4, COLOR0000FF; { 短通道上轨 } RR/4*3, COLORAAAA00; { 短通道上中轨 } 0, POINTDOT, COLORAAAAAA; { 零轴点线 } -RR/4*3, COLORAAAA00; { 短通道下中轨 } -RR/4*4, COLOR0000FF; { 短通道下轨 } R/4*4, COLOR0000AA; { 长通道上轨 } R/4*3, COLORAAAA00; { 长通道上中轨 } -R/4*3, COLORAAAA00; { 长通道下中轨 } -R/4*4, COLOR0000AA; { 长通道下轨 }RR/4*4就是RR本身等于短通道上轨RR/4*3是四分之三位置可以理解为上中轨-RR/4*3和-RR/4*4是对称的下方轨道。零轴用0,POINTDOT画成灰色点线。颜色代码是通达信特有的 BGR 格式COLOR0000FF是红色COLORAAAA00是偏青的灰绿色COLOR0000AA是深蓝色。不用死记颜色值在公式管理器里点“调色”就能替换。注意原文中有一行-RR/4*3在R的段落里出现从上下文看应该是-R/4*3否则短通道线会重复绘制修正后图形更清晰。2.4 主图叠加的坐标处理与箭头提示这些线都输出在主图上通达信主图指标的坐标默认与价格一致。但M是价格差值数值通常远小于股价所以画出来的通道会集中在零轴附近。如果觉得通道太扁可以给RR和R乘以一个放大系数例如RR*1.5但会改变比例关系。另一种做法是把指标放在副图不过“国外MACD-主图”的定位就是主图叠加所以更适合用来观察M与零轴的距离而不是把通道当价格支撑压力。最后两行DRAWTEXT只在最后一根 K 线画箭头DRAWTEXT(ISLASTBAR AND MREF(M,1), M, ▲), COLORDD00FF; DRAWTEXT(ISLASTBAR AND MREF(M,1), M, ▼), COLORCCEE00;ISLASTBAR判断是否为最后一根 K 线REF(M,1)取上一根 K 线的M值。当M比前值大时在M位置标上箭头反之标下箭头。这个信号只反映最后一根 K 线的边际变化不是完整的买卖信号实战中要结合通道位置。3. 通达信公式管理器里复现与调试这套主图指标3.1 新建主图公式与代码粘贴打开通达信按CtrlF进入公式管理器选择“技术指标公式”下的“其他类型”点“新建”。公式名称可以填GW_MACD_MAIN画线方法选择“主图叠加”。把整理后的源码粘贴进去。为了兼容编译建议把原文的0000改成0把疑似笔误的-RR/4*3改成-R/4*3。整理后的完整代码如下{ 国外MACD-主图 周线 整理版 } RR : (HHV(EMA(EMA(C,5)-EMA(C,13),1),3) ABS(LLV(EMA(EMA(C,5)-EMA(C,13),1),3))) / 2; R : (HHV(EMA(EMA(C,5)-EMA(C,13),1),100) ABS(LLV(EMA(EMA(C,5)-EMA(C,13),1),100))) / 2; M : EMA(EMA(C,5)-EMA(C,13),1); RR/4*4, COLOR0000FF; RR/4*3, COLORAAAA00; 0, POINTDOT, COLORAAAAAA; -RR/4*3, COLORAAAA00; -RR/4*4, COLOR0000FF; R/4*4, COLOR0000AA; R/4*3, COLORAAAA00; -R/4*3, COLORAAAA00; -R/4*4, COLOR0000AA; M, LINETHICK2, COLORYELLOW; DRAWTEXT(ISLASTBAR AND MREF(M,1), M, ▲), COLORDD00FF; DRAWTEXT(ISLASTBAR AND MREF(M,1), M, ▼), COLORCCEE00;逻辑说明前三个赋值语句定义RR、R、M后面是绘图输出。通达信要求输出语句不带冒号赋值语句用:或:区别是否输出。M用:输出所以会画线RR和R用:只作为中间变量。参数说明没有外部参数所有周期都写死在代码里。如果想在公式管理器里直接调参可以把 5、13、3、100 改成参数例如N1、N2、N3、N4然后在参数表里设置最小、最大、缺省值。原文数值参数名缺省最小最大5N1523013N2135603N33220100N4100202503.2 常见编译错误与修正通达信公式编译对空格、中文标点、变量名大小写不敏感但有几个坑很常见。第一个是0000被当成数字 0有些版本可以过有些版本会提示“变量未定义”写成0最稳。第二个是箭头字符 ▲如果公式编辑器编码不对会显示成乱码可以换成UP或↑。第三个是DRAWTEXT的位置参数M必须与主图坐标兼容如果M是负值箭头会画在零轴下方。第四个是ISLASTBAR只在最新 K 线返回 1历史回看时没有箭头这不是错误。现象可能原因处理方式提示“变量未定义”0000写法不规范改为0线条全部挤在一起M数值远小于价格改副图或乘放大系数箭头显示为方块字体不支持箭头换成UP/DOWN历史 K 线无箭头ISLASTBAR限制用CROSS替代做历史信号颜色不生效颜色代码写错用调色板重新选色3.3 用调试输出验证中间变量把公式挂到主图后如果线条位置不对不要靠猜。可以临时加几行输出语句把M、RR、R的数值显示出来。例如{ 调试输出验证完删除 } DRAWNUMBER(ISLASTBAR, M, M, 2), COLORWHITE; DRAWNUMBER(ISLASTBAR, RR, RR, 2), COLORRED; DRAWNUMBER(ISLASTBAR, R, R, 2), COLORGREEN;DRAWNUMBER(COND, PRICE, NUMBER, PRECISION)会在满足条件的位置画数字。ISLASTBAR让数字只出现在最后一根 K 线避免历史 K 线全被数字覆盖。PRECISION是小数位数2 表示保留两位。对比M和RR/4*4的大小就能判断当前差值是否触及短通道上轨。调试完把这些行删掉或者用NODRAW隐藏。周线图上还要注意数据下载完整否则 100 周期的HHV会因为缺少历史数据而失真。4. 周线级别下 MACD 主图通道的参数校准与信号验证4.1 周线数据对 EMA 和 HHV 的影响周线一根 K 线代表一周的交易数据EMA(C,5)是 5 周均线EMA(C,13)是 13 周均线HHV(M,100)回看 100 周大约两年。相比日线同样的参数在周线上更平滑通道更宽信号更少但更稳定。波动大的品种在周线上经常出现M长时间停留在正区间或负区间此时RR短通道会收缩R长通道保持宽幅。参数校准的目标是让短通道能覆盖多数短期波动长通道能界定极端区域。常见做法是保持 5/13 不变把短通道周期从 3 改到 5长通道从 100 改到 120减少频繁穿越。参数组合短通道宽度信号频率适用场景5/13/3/100窄高短线波段5/13/5/100中中周线主升8/21/5/120中宽低大级别趋势12/26/3/100宽低传统 MACD 对照4.2 用 Python 复现公式做参数扫描想验证参数改动效果可以用 Python 把公式复现一遍。下面代码用pandas计算M、RR、R并输出最近 20 根 K 线的通道位置。数据源可以是本地导出的周线 CSV字段包含date, open, high, low, close。import pandas as pd import numpy as np # 读取周线数据按日期升序 df pd.read_csv(weekly.csv, parse_dates[date]).sort_values(date) close df[close] # 通达信 EMA 递推EMA_t alpha * close_t (1-alpha) * EMA_{t-1} def ema(series, n): return series.ewm(spann, adjustFalse).mean() # 核心差值 M外层 EMA(...,1) 等价于原值 dif ema(close, 5) - ema(close, 13) M ema(dif, 1) # HHV / LLV 滚动极值 def hhv(series, n): return series.rolling(n).max() def llv(series, n): return series.rolling(n).min() # 短通道和长通道半宽 RR (hhv(M, 3) np.abs(llv(M, 3))) / 2 R (hhv(M, 100) np.abs(llv(M, 100))) / 2 # 生成通道线 df[M] M df[RR_up] RR / 4 * 4 df[RR_mid_up] RR / 4 * 3 df[RR_mid_dn] -RR / 4 * 3 df[RR_dn] -RR / 4 * 4 df[R_up] R / 4 * 4 df[R_dn] -R / 4 * 4 print(df[[date, M, RR_up, RR_dn, R_up, R_dn]].tail(20))逻辑说明ewm(spann, adjustFalse)对应通达信的EMArolling(n).max()对应HHVrolling(n).min()对应LLV。参数说明把span5、span13、hhv(M,3)、hhv(M,100)里的数字改成不同值就能扫描参数。注意 Python 的rolling在窗口不足时返回NaN对应通达信前几根 K 线没有值这是正常的。周线数据要确保没有停牌缺口否则HHV会把异常高低点算进去。4.3 信号验证通道突破与箭头提示原始公式的箭头只判断M比上一根大还是小信号太频繁。实战中更常用的是通道突破当M上穿RR/4*4时说明短期差值突破短通道上轨可能加速当M下穿-RR/4*4时说明跌破下轨可能加速下跌。可以加两行绘图{ 通道突破提示 } DRAWTEXT(CROSS(M, RR/4*4), M, UP), COLORRED; DRAWTEXT(CROSS(-RR/4*4, M), M, DN), COLORGREEN;CROSS(A,B)表示 A 上穿 B。第一行在M上穿短通道上轨时标UP第二行在-RR/4*4上穿M等价于M下穿下轨时标DN。这样历史 K 线上也有信号方便回看。再结合长通道R的位置过滤只有M在长通道内且M0时才关注UP可以过滤掉空头区间的假突破。信号类型触发条件优点缺点原始箭头MREF(M,1)实时提示边际变化只显示最后一根上穿短上轨CROSS(M, RR/4*4)捕捉加速震荡市假信号多下穿短下轨CROSS(-RR/4*4, M)捕捉下跌加速需结合趋势长通道过滤ABS(M)R/4*4排除极端区参数敏感5. 进阶把双通道改造成可筛选的量化条件与排错清单5.1 用条件选股公式提取通道信号主图指标看盘方便但要批量选股得把逻辑搬到条件选股公式里。通达信条件选股公式不支持画线只保留布尔值。可以把M、RR、R的定义复制过去最后写CROSS(M, RR/4*4)作为选股条件。例如{ 周线通道上轨突破选股 } RR : (HHV(EMA(EMA(C,5)-EMA(C,13),1),3) ABS(LLV(EMA(EMA(C,5)-EMA(C,13),1),3))) / 2; M : EMA(EMA(C,5)-EMA(C,13),1); UP : CROSS(M, RR/4*4); UP;这段代码里UP是布尔变量最后一行UP;输出条件。选股时把周期设为周线并勾选“使用前复权数据”避免除权导致EMA和HHV跳变。如果要做盘中预警把C换成C即可但周线预警通常只在周五收盘后或下周初触发。常见做法是再加一层M0过滤只在零轴上方做多。5.2 排错清单与性能注意点公式本身计算量不大但 100 周期的HHV在周线上需要足够历史数据。如果只下载了最近一年数据R会从有数据的地方才开始计算前半段为空。排错时先看数据长度再看复权方式。主图叠加的线条如果颜色重叠可以给RR和R分配不同线型例如LINETHICK1和LINETHICK2区分。箭头字符在部分字体下显示异常换成字母最稳。检查项正确做法错误后果数据长度至少 120 周长通道计算不全复权方式前复权除权缺口拉偏 HHV主图叠加画线方法选主图线条与价格错位颜色代码用调色板线条不可见参数单位周线周期误按日线参数周线使用时把复权方式固定为前复权避免除权缺口把 HHV 拉坏。本文还有配套的精品资源点击获取