公式管理器里点一次「测试公式」,输出区抛出红字:「句末缺少分号」「操作数与函数参数不匹配」「未定义的标识符」。这三类提示看起来都像语法问题,改起来的方向却完全不同。通达信公式编写错误集中在三层:写错形态的语法层、用错对象的数据类型层、语法通过但结果不对的逻辑层。分清在哪一层,改一处就能过;分不清,就会在不是问题的地方来回改。

下面按层给出提示原文、它真正指向的东西、以及动手改的位置。文中提示文案按常见措辞引用,不同版本与语言版本可能有差异,判断依据放在「它指向什么」这一列,而不是逐字比对文字。

一、三层的界线:能不能编译、能不能取到值、值对不对

三层用三个问题切开,一个比一个靠后。

层 判断问题 现场表现 改的范围
语法层 这段话能不能被编译 测试不通过,红字指出某一行 标点、括号、参数个数
类型层 取到的值是不是你以为的那种东西 测试通过,输出区有值但量级不对 取数字段、单位换算、序列与常数
逻辑层 值对了,条件成立得对不对 没有任何提示,图上就是该有的东西不出现 条件顺序、周期、复权

三层的关系是串行的:语法不过,后面两层都谈不上;类型不对,逻辑再合理也是错的值在跑。所以排查顺序固定为从上往下,反着查会浪费时间——在一个语法没过的公式里找逻辑问题,找到的都是幻觉。

二、语法层:分号、全角、括号、参数位

语法层的提示有四类,对应四个具体的改动动作。

句末缺少分号。提示会指到某一行,真正的问题常在上一行末尾。语句没写完,编译器读到下一行才发现接不上,于是把错误报在下一行的开头。改法是逐行看行尾,不要只看被指到的那一行。

全角符号。中文输入法状态下敲出来的逗号、括号、引号,外观与半角接近,编译器不认。表现有两种:报语法错误,或者报「未定义的标识符」——因为一个全角括号把后面的名字吞进去了。处理办法是把输入法切到半角,从报错行往上逐字重敲一遍,不要整段重贴。

操作数与函数参数不匹配。括号里的参数个数与函数定义不符,或者顺序写反。这类错误集中在绘图函数上,因为它们的参数位各不相同。改法是拿函数定义逐位对一遍,不靠记忆。

无效的函数引用。函数不在当前版本里,或者来自别的软件的写法。同名函数在不同软件里的名字与参数可能不同,从网页复制来的源码里混进一个不存在的名字,编译期就会报这一条。

改语法错误有一个省时间的顺序:先全文替换全角标点,再补分号,最后逐个对参数位。前两步是批量的,第三步才需要逐条读。

三、类型层:序列、常数、字符串三者的误用

类型层的错误不报错,只在结果上表现出来。三种误用最典型。

把序列当常数用。通达信里 CLOSE、VOL 这类名字代表一整条序列,每一根 K 有一个值;20 这样的数是常数。写法上把它们混在一起,语法能过,结果却不是你想要的。例如想比较「今天收盘高于二十天均线」,写成 CLOSE>20 比较的是价格与常数 20,不是与均线。

{ 序列与常数:写法相近,含义完全不同 }
A1:=CLOSE>20;                  { 收盘价与常数 20 比 }
A2:=CLOSE>MA(CLOSE,20);        { 收盘价与 20 日均线比 }
A3:=CLOSE>REF(CLOSE,20);       { 收盘价与 20 根前的收盘比 }

把字符串当数值用。字符串只在少数函数里出现,比如给 DRAWTEXT 的第三个参数、给 DRAWTEXT_FIX 的文字参数。把字符串放进算术表达式,或者把数值当文字输出,测试阶段未必拦得住,输出区里会出现意料之外的值或空白。

取数字段与单位不匹配。价格类的字段与百分比类的字段混用,量级会差出几个数量级。这类问题在跨指标拼装时出现:把一个 0 到 100 区间的指标值与一个价格值放在同一张副图上,看起来两条线都「有」,但纵轴被压扁,读不出任何东西。判断方法是分别单独挂一次,看各自的取值范围,再决定要不要合并。

类型层与语法层之间还有一处容易混淆的边界:变量未定义。提示写「未定义的标识符」,可能是因为名字拼错,也可能是因为前面那句赋值被全角符号破坏了。遇到这一条,先往上一行看,再去核对拼写。

四、逻辑层:编译通过、结果不对的四种来源

