通达信函数参数核对,对付的是「编译过得去、结果不对」这一类问题。公式里写一行 IF(C>O,1,0),编译没有任何提示,挂到副图上却是一条平线,或者一串 0。这时排查方向不在条件本身,而在参数填在哪个位置、填的是什么类型。编译器只检查拼写与括号,它不会替你判断一个数值参数塞进条件位是不是搞错了。

这篇按三步走:先确认函数本身在这台机器的函数表里,再核对个数与顺序,最后确认它的返回值能放在哪。三步都能在公式编辑器和公式管理器的既有界面里完成,不需要外部工具。

一、先分清「函数不存在」与「函数写错了」

通达信函数参数核对的第一处,是函数名本身。公式编辑器的工具栏上有「插入函数」入口,点开是分类排布的函数列表,每一类下面列出可用函数和它的参数提示。拿这份列表与自己敲的名字对一遍,能分开两种情形:名字根本不在这台机器上,或者名字在、只是参数用得不对。

名字不在列表里,来源可以归成三种:一是这个函数属于更新版本才加入的,本机版本没有;二是名字拼错,或者把两个相似函数记混;三是这个函数属于别的软件的语法体系,通达信没有对应实现。三种来源的处置完全不同,但表现出来的现象一样,都是编译时提示这一段不认。

版本这一层要有出处才下结论。官方更新记录在版本说明里会列出新增函数与修正的函数,例如 V7.62 的更新条目提到加入 SUMBARSX、修正 IFC。看到「换台机器就报错」的公式,先去对一下两台机器的版本号(帮助菜单里的关于项),再对更新记录,比在源码里反复改要快。

{ 常见函数的参数个数,先记这一组 }
MA(X,N)              2 个:序列、周期
REF(X,N)             2 个:序列、向前根数
HHV(X,N) / LLV(X,N)  2 个:序列、窗口长度
SUM(X,N)             2 个:序列、累加根数
CROSS(A,B)           2 个:两条序列
IF(COND,A,B)         3 个:条件、成立取值、不成立取值
DRAWTEXT(C,P,T)      3 个:条件、位置、文字
DRAWICON(C,P,T)      3 个:条件、位置、图标编号
STICKLINE(C,P1,P2,W,E) 5 个:条件、两个端点、宽度、空心标志

这张表不用背全,用法是反过来的:写出一个函数之后,去列表里点一次同名函数,看它的参数提示是不是和自己写的一致。参数提示里每个位置都有类型说明,这就是核对依据。

二、个数不对时的提示原文怎么读

参数个数少了或者多了,编译会停在这一行。提示措辞在不同版本之间有差别,对照时看指向的行为准,不要只看字面是否眼熟。

提示原文(大意) 它指向什么 核对的落点
参数不匹配 / 参数个数不对 函数的实际参数个数与定义不一致 数逗号:三参数函数要两个逗号,含括号嵌套时容易漏一个
变量未定义 这一段的标识符既不是函数也不是已赋值变量 往上看这个变量有没有赋值;注意赋值句与输出句用的是不同符号
输出过多 / 输出变量超限 输出线数量超过当前类型允许的上限 把中间量改成用冒号等号赋值,只留需要显示的那几条
错误起始位置:第 N 字符 编译停下的位置 从这一行行首数到第 N 个字符,位置只给起点,不给原因

「错误起始位置」这一条要单独说:它给的是一个字符偏移,行号要自己数,而且偏移按什么单位计,不同版本的处理不一样。稳妥的做法是把提示行整段注释掉,再编译一次,看错误是否消失;消失说明问题在这行,没消失说明在它后面几行被连带报出。逐段折半注释,比盯着一个数字猜要省时。

三、个数对了,顺序也可能被换

同类型参数的顺序错位,编译器不会报错。CROSS(A,B) 两个参数都是序列,写反了照样编译通过,但 A 上穿 B 与 B 上穿 A 是两个相反的事件,图上的信号方向整个倒过来。REF(X,N) 的第二位是根数,把它与序列位置写反,同样能过编译,结果是把序列当根数用,取到的是一条常数曲线。

通达信函数参数核对在这一步的判据是「语义检查」而不是「语法检查」,只能靠读一遍函数定义。参数提示里写的是「条件」「序列」「周期」「位置」这类词,逐个位置对照自己的写法,比看结果猜要直接。

三个位置容易出错的函数,可以单独记:IF 的第一位必须是能判真假的条件(比较运算或逻辑运算的结果),第二、第三位是同类型的两种取值;STICKLINE 的后两位是宽度与空心标志,宽度写大了会盖住整根 K 线;DRAWTEXT 的第三位是文字,要用单引号包起来,写成裸字符会被当成变量名。

{ 顺序写反不会被拦,但结果会变 }
上穿写法:CROSS(MA(C,5),MA(C,20))
写反之后:CROSS(MA(C,20),MA(C,5))
两行都能编译,方向相反

