通达信公式编译不通过原因,按提示原文归类,比从头通读一遍省事。公式管理器弹红字的时候,其实给了你两段信息:一段是问题类型,一段是它指向的语句位置。先看第二段,定位到那一行,再回来看它说的是哪一类问题。

这篇把提示原文按”它在说什么”分组对照。同一个问题在不同版本上措辞会有差别,背提示原文没什么意义,认出它指的是哪一类才管用。文中的界面与提示来自通达信金融终端个人版;官方更新记录公布的版本节点(例如 V7.62,更新日期 2022-09-30)可以当参照,券商定制版的菜单名称可能不一样,以你软件里实际的提示为准。

一、报错提示的两段信息,先读哪一段

公式管理器的编译提示包含”问题类型”和”指向语句”。出错的语句会在编辑器里标红,先跳到那一行。这一步能省掉大量无意义的逐行通读。

有一个例外要记住:如果红字指的那一行看起来完全正常,就往上一行的行尾看。分号漏在上一行末尾时,编译器读到下一句才发现前面那句话没结束,所以报错落在了下一行。

判断方法:把红字指向的那一行,连同它上面一行一起看。上一行末尾少了分号、或者上一行的括号没配平,都会以”下一行报错”的形式出现。

二、按提示原文逐条对照

处理通达信公式编译不通过原因,省事的入口是”提示原文 → 改动动作”这张对照表。下面这张表是公式管理器可能给出的提示原文(措辞为大意,不同版本略有差异),按它在说什么分组。左边是你看到的,右边是要动手改的。

提示原文(大意) 它在说什么 改法
变量 XXX 未定义
未定义的标识符
用了一个没赋值过的名字,或者函数名拼错了 检查每个 := 是否先定义后使用;核对函数名拼写
操作数与函数参数
不匹配
函数括号里的参数个数不对 MA、REF、HHV、LLV 这类都要补周期参数
句末缺少分号
语法错误
行尾少了英文分号,或者混进了中文标点 逐行看行尾;确认输入法处于半角状态
定义重复 两条语句用了同一个名字 语句名不能重复,把后一条改名
无效的函数引用
未知函数
函数不在当前版本里,或者来自别的软件 对照函数列表;同花顺、文华的部分函数通达信不支持
输出语句过多
画线超限
把副图源码粘进了条件选股,里面全是绘图语句 选股公式只留最后一行逻辑输出,删掉绘图类语句
内存溢出
公式过长
语句行数过多,或者嵌套条件太深 拆成多个小公式分步筛,不要堆在同一个公式里
条件长度不一致 拿不同周期的两个结果直接比较 统一计算周期,需要时用 REF 对齐
参数缺失 源码开头声明了参数,粘贴时没填参数表 在编辑器上方参数表补参数名与缺省、最小、最大值
除零错误
(Division by zero)
分母可能取到 0 用 DIV() 处理,或者先判断分母不为 0

这张表里,前四条是写公式时自己造成的,中间三条是从别处搬源码带来的,最后三条和公式的适用场景有关。分清楚来源,改起来才有方向:自己写的,回头看那几行;搬来的,先怀疑格式和函数兼容性。

2.1 变量未定义:先定义,后使用

中间变量用 := 赋值,赋过值之后才能在后面的语句里引用。顺序反了就会报未定义。通达信不区分大小写,但符号不能错,MA20 和 ma20 视为同一个名字,写成 MA2O(字母 O 和数字 0)就变成另一个名字了。

2.2 参数不匹配:括号里少了周期

均线、极值、引用类函数都要写周期。少写一个参数就报”操作数与函数参数不匹配”:

MA(C)          ← 缺周期,报错
MA(C,20)       ← 正确

HHV(H)         ← 缺周期,报错
HHV(H,20)      ← 正确

REF(HHV(H,20),1)   ← 嵌套也要每层都带周期

2.3 输出过多:选股公式里不该有绘图语句

副图指标允许画线、标图标、写文字,条件选股公式不允许。把副图源码整段粘进条件选股,就会报输出过多或画线超限。处理办法是把绘图语句全删掉,只保留最后一行做逻辑判断的输出:

DRAWICON(C>O,L*0.99,1);        ← 绘图语句,选股公式里要删
STICKLINE(C>O,O,C,3,0),COLORRED;  ← 同样要删