逻辑层最费时间,因为没有任何提示。四种来源按排查成本从低到高排。

  1. 周期不对。公式里写的 MA(CLOSE,20) 在日线上是 20 日,切到 60 分钟线就是 20 根 60 分钟 K。换成周期看一次,结论可能完全不同。
  2. 复权方式不对。前复权与不复权的价格序列在除权日之后整体不同,同一个条件在两套数据上的成立位置会错开。查这一项要看数据设置,不是看源码。
  3. 条件顺序不对。把两个条件的先后写反,结果集会被放大或者收窄。比如「先满足 A 再满足 B」与「先满足 B 再满足 A」,在 A 出现多次的区间里,取到的是不同的那一段。
  4. 未来函数。用了取未来值的写法,历史段的信号会在新数据到来后改变位置。判断方法是对同一段历史做两次读数,隔几根 K 再读一次,位置变了就是这一类。

前两项与源码无关,改的是图表设置与数据;后两项才需要动公式。这个区分很重要:在源码里找一个由复权方式造成的偏差,找不到。

五、输出规则:条件选股只认最后一行

有一类通达信公式编写错误不产生任何红字,却让整支公式白写:把绘图语句写进了条件选股公式。

{ 条件选股公式:最后一行是逻辑输出 }
MA5:=MA(CLOSE,5);
MA20:=MA(CLOSE,20);
CROSS(MA5,MA20);

条件选股只认最后一行做逻辑输出,前面的 := 都是中间量。把 DRAWICON、STICKLINE 这类语句塞进去,编译期会报输出过多或者画线超限;即便侥幸通过,选股结果也不是按你想的那个条件筛的。

反过来,技术指标公式里最后一行写一个裸条件,语法上不报错,但那根线画出来只有 0 和 1 两个值,缩在副图底部,看不出任何形状。这类「公式能跑但图上难看」的问题,根源在公式类型与写法不配套,不在函数用错。

公式类型选错还有一处代价:接口不同。技术指标公式可以被别处引用,条件选股公式不能反过来引用指标里的输出。做组合公式时,先把要复用的那部分写成技术指标,再在选股里引用,比把逻辑抄两遍更省事。引用规则与输出线的限制,见 通达信公式编写教程 一栏。

六、改的顺序:一次只动一处

语法错误多的公式,不要一次改完再测试。改一处、测一次,才能知道是哪一处起了作用。

顺序建议是:先把整段注释掉,从第一行开始逐段放出来。放到某一段报错,问题就在这一段里。这个办法慢,但对语句多、来源不明的源码有效——它能定位到具体段落,而不是在几十行里猜。

语句少的公式可以直接改。改完点「测试公式」,通过后不要立刻挂图,先在输出区看几行值:量级对不对、有没有全为 0、有没有整列相同。这三项能提前发现类型层的问题。

测试通过不等于可用。输出区里一组全为 0 的值,说明取数字段没取到东西;一组完全相同的值,说明表达式退化成了常数。这两种情况测试都通过,图上也画得出线。

七、验证:三处对照

改完之后做三次对照,分别对应三层。

语法层对照:把公式复制到新建的另一条公式里再测试一次。同一条公式在两处测试结果不同,说明有隐藏字符或者编码问题。

类型层对照:把关键中间量单独挂成输出,与手工算的一次结果对比。比如二十日均线,用收盘价加总除以 20 算一次,与公式的输出对一位小数。对不上就是取数字段或者窗口的问题。

逻辑层对照:找一段已知答案的区间,把公式挂上去,数一数条件成立的位置与手数的位置是否一致。这一步最花时间,也最能说明公式到底对不对。

三处对照做完,能确认的边界也该说清楚:能确认的是这支公式在本机版本、当前周期、当前复权方式下算得对;不能确认的是换版本、换周期、换数据源之后的表现。跨版本的行为差异属于另一个层面的问题,站内 公式报错与卡顿排查 一栏里有专门几篇讲编译期与显示期怎么分开查,本篇只讲错误的三层定位;取数字段与数据类型各自的边界,另见 指标原理与参数 一栏。

一句判断:看到红字先改标点与参数,看到值不对先查取数字段,看到结果不对先查周期与复权。这三句话覆盖了通达信公式编写错误里可以机械处理的部分,剩下的那部分,只能靠一段一段放出来测。

本文只作技术研究口径,内容为公式语法、取值与验证方法,不涉及对任何标的的判断,也不提供操作层面的建议。提示文案、函数名与菜单路径以本机版本的实际显示为准,不同版本与券商定制版可能存在差异。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。