取数写法:REF(C,5)
写反之后:REF(5,C)
第二位当成根数,取到的不是五天前的收盘

文字参数这一处还有全角与半角的问题。从网页或聊天窗口把公式复制过来,引号与括号可能已经变成全角,屏幕上与原文看不出差别,编译却过不去。粘完先编译一次,再动别的。

四、返回值类型决定它能放在哪

函数不是一个统一的「数」。按返回值分,公式里的函数大致三类:返回数值序列的(C、MA、SUM、HHV)、返回条件或逻辑值的(CROSS、EXIST、BETWEEN)、返回绘图指令的(DRAWTEXT、DRAWICON、STICKLINE、DRAWTEXT_FIX)。第三类的作用是把东西画到图上,它本身不是一个可以继续参与算术的数。

把绘图函数的结果当数值用,是「没有报错但结果不对」的一个来源。比如写 A:=DRAWICON(C>O,L,1); 再拿 A 去和收盘价比大小,A 取到的不是图标位置,也不是一个有效的价格序列,后面的比较自然没有意义。绘图函数按语句使用,不参与赋值运算,这条界线在被问到「为什么我的条件全是 0」时值得先查一遍。

布尔型返回值参与算术时,会按 1 与 0 处理。CROSS 成立时返回 1,不成立时返回 0,所以 SUM(CROSS(A,B),20) 数的是二十根以内交叉成立的次数。这一点在统计信号密度时用得上,但要知道它统计的是「条件成立的根数」,不是「信号事件的个数」,连续两根都成立会被数成两。要数事件,得先做去重,例如只在成立的当根取一次。

数值序列的窗口参数也有取值范围。窗口写成 0 或负数,取到的结果不符合预期;窗口大于本地数据的根数,函数会从第一根有效数据开始算,前面的段位出现空值。空值在图上表现为断线,用 DRAWNULL 可以把它显式置空,避免被当成 0 画出一条贴着底边的线。

五、用最小测试公式复核一次

通达信函数参数核对的最后一步,是把可疑的那一句单独拎出来做一次最小测试。做法是新建一支指标,只留一行输出,其余全部删掉,参数写成常数,把结果挂到副图看数值。数值对得上,说明这一句本身没问题,问题在它与其他语句的组合上;数值对不上,问题就锁在这一句。

{ 最小测试公式的骨架 }
{ 只测一句,别的都删掉 }
X:MA(C,5);
{ 想看原始值就把 C 也输出一次做对照 }
Y:C;

测试时把输出改成有量纲的形式,判读会容易一些。比如怀疑 REF 的根数写错,就把 REF(C,5) 与 C 同时输出,两条线在图上应该相差五根 K 线的位移;看不出位移,说明第二位的根数没有生效,多半是写成了变量或者写成了 0。

测试公式用完就删。留在公式树里的测试条目多了,之后在分类里找正稿会变慢,也容易在导入导出时一起打包出去。

六、换台机器或换版本就报错时的顺序

同一份源码在另一台机器上编译不过,按下面的顺序查,每一步排除一类原因。

  1. 查版本号。两台机器帮助菜单里的版本号是否一致,差异跨过更新记录里的函数新增条目,就会停在函数未定义这一层。
  2. 查函数名拼写。跨机器复制时,字母 l 与数字 1、字母 O 与数字 0 的混淆在这一步暴露。
  3. 查是否用了外部函数。DLL 接入的函数依赖本机是否装了对应的动态库文件,公式本身没错,环境缺件同样编译不过。
  4. 查编码与符号。从别处粘来的整段源码,引号括号可能是全角,或者文件本身带 BOM,粘进去后整段认不出。

四步走完仍不过,就把报错那一行单独拿去做第五节的测试。函数级的最小测试能把「公式逻辑问题」与「环境问题」分开,这一步做完,剩下的判断就有依据了。

回到开头那条平线。通达信函数参数核对的价值不在记住多少个函数,而在养成一个顺序:先确认函数在不在,再数个数与顺序,最后看返回值的类型能不能接在后面。三步都过,剩下的才是逻辑层面的问题;顺序颠倒过来,就会在一堆正确的语句里找一个不存在的原因。

核对时把参数提示当成判据的第一来源,不要凭印象。同名函数在不同版本上的参数表会调整,手上的写法来自旧教程时,先点开函数列表对一遍再动手改。

站内还有 通达信公式编写教程 的条目,讲赋值规则与输出写法;通达信公式报错与卡顿排查 按提示原文分类讲编译失败;通达信新手入门问答 收着编辑器与公式管理器的入口位置。

本文只作技术研究口径,内容是公式语法与界面操作的说明,不涉及也不构成对任何标的的判断。文中提示措辞按常见版本记录,不同版本之间存在差异,以本机编译时的实际提示为准。

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