选股: 条件1 AND 条件2;         ← 只留这一行

三、中文标点:报错不会告诉你是标点的问题

公式里出现中文全角的分号、逗号、括号,编译同样不通过。有的版本提示”语法错误、行 XX 存在非法字符”,有的版本只给一个笼统的句法错误。麻烦的地方在于,中文的( 和英文的 ( 在编辑器里长得几乎一样,盯着看不容易分辨。

MA1:=MA(C,20);       ← 全半角正确,编译通过
MA1:=MA(C,20);     ← 逗号与分号是全角,编译不通过

从网页、聊天记录、PDF 里复制源码时,全角标点会跟着一起进来。处理顺序是先粘到纯文本编辑器里做一次批量替换,把全角标点换成半角,再贴进公式编辑器。直接粘进公式编辑器再找,等于拿肉眼去分辨两个形状相同的字符。

还有一种情况:源码里带 ★、△、@ 这类装饰符号,或者带中文注释。装饰符号会触发非法字符报错。注释本身用 // 开头可以保留,但要确认注释里没有中文标点跑到代码段里。

这一节说的是格式问题,和公式逻辑无关,所以通达信公式编译不通过原因排查时,先剥掉格式层,再去核对逻辑层,顺序反了会一直在正确逻辑里找错误。

四、编译通过但结果不对

提示消失、点”测试公式”通过,只是说明语法没问题。结果不对是另一回事,而且这时候没有任何红字可看。可按下面三个方向查。

4.1 除数可能取到零

涨幅、比率这类计算会在除数为零时出问题。新股上市首日、停牌后复牌的当天,前收价可能取不到或为零:

涨跌幅 := C / REF(C,1);       ← 分母可能为 0
涨跌幅 := C / DIV(REF(C,1),1);  ← DIV 会处理除零情况

4.2 周期没对上

在日线上写的条件,换到 5 分钟周期上算出来的结果完全不同,因为引用的每根 K 线含义变了。跨周期引用要写清周期后缀,格式是指标名.语句名#周期:

"MACD.DIF#WEEK"(12,26,9);    ← 在日线里引用周线的 DIF
"KDJ.K#MIN30"(9,3,3);        ← 引用 30 分钟周期的 K 值

4.3 用到了当前版本没提供的函数

函数是随版本增加的。通达信官方更新记录里,V7.62 这一版写明加入 SUMBARSX 函数、修正 IFC 函数的问题。这意味着在比它更早的版本上写公式,用到这两个函数会直接落在”未知函数”里。同理,别人源码里出现的 SUMBARSXT 是文华的写法,通达信这边没有对应实现。

遇到未知函数,先确认函数名是不是别的软件的,再查当前版本有没有这个函数。两个方向都比在网上找一个来路不明的替换写法靠谱。

五、改完怎么确认真的改对了

改完不要直接关掉编辑器。公式管理器里有”测试公式”,点一下,看两件事:一是还有没有红字,二是编辑器里的红色标注是否全部消失。红字没了但标注还在,说明还有问题没处理完。

测试通过之后,还要在实际界面上验证一次加载效果。指标类公式,挂到 K 线上看能否正常画出线;选股类公式,跑一次条件选股,看会不会提示错误。这一步能抓出”语法没问题但用的地方不对”这一类问题,比如把选股公式挂到主图上,公式能存下来,但加载时没有东西可画。

归纳一下顺序:先看提示指向哪一行 → 判断属于哪一类(自己写的、搬来的、场景相关的)→ 改格式层(标点、分号、括号)→ 改逻辑层(定义顺序、参数、函数)→ 点测试公式 → 到界面上验证加载。走到最后一步才算改完。

另外提醒一句:加密公式包(后缀 .tne)导入后在公式管理器里看不到源码,报错也无从修改,只能换成未加密的源码版本。这不是操作问题,是文件本身的限制。

按上面的顺序排查,通达信公式编译不通过原因基本落在可枚举的几类里。真正的难点不在报错本身,而在于提示指向的是结果、不是原因,需要你顺着那两段信息往回找一步。

本文讲的是软件操作与公式语法,不涉及具体标的的判断。站内还有 报错与卡顿排查 的其他条目,以及 公式安装与导入 的操作步骤,可对照查看。公式写的条件与结果只用于筛选参考,实际使用前请自己在历史行情上验证一遍。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。