把一段通达信公式转同花顺时,会碰到这样的情形:源码在原平台的公式管理器里点一下测试,编译通过,曲线也正常;换到另一个平台的公式编辑器里,要么直接报错,要么编译通过而画出来的曲线与原来对不上。同一套计算逻辑,两边给出的结果却不一致,问题落在哪几处?下面按差异分层、改写顺序、典型失败、逐根验证四个环节,把这条通路走一遍。

一、差异集中在三个层面

通达信公式转同花顺的差异,按改动成本从低到高可以排成三层:符号层、函数层、绘图层。先分层,再逐层处理,返工次数会少。

分层的用处在于把「改符号」和「改逻辑」分开。符号层的改动不带数值风险,可以批量做;函数层与绘图层每改一处都要单独验证,两者混在一起改,出错之后分不清是哪一层引起的。

第一层是赋值与输出符号。通达信一侧的写法是固定的:中间量用冒号等号,输出线用冒号,注释用一对花括号包起来。中间量不画线,也不进输出序列,只有用冒号声明的量才会成为输出。另一侧的对应符号以该平台自身的公式说明为准,改写的动作是逐行核对符号,把每一行的声明意图先标出来,再换符号。

第二层是函数名与参数表。数值计算类函数名在两边可以对齐,取价、均线、窗口极值这些基础运算表达的是同一件事。差异集中在绘图类、字符串类与板块数据类:同一功能的函数名未必相同,参数个数与顺序也各有各的规定。这一层不凭印象替换,逐个函数去查两边的函数说明,确认名称、参数个数、参数顺序三项都对上。

第三层是绘图与颜色修饰。DRAWTEXT、DRAWICON、STICKLINE 这类函数,两边的参数顺序与颜色常量的写法习惯不同;颜色既可以写成常量值,也可以写成颜色名,取法不一致时,同一段绘图语句会落在不同的位置,或显示成不同的颜色。

三层里,符号层的改动便宜、影响面大;函数层要查文档;绘图层改错了不报错,只在图上显示出来。

层面 差异所在 核对动作
赋值与输出符号 中间量、输出线、注释的声明符号 逐行标出声明意图,再换符号
函数名与参数表 函数名称、参数个数、参数顺序 查两边函数说明逐条对齐
绘图与颜色修饰 参数顺序、颜色常量的写法 按本平台函数说明改,不按记忆改
{三层差异的逐行核对位置}
第一层  赋值与输出  中间量 冒号等号   输出 冒号   注释 花括号
                  —— 逐行核对,逐行替换
第二层  函数与参数  名称 / 参数个数 / 参数顺序
                  —— 数值计算类可对齐,绘图类逐条查
第三层  绘图与颜色  参数顺序 / 颜色常量写法
                  —— 以本平台函数说明为准

二、改写按数值、绘图、参数的顺序推进

改写分三段推进:数值计算、绘图、参数。每段独立验证,不要整段粘贴之后逐个报错去修。

  1. 先让数值计算部分编译通过。把中间量的定义单独抄过来,符号逐行对齐,每搬一个中间量,临时把它改成输出线挂到图上,确认有曲线再继续。这一步只管数值,先放下颜色与文字。
  2. 再补绘图。数值对得上之后,把 DRAWTEXT、DRAWICON、STICKLINE 这些绘图语句按新平台的规定补回去,参数顺序逐条核,颜色常量按本平台写法改。
  3. 最后对齐参数默认值。参数省略不写时,两边可能取到不同的默认周期;把周期参数全部写全,不依赖默认值,这一处差异就消失了。
{原平台写法骨架:中间量先声明,最后一条才输出}
短期:=MA(CLOSE,5);
长期:=MA(CLOSE,20);
差值:=短期-长期;
差值线:差值;

示例里前三行用冒号等号,只有最后一行用冒号。改写时先把这四行的声明意图标出来,再换成新平台的对应符号;符号换完编译一次,确认没有语法提示,再进入绘图部分。

