通达信公式编译不通过原因,按提示原文归类,比从头通读一遍省事。公式管理器弹红字的时候,其实给了你两段信息:一段是问题类型,一段是它指向的语句位置。先看第二段,定位到那一行,再回来看它说的是哪一类问题。
这篇把提示原文按”它在说什么”分组对照。同一个问题在不同版本上措辞会有差别,背提示原文没什么意义,认出它指的是哪一类才管用。文中的界面与提示来自通达信金融终端个人版;官方更新记录公布的版本节点(例如 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)导入后在公式管理器里看不到源码,报错也无从修改,只能换成未加密的源码版本。这不是操作问题,是文件本身的限制。
按上面的顺序排查,通达信公式编译不通过原因基本落在可枚举的几类里。真正的难点不在报错本身,而在于提示指向的是结果、不是原因,需要你顺着那两段信息往回找一步。
本文讲的是软件操作与公式语法,不涉及具体标的的判断。站内还有 报错与卡顿排查 的其他条目,以及 公式安装与导入 的操作步骤,可对照查看。公式写的条件与结果只用于筛选参考,实际使用前请自己在历史行情上验证一遍。
