保存或修改公式时,公式管理器弹出一句提示,原文形如「错误起始位置:第 3 行,第 12 列」。这句话只给了坐标,没给原因。本文讲通达信公式错误位置怎么找,把坐标翻译成源码里的具体一处,再逐条对照成因。提示措辞在不同版本之间可能有差异,以你软件里实际显示的文字为准。
提示里的行列号指什么
通达信公式错误位置怎么找,第一步是读懂这句提示的结构。「错误起始位置」给两个数,前一个是行,后一个是列,指的是解析器读到哪一处时无法继续往下读。它标的是“卡住的地方”,未必是“写错的地方”,所以从这一点往下看几行、往上看一行,都属于正常范围。
把行列对到源码上,需要一个能把行号显示的编辑器。公式编辑框本身不带行号时,把源码整段复制到记事本或代码编辑器里数,比在编辑框里逐行点更可靠。
列号同样受制于口径。制表符与全角字符在编辑器里占的宽度跟半角不同,按列号去数字符个数时,中西文混排会带来偏差。定位到行即可,列号当作参考。
错误起始位置:第 3 行,第 12 列 源码示意(行号为人工标注,不是编辑器显示) 1 MA5:=MA(CLOSE,5); 2 MA20:=MA(CLOSE,20); 3 XG: CROSS(MA5,MA20)
按上面的例子,第 3 行第 12 列落在 MA20 这一处,提示指向这里,说明解析到括号附近停住了。真正的原因要看该行的括号是否配齐、上一行的分号是否写了。
行号统计口径不确定,先用折半注释复核
继续讲通达信公式错误位置怎么找,这里要接受一个前提:行号本身带不确定性。公式编辑器在统计行数时,空行计不计入、整行注释计不计入,不同版本的实现可能不一致;有些版本把注释整行跳过后再编号,有些版本按物理行数编号。按提示里的行号直接跳过去,可能偏一两行。
稳妥的做法是折半注释:把源码从中间切开,用花括号把后半段整段注释掉,让前面一半单独参与解析。若提示消失,问题在后半段;若提示还在,问题在前半段。一次砍掉一半,几轮下来就能把位置收拢到单独一行。花括号注释是通达信公式的注释写法,成对使用。
原始: XG: CROSS(MA5,MA20);
折半: {XG: CROSS(MA5,MA20);}
注释掉一段之后,若这段里的变量在后面的代码里还要用到,会出现变量未赋值一类的新提示。这时把注释段里的赋值语句留着,只注释掉输出行,可以避开这类干扰。
括号不成对
括号是最容易数错的一项。函数名后面跟左括号,参数写完之后要有右括号,数量必须一一对应。多写一个左括号、漏掉一个右括号、把括号写成中文全角的圆括号,都会让解析在某一行中断。函数的左括号写成全角括号,外观几乎看不出差别,报错位置却常常落在很远的地方,因为解析器要到后面才判断出括号没有闭合。
错误: A: MA(CLOSE,5); 参数里的逗号写成了全角 错误: A: MA(CLOSE,5); 缺少右括号 正确: A: MA(CLOSE,5);
嵌套多层函数时,从内向外数括号对,每读完一对划掉一对,比整体目测快。
数括号可以按嵌套层次走。最内层的一对先配平,划掉之后向外推进,遇到函数名紧跟左括号的位置再做一次配对,这样在多层嵌套里不容易数乱。括号数量多的公式,分段数比整段数更稳。
分号位置与中文标点
公式把每条语句用分号隔开。分号该写在语句结尾,写漏时解析器会把它和下一行连起来读,提示位置因此落到下一行开头。出现“报错行本身看着正常”的情况,先看上一行末尾有没有分号。
中文标点是另一类高频来源,全角分号、全角逗号、中文引号在编辑器里都是合法字符,却不是语法字符。输入法没有切回半角时,一个全角逗号就能让整条语句失效。写代码时把输入法固定在英文状态,可以减少这类问题。
排查标点时,把整段源码粘到纯文本环境看一眼:若某个逗号前后间距明显比别处宽,那多半是全角。逐个换成半角再触发一次解析,比在报错位置上来回猜要直接。
错误: A:=MA(CLOSE,20); 全角逗号与全角分号 中间: XG: C < REF(C,1); 正确: A:=MA(CLOSE,20);
保留字冲突、变量未赋值、参数个数不符
三类成因归在语法结构之外,逐个对照即可。
- 保留字与变量名冲突。公式语言里的函数名与保留字有固定含义,把它们当成变量名使用会引发解析异常。给变量起名时避开 CLOSE、OPEN、HIGH、LOW、VOL 一类名字。
- 变量在使用前未赋值。公式按顺序执行,一个变量要先通过赋值语句得到值,才能在后面的语句里被引用。把引用写在赋值之前,会报变量相关的问题。
- 函数参数个数不符。每个函数对参数个数有约定,少给一个或者多给一个都会报错。提示指向函数名附近时,先查该函数的参数约定。
| 提示原文或现象 | 含义 | 处理 |
|---|---|---|
| 「错误起始位置:第 X 行,第 Y 列」 | 解析到此处无法继续 | 换算回源码位置,并看上一行末尾 |
| 提示指向函数名但该行看着正常 | 参数个数不符或括号未闭合 | 查该函数参数约定,从内向外数括号 |
| 报错落在下一行开头 | 上一行结尾漏了分号 | 补齐分号 |
| 提示指向标点所在位置 | 用了全角标点 | 切回半角重写该处 |
逐行折半注释的定位步骤
把前面几步串成一套可重复的流程,提示的行号不确定时也能收敛到具体一处。
- 把源码整段复制到带行号的编辑器,按物理行标出序号,先得到一个粗略的参照。
- 从提示行号附近取一段作为可疑区间,上浮两行、下探两行,圈出十行左右的范围。
- 把可疑区间从中间切开,用花括号注释掉后半段,保存并再次触发解析。
- 提示消失,问题在后半段;提示还在,问题在前半段。对留下的那半段重复折半。
- 区间收到两三行时改为逐行注释,一次只注释一行,锁定到具体语句。
- 改完之后把注释全部去掉,恢复完整源码再验证一次,避免把调试用的花括号留在正式公式里。
改完之后怎么验证
修好一处不代表没有第二处。公式管理器里的「测试公式」按钮会先过一遍语法,语法通过之后,把公式挂到副图上,看输出是否按预期出现。挂图后没有输出、输出是一条直线、输出与旁边参考公式对不上,都还能反推出问题所在。
语法通过只是一层,语义是另一层。函数写法正确,但周期取错、条件方向写反,公式照样能通过解析却得不到想要的结果。验证时逐条挂副图,一次只改一个条件,能把回溯的成本压下来。
验证顺序 1 测试公式 -> 先过语法 2 挂副图 -> 看是否有输出、输出形态是否符合预期 3 逐条改 -> 一次只动一个条件,便于对照
通达信公式错误位置怎么找,落到操作上就是三步:把行列号换算成源码位置,用折半注释把范围缩到一行,再按成因清单对照修改。这套流程处理的是语法与结构层面的问题,公式能不能表达你要表达的意思、参数取值是否合适,属于另一层问题,本文不展开。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 通达信公式报错与卡顿排查、通达信公式编写教程、通达信公式安装与导入 的条目,报错定位、语法编写与安装导入可对照查看。
