把一段 EXPMA 源码粘进公式管理器,点「确定」,挂到主图上,屏幕是空的。换一份源码,线出来了,把它与软件自带的 EXPMA 叠在同一张副图上,两条线贴着走却合不到一起。通达信EXPMA公式的落点问题,一半在「写的是哪一种平滑」,一半在「落在哪个目录、从哪条入口挂上去」。
下面按口径差异、写法与参数、建成自编指标的落点、导入之后的参数确认、失败排查五段展开。文中的函数名、菜单名与目录名,以本机公式管理器的函数列表与安装目录为准。
一、EXPMA 与 MA、EMA 的口径差异
三条线都是对收盘价序列做平均,差别只在权重怎么分。
MA(CLOSE,N) 是窗口平均:最近 N 根各占一样的权重,第 N+1 根以及更早的数据权重归零。这个归零有可观测的后果:窗口边缘进出一根 K 线,平均值就跳一格,走出窗口时那个台阶会显出来。
EMA(CLOSE,N) 是指数加权:第 t 根的系数取 2/(N+1),乘在最新收盘价上,剩下的权重按补数逐级衰减,每一根历史都留一点。它没有截断,同样 N 下比 MA 平滑,对最新一根的反应也慢一些。
EXPMA 也在指数加权这一路:近期权重高,历史权重按比例衰减,不是等权平均。它与 EMA 的分歧在系数怎么取。若本机函数说明给出的递推式是 Y=(X+(N-1)*Y')/N,等效系数就是 1/N;若本机把 EXPMA 定义成 EMA 的同义写法,系数仍是 2/(N+1)。这两种可能给出两套数值。
| 写法 | 权重口径 | 历史是否截断 | 同一 N 下的表现 |
|---|---|---|---|
| MA | 窗口内 N 根等权 | 窗口外归零 | 跟最新一根走,台阶看得见 |
| EMA | 系数 2/(N+1) | 全历史留存,衰减快 | 比 MA 平 |
| EXPMA | 指数加权,系数取 1/N 或 2/(N+1) | 全历史留存 | 系数取 1/N 时更平 |
三行里最容易混的是后两行:都叫指数平滑,系数却会差一倍。12 这个周期上,2/(N+1) 是 0.1538,1/N 是 0.0833,同样的参数画出来的弯曲程度不在一个量级。两条线对不上时,先问自己调用的是哪一个名字。
数值不同不等于写错。把两条线挂到同一张副图上,平行错开是系数差造成的,走向不同才是根数或者初值处理出了问题。
二、写法:周期参数与平滑递推
把通达信EXPMA公式写出来,只需要两样东西:一个周期参数,一条递推式。参数交给参数表,递推式交给函数。
落地写法是调内置函数。参数表里定义参数名,源码区写两行输出,算式里引用参数名而不是写死常数:
{ 参数化写法:参数表里定义 N1 / N2,算式里引用参数名 }
EXP1:EMA(CLOSE,N1);
EXP2:EMA(CLOSE,N2);
{ 本机函数列表里有 EXPMA 时,可把上面两行的 EMA 换成 EXPMA,参数含义按本机说明核对 }
{ 定义域校验:周期取到 1 以下,递推式的分母不成立 }
越界:=N1<1;
输出行用冒号,会进输出清单并画线;只做中间量的用冒号等号。周期参数只决定权重衰减的快慢,不决定参与计算的根数:N 取 12 时 EMA 的系数是 0.1538,取 50 时是 0.0392。系数越小,曲线越平。
递推式要不要自己写?理解口径用它,落地不用它。表达「上一根」的入口是 REF(X,N),它只能引用已经算好的序列;把结果反过来引用自己,编译器读到的是尚未定义的内容,直接报错。落地写法是调函数,再用 REF 做对照。
对照怎么做:把 REF(EXP1,1) 与 EXP1 的差值输出成一条线,就能看清每一根上新值把曲线推动了多大幅度。
三、建成自编指标:公式管理器与安装目录
源码备好之后,落点是公式管理器。入口在功能菜单 → 公式系统 → 公式管理器,菜单项右侧标着这一版绑定的快捷键。进去之后按下面的顺序走。
- 左侧树选「技术指标」这一支,挂主图副图用的自编指标都建在这里。
- 点「新建」,弹出公式编辑对话框,分名称、参数、源码三块。
- 填「公式名称」与「公式描述」。名称是挂图时的标识,不要与已有指标重名。
- 参数区点「新增」逐行加参数名、最小值、最大值、缺省值;源码引用几个参数名就加几行。
- 源码粘进编辑区,粘纯文本,不要带网页样式。
- 点「测试公式」编译,看提示区有没有红字与行号。
- 点「确定」保存。确定时会再走一次编译,语法不通过会停在编辑窗口。
保存之后写到哪里?写在安装目录下的 T0002 里。T0002 是用户数据目录,自选股、个人设置与自编公式都归它管;这一层里还有公式备份目录 gs_bak 与自编公式数据文件 PriGS.dat,名称与层级以本机安装目录为准。
回到 K 线图把线挂上:在图上右键 → 选择指标(有的版本叫主图指标、副图指标),在技术指标树里找到刚建的名字,确定。挂上之后图里应当出现 EXP1、EXP2 两条线。
四、导入之后的参数确认与版本差异
通达信EXPMA公式挂上图之后,还要回头核三件事:参数个数、参数定义域,以及这一版把 EXPMA 放在函数列表还是内置指标清单里。
参数个数对不上,编译直接拦:源码写了 N1、N2 两个参数名,参数区只加 N1 一行,确认时提示区会报未定义的变量并给出行号。参数区的「缺省值」决定第一次挂上去时的取值,填 0 或留空,分母就会出事。
定义域比个数更容易漏。周期参数的合理下界是 1:取 0 时 1/N 这类系数不成立,取负数时递推方向反过来。做法是在算式里先筛一道,把 N1<1 当越界,越界时用 ISNULL 判定、DRAWNULL 输出,那一段不画线,比画出一条假的曲线好排查。
版本差异集中在一个问题上:这一版有没有把 EXPMA 做成可调用的函数。查法不靠记忆,靠本机两处清单。
| 要确认的事 | 在哪看 | 两种结果怎么处理 |
|---|---|---|
| EXPMA 是不是函数 | 公式编辑器的函数列表里检索 | 检索得到,可以直接调用;检索不到,说明它只是内置指标名 |
| 内置 EXPMA 的口径 | 公式管理器 → 技术指标,双击系统指标里的 EXPMA 看源码 | 源码用 EMA 拼的,照它的函数与参数个数写;用 EXPMA 写的,照抄结构 |
这两行不用背,打开本机看一眼就有结论。函数列表与内置指标清单跟着版本和券商定制走,别人截图里的函数名搬到你的客户端里可能不存在。
五、失败排查与验证
把现象按「有线没线」和「有线但形状不对」分开,排查顺序不一样。
第一种,公式管理器里能看到名字,挂上主图却没有线。按三处查:输出行是不是写成了冒号等号,那只做中间量,不进输出清单;整条线是不是全为空值,数据不足时 REF 取不到值;挂载的坐标归属对不对,主图与副图各有坐标区间。
第二种,线出来了但形状不对。先核对调用的是 EMA 还是 EXPMA,再看 REF 的根数:取上一根写 REF(X,1),写成 REF(X,0) 取的是自己,写成 2 取的是前两根,偏移一根就是整体平移。头部数据不足时 REF 返回空值,兜底分支写反会把头部拉成直线。
验证分三步,都能在图上完成。把自编输出挂到副图,看线是否真的画出来,名称会列在指标名后面;再叠一条差值线,把自编线与内置 EXPMA 相减,差值贴在零轴附近说明口径一致,出现固定偏移说明系数不同;把周期参数改一次,N 从小到大,曲线应当越来越平,方向相反就是系数写成了别的形式。
头部若干根出现长跳变,不必当成错误。数据起点之前没有历史,指数加权从第一根开始积累,头部天然不稳。换一只上市更早的标的看同一段,跳变跟着数据起点平移就是正常的。
回到操作上,先做三件事:一是在本机函数列表里检索一次 EXPMA,确认它是函数还是指标名;二是用内置函数把两条线画出来,挂到副图上确认线真的出现;三是回公式管理器,把参数区的个数、缺省值与 N1<1 这条越界筛选补齐。
这三步走完,通达信EXPMA公式这段源码才算落在你自己的机器上:它不依赖别人的截图,也不依赖某个版本的函数名。三条线口径不同的地方,交给图上那条差值线去说明。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 通达信公式安装与导入 的条目,通达信指标原理与参数 里讲参数的口径与默认值,通达信公式编写 里讲语法与函数写法,可对照查看。
