通达信公式转换器做的是一件比名字朴素的事:把一段公式按文本规则改写成另一个软件能读的写法。它读字符,不读含义,所以它不是翻译器。凡是不需要读懂算式含义、只改字符就能解决的差异,它可以自动做;凡是必须判断「这一句在算什么」才能定的差异,它做不了,得由人来定。把它当翻译机,是使用中最容易走偏的一步。

下面按文本层能做什么、三类做不到的情形、转换后的三步验证展开。函数名以各软件公式编辑器里的函数列表和本机实际版本为准。

一、它改的是字符,不是语义

文本层替换要落到动作上。转换器拿到一段公式源码,逐字符扫一遍,按事先写好的对照关系把某些符号换成另一些符号,输出另一段文本。整个过程不解析这段公式在算什么:没有语法树,没有算式含义,没有变量之间的依赖。一段注释掉的废代码与一段在用的公式,对它没有区别。

由此有两个后果。好的一面是改写得齐整,字符不漏,几千行的公式与三行的公式工作量一样。要防的一面是冲突写法:源码里出现与对照关系相撞的写法时,它照表改,改出来的未必是你想要的,改完必须编译、必须核对。

举个具体的:公式里出现字符串常量,或者注释里写了指标简称。替换若按裸字符串匹配去做,注释与字符串里的字都会被改,改完还能编译,意思却变了。按记号(token)替换还是按裸字符串替换,结果不同,只能实测:把一段带注释的公式丢进去,看注释有没有被动过。

二、能自动完成的部分:四类文本操作

通达信公式转换器在文本层能做的操作归成四类,验证时也照这四类逐项看:

  • 标识符改名。变量名、参数名、函数名按对照关系逐字替换。同一个量在两边的名字不同时,靠这一步换过去。
  • 运算符与括号映射。不等号、赋值符号、逻辑与或非的写法差异,以及括号配对方式的差异。纯符号替换,与算式含义无关。
  • 注释符号清理。一边的注释用大括号包起来,另一边可能用别的注释符号,这一步换掉注释符号或按设置把注释整段丢掉。
  • 换行整理。有的编辑器要求一条语句占一行,有的允许一行写多条,这一步把换行补上或去掉。

四类都做完,得到的是一段对方软件读得懂语法的文本。边界要说清楚:语法通过,不等于算出来的数一样。语法与语义分属两层,转换器只在第一层里干活。

{ 文本层替换的对照关系示意,不是某一款工具的规则表 }
项目            替换动作        落到对方软件
: 输出赋值      符号改写        按对方规定的输出符号
:= 中间赋值     符号改写        按对方规定的中间量符号
{ 注释 }        注释符改写      按对方规定的注释符
AND OR NOT      关键字改名      按对方的关键字写法

表里「落到对方软件」一栏刻意不写死,同一个符号在不同软件里可能对应不同写法。

三、第一类做不到:对方没有同名函数

文本层替换解决不了「对方根本没有这个函数」。函数名可以改,函数体没法凭空长出来。这类缺口集中在绘图类与统计类。

绘图类里,画线、画柱、画图标、写文字这一套,各软件覆盖范围不一样。有的有名字接近的函数,参数个数与含义都不同;有的没有对应物,得拿基础绘图原语自己拼。转换器能做的是改函数名,改完之后要么编译时提示没有这个函数,要么语法通过了但画的位置不对。

统计类里,取极值、取排名、算回归、算相关系数这一类,各家名字接近的实现未必接近。这里靠逐个核对:打开对方的函数列表,把原公式里的函数按名字搜一遍,「有」与「没有」两列分开记。

{ 缺函数时的处理骨架,是思路不是某一家的专有写法 }
{ 第一步:确认对方函数列表里确实搜不到 }
{ 第二步:要么按定义用对方的基础函数重写这一支,要么把这一支摘掉,改成一个占位量 }
PLACE := DRAWNULL;
{ 占位不是等价实现,它只是让整条公式能通过编译 }
用占位量让公式通过编译,与把这一支真正实现出来是两件事。占位之后公式能跑,但那一支没有值,图上少一条线或者多一条空线,容易被当成数据问题去查。

四、第二类做不到:同名但参数语义不同

第二类更隐蔽:函数名字一样,参数背后的算法不一样,转换器看不出来。它只改字符,不改算法。三种口径容易在这里出问题。

第一种是周期。同一个函数名,一边的周期参数按 K 线根数算,另一边按自然日或交易日算。名字换过去了,周期数没换,取到的窗口就不是同一段行情。

