通达信公式转换器做的是一件比名字朴素的事:把一段公式按文本规则改写成另一个软件能读的写法。它读字符,不读含义,所以它不是翻译器。凡是不需要读懂算式含义、只改字符就能解决的差异,它可以自动做;凡是必须判断「这一句在算什么」才能定的差异,它做不了,得由人来定。把它当翻译机,是使用中最容易走偏的一步。
下面按文本层能做什么、三类做不到的情形、转换后的三步验证展开。函数名以各软件公式编辑器里的函数列表和本机实际版本为准。
一、它改的是字符,不是语义
文本层替换要落到动作上。转换器拿到一段公式源码,逐字符扫一遍,按事先写好的对照关系把某些符号换成另一些符号,输出另一段文本。整个过程不解析这段公式在算什么:没有语法树,没有算式含义,没有变量之间的依赖。一段注释掉的废代码与一段在用的公式,对它没有区别。
由此有两个后果。好的一面是改写得齐整,字符不漏,几千行的公式与三行的公式工作量一样。要防的一面是冲突写法:源码里出现与对照关系相撞的写法时,它照表改,改出来的未必是你想要的,改完必须编译、必须核对。
举个具体的:公式里出现字符串常量,或者注释里写了指标简称。替换若按裸字符串匹配去做,注释与字符串里的字都会被改,改完还能编译,意思却变了。按记号(token)替换还是按裸字符串替换,结果不同,只能实测:把一段带注释的公式丢进去,看注释有没有被动过。
二、能自动完成的部分:四类文本操作
通达信公式转换器在文本层能做的操作归成四类,验证时也照这四类逐项看:
- 标识符改名。变量名、参数名、函数名按对照关系逐字替换。同一个量在两边的名字不同时,靠这一步换过去。
- 运算符与括号映射。不等号、赋值符号、逻辑与或非的写法差异,以及括号配对方式的差异。纯符号替换,与算式含义无关。
- 注释符号清理。一边的注释用大括号包起来,另一边可能用别的注释符号,这一步换掉注释符号或按设置把注释整段丢掉。
- 换行整理。有的编辑器要求一条语句占一行,有的允许一行写多条,这一步把换行补上或去掉。
四类都做完,得到的是一段对方软件读得懂语法的文本。边界要说清楚:语法通过,不等于算出来的数一样。语法与语义分属两层,转换器只在第一层里干活。
{ 文本层替换的对照关系示意,不是某一款工具的规则表 }
项目 替换动作 落到对方软件
: 输出赋值 符号改写 按对方规定的输出符号
:= 中间赋值 符号改写 按对方规定的中间量符号
{ 注释 } 注释符改写 按对方规定的注释符
AND OR NOT 关键字改名 按对方的关键字写法
表里「落到对方软件」一栏刻意不写死,同一个符号在不同软件里可能对应不同写法。
三、第一类做不到:对方没有同名函数
文本层替换解决不了「对方根本没有这个函数」。函数名可以改,函数体没法凭空长出来。这类缺口集中在绘图类与统计类。
绘图类里,画线、画柱、画图标、写文字这一套,各软件覆盖范围不一样。有的有名字接近的函数,参数个数与含义都不同;有的没有对应物,得拿基础绘图原语自己拼。转换器能做的是改函数名,改完之后要么编译时提示没有这个函数,要么语法通过了但画的位置不对。
统计类里,取极值、取排名、算回归、算相关系数这一类,各家名字接近的实现未必接近。这里靠逐个核对:打开对方的函数列表,把原公式里的函数按名字搜一遍,「有」与「没有」两列分开记。
{ 缺函数时的处理骨架,是思路不是某一家的专有写法 }
{ 第一步:确认对方函数列表里确实搜不到 }
{ 第二步:要么按定义用对方的基础函数重写这一支,要么把这一支摘掉,改成一个占位量 }
PLACE := DRAWNULL;
{ 占位不是等价实现,它只是让整条公式能通过编译 }
四、第二类做不到:同名但参数语义不同
第二类更隐蔽:函数名字一样,参数背后的算法不一样,转换器看不出来。它只改字符,不改算法。三种口径容易在这里出问题。
第一种是周期。同一个函数名,一边的周期参数按 K 线根数算,另一边按自然日或交易日算。名字换过去了,周期数没换,取到的窗口就不是同一段行情。
第二种是复权。同样的收盘价字段,两边默认的复权方式未必一致。除权除息那一根前后的取值会变,凡是牵扯跨除权日的比较、区间高低点、涨跌幅,结果都会偏。转换器改的是字段名,改不了取数时的复权设置,这个设置落在软件界面层。
第三种是单位。成交额与成交量这一对,不同数据源按手、按股,带万元、带元,写法都有。名字改过去了,量级没换,凡是拿成交量做比值的地方还能对上,凡是拿成交量做体量比较的地方就会差出量级。
| 口径 | 转换器能做的 | 要人工确认的 |
|---|---|---|
| 周期 | 把参数名与函数名替换掉 | 参数按根数还是按日,跨周期调用时取哪一根 |
| 复权 | 把价格字段名替换掉 | 取数时的复权设置,跨除权日的两段能不能直接比 |
| 单位 | 把量字段名替换掉 | 手与股、元与万元是不是同一套口径 |
三条的核对方法一样:取一小段含除权日的行情,把两边同一根上的中间量输出出来逐根比。对不上时先查口径,再查算式。
五、第三类做不到:坐标体系与输出方式不同
第三类是结构与呈现上的差异。转换器只看文本,看不到图,这一类它同样做不了。
画线基准不一样。主图上画线,有的按价格值定位,有的按画面比例定位,同一句语句落在图上的高度不同。有的软件主图坐标按百分比给,价格被换算过一道,直接搬过去的数值会落错位置。
主图与副图的量纲不一样。指标输出一个零到一百的量,挂在主图上会把价格线压扁;价格量纲的输出放到副图上,就成了一条贴边的线。转换器改不了「这条输出该挂哪儿」,这是显示属性,在公式的显示设置里。
输出方式也不一样。有的软件靠函数带不带输出符号决定画不画线,有的靠单独的显示开关;有的把不画的根写成空值让线断开,有的会补零连起来,图上那段平线是补出来的。
六、转换后的三步验证
通达信公式转换器给出的结果只是一段文本,能不能用要靠验证。验证按三步走,顺序不要调。
第一步,编译是否通过。在对方软件的公式编辑器里新建一条公式,把转换结果整段粘进去保存。编译报错就先解决报错,报错信息里的函数名与行号直接指向没有对应上的位置。
第二步,函数是否逐一有对应。把原公式里出现的函数列一张单子,对着对方的函数列表逐个打勾。名字与参数个数都对上的算过;名字对上、参数个数不对的算待定;列表里搜不到的算缺。
{ 逐函数核对的记录格式,跟着公式一起留档 }
函数名 对方有无 参数个数 语义口径
MA 有 一致 需看周期取根数还是取日
HHV 有 一致 需看窗口含不含当根
统计函数 无 - 需要重写或摘除
第三步,同一段数据逐根比对取值。取一个跨度里含除权日、含停牌的区间,把两个公式在同一根上算出的中间量输出成线,一根一根对。对不上时往两个方向查:往左查取数口径,往右查算式细节。
- 先数根数:窗口要求 N 根,两边各自的实际根数是不是一样。
- 再对口径:复权设置、周期设定、量的单位,三个开关先对齐。
- 再看算式:括号层级、运算符优先级、常量的小数位,逐层剥开。
- 最后看图:输出挂在主图还是副图,断线是算出来的还是补出来的。
任一步没过就不算转换完成。
七、本篇不写什么,以及下一步动作
本篇不逐条列通达信与同花顺、大智慧、东方财富之间的具体语法差异对照表。这类对照表跟着软件版本走,写下来就会失效,得自己实测。本篇也不写手机、Mac、iPad 端能不能用转换这件事,那属于软件端的可用范围,与公式本身的改写没关系。
下一步动作按这个顺序做:先把原公式另存一份备份;再打开对方的函数列表,把原公式里的函数逐个搜一遍,先填完「缺」那一列;然后把转换结果粘进对方的公式编辑器里编译,按报错逐条改;最后取一段含除权日的行情,把两边的中间量输出成线,逐根比。这一轮走完,一段公式能不能用,你自己就有结论了。
通达信公式转换器省掉的是敲字符的时间,剩下的是判断:函数有没有对应、参数口径一不一致、输出挂在哪里。前面那部分交给工具,后面这部分交给自己,这条分界线在开工之前就划清楚。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 跨平台对比与公式转换 的条目,通达信公式编写教程 讲写法与函数用法,报错与卡顿排查 讲编译报错与失效核对的办法,可对照查看。