注释的处理跟符号层放在一起做。原平台用花括号包起来的说明文字,在另一侧可能用别的成对符号界定,或不允许出现在某些位置。整段搬过去之前,先把注释逐条摘出来,改完算式再按新平台的规则补回。注释本身不进计算,但界定符号写错位置,会让后面的内容一起被吞掉。

三、三类典型失败各卡在哪一环

通达信公式转同花顺之后出问题,失败形态可以归成三类,各自卡在不同的环节。

第一类是编译不通过:函数不存在,或参数个数与顺序不符。这一类会给出报错位置,顺着提示定位到行,再查该函数在两边的参数规定。报错行不等于出错行:上一行的括号没有闭合时,提示可能落到下一行。

第二类是能编译但曲线不一致:参数默认值不同,或两边取数的范围不同,历史数据长度、复权设置都会影响窗口函数在起点附近的结果。这一类编译器不报,只在数值上体现。

第三类是绘图整段丢失:数值部分正常,绘图语句因为参数顺序或颜色写法不对,整段没有显示,或显示在错误的位置。

失败形态 暴露环节 排查入口
编译不通过 符号层与函数层 看报错定位到行,查该函数在两边的参数个数
编译通过但数值不一致 参数与数据范围 把参数写全,再对齐数据区间与复权设置
绘图整段丢失 绘图与颜色层 查参数顺序与颜色常量的写法

第二类要单独留意。报错至少给了位置,数值偏差只体现在曲线上,得逐根核对才能发现。

四、逐根比数值的验证方法

通达信公式转同花顺改完之后,验证的判据是同一参数下两边输出逐根相等。取一组基础运算,把两边的结果各抄 20 根 K 线,逐根比数值。

{验证:同参数下两边各抄 20 根 K 线,逐根比数值}
MA20  : MA(CLOSE,20);
EMA12 : EMA(CLOSE,12);
HHV20 : HHV(HIGH,20);

抄数的方法是:在原平台的同参数图上逐根读出这三条线的值,记成 20 行;再在另一平台的对应图上读出同样 20 行,两列数值逐行比对,差值落在容差范围内才算通过。三条线覆盖三类算法:MA 是简单平均,EMA 是带权递归,HHV 是窗口极值。递归类与窗口类对起始数据的处理方式不同,这两条线在数据起点附近容易出现分叉,比对时把起始的若干根单独看一遍。

数值不一致时,回到上一节的三类失败去定位:先看参数是不是写全,再看两边的取数范围与复权设置是否一致,最后才回到函数层逐条核对。顺序反过来,会在一批无关的行上耗时间。

五、边界与名词口径

这条通路的边界落在三处,逐条说清楚。

函数表以各平台自身的函数说明为准。本文只给差异的分类与排查路径,不给全量函数映射表;两边的函数集合与更新节奏不同,一份固定映射表过了版本就容易失效。要具体的函数名,去两个客户端的帮助文档里逐条查。

版本差异落在同一处。同一个客户端的公式系统在不同版本之间会增删函数、调整参数上限,跨版本核对时以本机帮助文档为准;界面菜单名称在不同版本里也可能略有差异,以本机为准。

数据一侧也要对齐。两边的历史数据长度与复权选项不同,窗口类函数在数据不足的位置取不到足够样本,输出自然不同;核对前先把两边的数据区间与复权选项调成一致。

下一步的动作按顺序排:把原公式的中间量清单抄成一张表,逐行标出声明意图;按数值、绘图、参数三段改写,每段编译一次;最后用 20 根 K 线的逐根比数值收尾。通达信公式转同花顺这件事,验收标准是每一根 K 线上的取值相同,源码长得像不像不影响结论。

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

站内还有 跨平台对比与公式转换 一栏,报错与卡顿排查 里讲编译报错与静默失配的定位顺序,通达信公式编写教程 里讲赋值、输出与函数引用的写法,可对照查看。

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