通达信EMA公式怎么写,卡点不在语法,而在一个理解上的岔路口。通达信自带 EMA 函数,多数人就在输出行里直接调它,然后发现两件事对不上:一是自己按公式手算的数值和软件画出来的不一致,二是把 EMA 换到某个窗口参数上,曲线形状和均线的直觉不符。这两个现象的根源相同,都是把「内置函数」当成了「通项定义」。
EMA 是 Exponentially Weighted Moving Average 的缩写,把它当英文全称一样的词组记住没有意义,理解它的递推结构才是有用的部分。下面按定义、内置函数取数、自编递推三类写法、参数影响与验证顺序展开。文中函数名与写法以通达信 PC 版的公式系统为准,不同版本与券商定制版在函数集合与参数上限上存在差异,请以你所用客户端帮助文档里的函数列表为准。
一、EMA 的定义里有一句「上一根」
加权移动平均的权重是随时间指数衰减的,第 N 根之前的权重不再是一个固定数字,而是按平滑系数逐级缩小。写成一行的形式是这样的:
EMA_t = A * X_t + (1 - A) * EMA_{t-1}
A = 2 / (N + 1)
式子里 EMA_{t-1} 表示上一根 K 线上的 EMA 值。这一项决定了 EMA 与 SMA 的根本差别:简单移动平均只看窗口内的 N 个数,窗口滑过去之后最早那根的影响完全归零;指数加权的衰减是指数形式,越早的数据权重越小但并不归零,所以 EMA 对历史有记忆。
这也解释了为什么通达信EMA公式怎么写这个问题会绕回递推。你不可能把无穷多根的历史权重全部写进一行算式,只能借助「上一根的结果已经存在」这个前提,把它引用回来。
二、直接调内置函数是最稳的写法
通达信公式系统提供 EMA(X,N):X 是待平滑的序列,N 是周期参数。要画一条十二周期的收盘价指数均线,输出行写成:
EMA12:EMA(CLOSE,12);
这一行会画出线并输出数值。如果只想在中间步骤里用,不想占一条输出线,把冒号改成冒号等号:
均线12:=EMA(CLOSE,12); 偏离度:=(CLOSE-均线12)/均线12;
内置函数的好处是初始值处理由客户端完成,你不用关心第一根 K 线上的 EMA 从哪里来。手写递推时这一步要自己兜底,两者的差异就出在这里。
三、自编递推的写法与初始值处理
把前面那个通项搬进公式,需要两个动作:先取上一根的平滑值,再代入加权式。REF(X,N) 用来引用若干根之前的值,取上一根就是 REF(...,1)。
{第一步:取上一根的 EMA}
上根均线:=REF(EMA(CLOSE,12),1);
{第二步:代入通项,第一根没有上根值,用收盘价兜底}
自编12:=IF(上根均线=0,CLOSE,2*CLOSE/13+11*上根均线/13);
两处细节要说明。平滑系数 2/(12+1) 约等于 0.1538,另一部分 11/13 是它的补数;把系数化成整数比可以减少浮点误差的累积。第一根 K 线上 REF 取不到值,返回 0,所以用 IF 判断并回退为收盘价,这就是前面说的初始值兜底。
自编12:=自编12*2; 这种自己引用自己的写法。右侧读到的不是上一根的值,而是尚未定义的内容,编译器会直接报错。想要「上一根的自己」,写法只有 REF 一条路。把自编12 与内置的 EMA(CLOSE,12) 挂在同一个副图上,理论上两条线会重合。若出现可见的偏离,优先怀疑三处:REF 的根数写成了 0 或 2、平滑系数化简时约分错了、以及 IF 的兜底分支写反。
四、参数与函数的差异
同样叫均线,EMA 与 SMA 在参数含义上的对应关系并不直观。下表给出常用周期的平滑系数,便于把教科书上的写法对应到公式里。
| 周期 N | 平滑系数 2/(N+1) | 1 减该系数 |
|---|---|---|
| 5 | 0.3333 | 0.6667 |
| 12 | 0.1538 | 0.8462 |
| 26 | 0.0741 | 0.9259 |
| 60 | 0.0328 | 0.9672 |
周期越大,平滑系数越小,单根新数据对结果的影响越小,曲线越平稳。这也是为什么把 MACD 的慢线周期从 26 调到 60 之后,交叉信号会明显变稀 —— 变化来自系数变小导致的响应变慢。
同类函数还有一个 EXPMA,在部分版本里与 EMA 的计算口径一致,只是参数个数的限制不同。遇到两条线对不上的情况,先确认调用的是哪一个函数名,再去查该版本帮助文档里的定义说明。
五、长度相等不代表两条线能用同一套参数
把 EMA(CLOSE,12) 当成「12 日均线」来用,是另一个高频误解。SMA 的窗口长度和周期参数是一回事,EMA 的周期参数只决定平滑系数,不决定参与历史的根数。系数 0.1538 意味着理论上每一根历史都有权重,只是衰减很快:二十根之前的权重已经小到在小数点后第三位附近。
这个差别在两种情形下会显现出来。一是把两条曲线直接比较数值大小,EMA 对所有历史都留了一份权重,起点附近会被拉得更靠近起始价格;二是把表达式搬去别的公式系统时,对方如果没有内置 EMA 而用 SMA 顶替,形状会有可见差异。选择调哪个函数时,把「窗口」与「平滑系数」分开看,判断会有依据。
{对照:同一周期下两种均线的定义差异}
简单均线:MA(CLOSE,12);
指数均线:EMA(CLOSE,12);
{差值序列:用来观察两条线的相对位置}
两条线差:指数均线-简单均线;
把 两条线差 挂到副图上,它会在零轴两侧来回。这条差值线本身没有方向含义,它反映的是近期价格相对长期平均水平的位置,把它当成判断依据会得到不稳定的结论。它更适合用来确认两条线是否按预期交替。
七、把 EMA 写进更长的算式时注意三处
前几节讲的都是单独一条均线。一旦把通达信EMA公式怎么写放进完整的指标算式里,还有三处容易出问题。
第一处是嵌套方向。像 MACD 那样对两条指数均线的差值再做一次指数平滑,写出来是 EMA(EMA(CLOSE,12)-EMA(CLOSE,26),9),内层先算差、外层再平滑,顺序反了结果完全不同。把中间量单独提出来声明,比写成一长串嵌套更容易核对。
第二处是周期参数的传递。参数表里定义 N 之后,算式里应当使用参数名而不是重新写一个常数,否则参数调整不起作用。参数名不要与内置函数名或常见变量名重复,重复时编译不报错但取值会按内置的来。
第三处是空值。数据起始的若干根上,嵌套的 EMA 可能逐层放大无效值,头部曲线出现异常长的跳变段。判断它是否正常的方法是把图画到更长时间再回看,异常段是否随之平移 —— 随数据起点平移的属正常,固定在某个位置不动的才需要查算式。
{把中间量分开声明,便于逐段核对}
快线:=EMA(CLOSE,12);
慢线:=EMA(CLOSE,26);
差值:=快线-慢线;
信号:=EMA(差值,9);
这三处都不涉及新语法,但都是自编算式与内置指标对不上时的常见来源。把算式拆成若干行可命名的中间量,出问题时就有一个可以逐段比对的对象。
八、验证顺序
写完一段涉及 EMA 的算式,按下面的顺序走一遍,比在图上反复目测省事。
- 先确认编译通过。中间变量用冒号等号、输出线用冒号,两者不要混用,混用会让某条中间量意外画线。
- 把中间变量临时改成输出线挂到副图上,看头部几根是否出现异常大的值。数据不足时 REF 返回 0,头部出现跳变属正常,不要当成公式错误。
- 取最后一根数据手工算一次。按
A*X+(1-A)*上一根值逐根推一遍,和副图上读到的数值比。 - 改动周期参数验证方向。把 N 从小改到大,曲线应当变得更平滑;若方向相反,说明系数写成了
2/(N-1)之类的形式。
通达信EMA公式怎么写这件事,落到操作上就是一次选择:要数值就调用 EMA(X,N),要过程就写一层 REF 递推并处理初始值。函数按类别整理的清单可以对照 通达信公式编写教程 一栏;写出来的算式与预期不一致时的排查顺序,见 报错与卡顿排查 一栏;确认算式行为是否符合需求的方法,见 指标回测与风险验证 一栏。
最后一句判断:EMA 的写法只有两行,难的是想清楚自己需要的是「一条平滑过的序列」还是「一次指数加权的计算过程」。前者调函数即可,后者必须自己处理初始值,混用这两种思路是两条线对不上的常见来源。
文中函数名与语法按通达信 PC 版公式系统的常见写法描述;不同版本与券商定制版在函数集合、参数上限与无效值处理上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式语法与计算机制,不构成任何投资建议。