第二种是复权。同样的收盘价字段,两边默认的复权方式未必一致。除权除息那一根前后的取值会变,凡是牵扯跨除权日的比较、区间高低点、涨跌幅,结果都会偏。转换器改的是字段名,改不了取数时的复权设置,这个设置落在软件界面层。

第三种是单位。成交额与成交量这一对,不同数据源按手、按股,带万元、带元,写法都有。名字改过去了,量级没换,凡是拿成交量做比值的地方还能对上,凡是拿成交量做体量比较的地方就会差出量级。

口径 转换器能做的 要人工确认的
周期 把参数名与函数名替换掉 参数按根数还是按日,跨周期调用时取哪一根
复权 把价格字段名替换掉 取数时的复权设置,跨除权日的两段能不能直接比
单位 把量字段名替换掉 手与股、元与万元是不是同一套口径

三条的核对方法一样:取一小段含除权日的行情,把两边同一根上的中间量输出出来逐根比。对不上时先查口径,再查算式。

五、第三类做不到:坐标体系与输出方式不同

第三类是结构与呈现上的差异。转换器只看文本,看不到图,这一类它同样做不了。

画线基准不一样。主图上画线,有的按价格值定位,有的按画面比例定位,同一句语句落在图上的高度不同。有的软件主图坐标按百分比给,价格被换算过一道,直接搬过去的数值会落错位置。

主图与副图的量纲不一样。指标输出一个零到一百的量,挂在主图上会把价格线压扁;价格量纲的输出放到副图上,就成了一条贴边的线。转换器改不了「这条输出该挂哪儿」,这是显示属性,在公式的显示设置里。

输出方式也不一样。有的软件靠函数带不带输出符号决定画不画线,有的靠单独的显示开关;有的把不画的根写成空值让线断开,有的会补零连起来,图上那段平线是补出来的。

判断一条线准不准,先看它断在哪里。补零连起来的线在图上连着,取出来的值却是零值,逐根比对时会在本该没有数的区间里看到数。这一处需要结合本机实际截图确认。

六、转换后的三步验证

通达信公式转换器给出的结果只是一段文本,能不能用要靠验证。验证按三步走,顺序不要调。

第一步,编译是否通过。在对方软件的公式编辑器里新建一条公式,把转换结果整段粘进去保存。编译报错就先解决报错,报错信息里的函数名与行号直接指向没有对应上的位置。

第二步,函数是否逐一有对应。把原公式里出现的函数列一张单子,对着对方的函数列表逐个打勾。名字与参数个数都对上的算过;名字对上、参数个数不对的算待定;列表里搜不到的算缺。

{ 逐函数核对的记录格式,跟着公式一起留档 }
函数名          对方有无   参数个数    语义口径
MA              有         一致        需看周期取根数还是取日
HHV             有         一致        需看窗口含不含当根
统计函数        无         -           需要重写或摘除

第三步,同一段数据逐根比对取值。取一个跨度里含除权日、含停牌的区间,把两个公式在同一根上算出的中间量输出成线,一根一根对。对不上时往两个方向查:往左查取数口径,往右查算式细节。

  1. 先数根数:窗口要求 N 根,两边各自的实际根数是不是一样。
  2. 再对口径:复权设置、周期设定、量的单位,三个开关先对齐。
  3. 再看算式:括号层级、运算符优先级、常量的小数位,逐层剥开。
  4. 最后看图:输出挂在主图还是副图,断线是算出来的还是补出来的。

任一步没过就不算转换完成。

七、本篇不写什么,以及下一步动作

本篇不逐条列通达信与同花顺、大智慧、东方财富之间的具体语法差异对照表。这类对照表跟着软件版本走,写下来就会失效,得自己实测。本篇也不写手机、Mac、iPad 端能不能用转换这件事,那属于软件端的可用范围,与公式本身的改写没关系。

下一步动作按这个顺序做:先把原公式另存一份备份;再打开对方的函数列表,把原公式里的函数逐个搜一遍,先填完「缺」那一列;然后把转换结果粘进对方的公式编辑器里编译,按报错逐条改;最后取一段含除权日的行情,把两边的中间量输出成线,逐根比。这一轮走完,一段公式能不能用,你自己就有结论了。

通达信公式转换器省掉的是敲字符的时间,剩下的是判断:函数有没有对应、参数口径一不一致、输出挂在哪里。前面那部分交给工具,后面这部分交给自己,这条分界线在开工之前就划清楚。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。

站内还有 跨平台对比与公式转换 的条目,通达信公式编写教程 讲写法与函数用法,报错与卡顿排查 讲编译报错与失效核对的办法,可对照查看。

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