通达信公式是什么语言,这个问题的答案不是某个通用编程语言的名称。它是一套专为行情数据设计的表达式语法,由客户端自带的解释与计算模块执行,写法接近电子表格里的公式,而不是接近 C 或 Python 那类程序。搞清这一点,后面那些看着别扭的地方会自然消解。
下面从语法构成、硬约束、求值方式、与程序语言的差别、常见误解与参数命名六个层面讲清楚。文中函数名、字段名与菜单路径为通达信客户端的通用描述,不同版本与券商定制版对函数范围与设置项的支持存在差别,请以你所用客户端的实际界面与官方说明为准。
一、它是一套专用表达式语法
通达信公式是什么语言,换个问法更清楚:它的输入是什么,输出是什么。输入是行情序列,包括开盘、最高、最低、收盘、成交量、成交额这些按时间排列的数值;输出是一组同样按时间排列的数值序列,客户端把这组序列画成线、柱或图标。整个过程没有文件读写、没有网络请求、没有循环控制结构。
一套公式由三类成分拼成,缺一不可:
{ 公式的三类成分 }
字段 —— 直接指向行情数据,如 C 表示收盘价、V 表示成交量
函数 —— 对序列做加工,如 MA(X,N) 求 N 周期均值、REF(X,N) 取 N 根之前的值
运算符 —— 组合上述两者,加减乘除与比较符号,比较结果为 1 或 0
{ 三类成分构成一个表达式,表达式按根求值 }
三类成分都是预置的,写法受语法约束,不能自己定义新的字段。用户能自定义的只有变量名与参数。这个边界决定了公式的表达能力上限,也决定了它学起来比通用语言快。
二、语法上的硬约束
写法上有几条规则是编译期强制的,违反就会在保存或编译时收到提示。
| 规则 | 正确写法 | 违反后的表现 |
|---|---|---|
| 语句以分号结束 | 每条赋值或输出后加分号 | 提示指向下一行,位置对不上 |
| 注释用花括号 | 花括号包住说明文字 | 未闭合则整段被当注释吞掉 |
| 变量先赋值后引用 | 引用前该变量已出现 | 提示该名称未定义 |
| 输出与中间量分符号 | 冒号输出,冒号等号赋值 | 误用会让本该隐藏的量被画出来 |
这些规则的细节见 通达信公式编写教程 一栏。这里先记住一条:报错位置会指向下一行,因为编译器读到下一句才发现上一句没结束。
三、求值方式:按根计算,整条序列参与
通达信公式是什么语言,关键在求值单位。它不是一个函数调用一次得到结果,而是对图表上的每一根 K 线分别求值,得到与 K 线数量等长的一组结果。这也是为什么公式里写 REF(C,1) 能拿到上一根的收盘价,而不是报错——因为整条序列都在,取值动作发生在序列内部。
{ 按根求值的含义 }
公式:MA(C,5) 输出一组与 K 线等长的数值
第 1 根到第 4 根:窗口数据不足,结果为空
第 5 根起:每根都取当前根与之前四根收盘价的平均值
{ 序列长度一致,是公式能与图表对齐的前提 }
按根求值带来两个直接后果。一是窗口长度决定前几根有没有值,前四根为空不是错误。二是任何引用未来根的写法都会破坏这个前提,这类函数的识别与替换在站内另有专文,见 公式编写 一栏。
四、与程序语言的三处不同
把通达信公式当成程序语言去类比,会在三处卡住。
| 维度 | 程序语言 | 公式语法 |
|---|---|---|
| 控制结构 | 有循环与分支语句 | 无循环,分支由条件函数表达 |
| 副作用 | 可读写外部资源 | 无外部读写,纯计算与绘图 |
| 执行单位 | 一次调用得一个结果 | 一次求值得到整条序列 |
没有循环这一条最需要注意。想对一段区间做累计,做法是把累计写成序列运算,例如用区间内的求和配合条件表达式,而不是引入一个循环变量。这一点决定了公式的写法与常规编程经验不能直接套用。
五、几处常见的误解
第一个误解是认为公式能读取任何数据。它只能读客户端已经落地的数据:本地历史行情、客户端提供的财务字段与扩展数据。需要外部文件或人工录入的数据,要先在客户端里落地成可读字段,公式这一层才拿得到。
第二个误解是认为公式写出来就能得到想要的结果。计算结果与设置有关,复权方式、周期、数据完整度都会改变输出。同一段代码在日线与周线上得到两组不同的数,这不是语法问题。
第三个误解是认为语法通了就说明逻辑对了。编译通过只说明写法合规,不说明计算口径符合预期。要确认口径,需要把中间变量逐个输出到图上,用视觉核对替代猜测。
第四个误解是认为一段公式可以任意组合到另一段里。公式之间可以引用,但引用关系受函数与参数形式约束:被引用的一段要能按同样的周期与参数求值,否则引用过来的序列与预期错位。组合之前先确认两段公式的求值周期一致。
这四个误解有一个共同点:都把公式当成一个不受环境约束的独立程序。它的实际形态是一段依附于图表设置的表达式,周期、复权、参数、数据范围都是它的一部分。改设置就会改结果,这是它的性质,不是缺陷。
六、参数与变量命名的约定
参数是写在公式头部的一小段声明,语法上由参数名、最小值、最大值与默认值四部分组成。客户端在挂载公式时把这段声明渲染成可调的输入框,改动取值后整条公式重算。参数与变量不是一回事:参数是外部可调的输入,变量是公式内部的计算中间量。
{ 参数声明与内部变量的分工 }
参数声明放在公式最前面,用于暴露可调项
内部变量用冒号等号赋值,不参与图上的输出
同名时以参数为准,内部变量不再重复声明
{ 分清两者,改公式时才不会改错地方 }
变量命名有两条实用约束。一是名称不要与字段名或函数名重合,重合时编译器按内置含义解析,公式的行为会与预期不一致。二是名称要能表达含义,把中间量写成 a1、a2 这类名字,过两周再看就认不出哪一段在算什么。
命名混乱是读现成公式时的主要障碍。读别人的公式前,先把变量名按出现顺序列一遍,标出每个变量在算什么,再回头看公式结构,效率比逐字读语法高。
七、新手该先掌握哪一部分
通达信公式是什么语言这个问题解决之后,学习顺序可以定下来。先认字段,把 C、O、H、L、V 这几个对应到什么数据记熟;再认函数,按计算类别分组去记,比如取值的、均线的、比较的、绘图的;最后学语法符号,把冒号与冒号等号的区别弄明白。这三步走完,读别人的公式就不会卡在符号上。
读现成公式是更快的入口。拿到一段公式后,先把中间变量逐个输出到图上,看每一段在算什么,比逐字读语法更直接。新手的整体学习路径见 通达信新手入门问答 一栏。
最后是画出来的部分。公式的输出值与它在图上的呈现是两件事,后者涉及挂载位置、坐标类型、颜色与图标设置,见 通达信主图副图指标 一栏。计算正确但显示位置不对,是新手阶段反复遇到的一类问题,处理顺序是先确认输出值、再查挂载位置。
文中字段名、函数名与菜单名称为通达信客户端的通用描述;不同版本与券商定制版对函数范围、参数形式、绘图设置的支持存在差异,请以你所用客户端的实际界面与官方说明为准。本文只讨论公式语法的构成与求值方式,不构成任何投资建议。
