通达信公式转大智慧这件事,卡住的位置不在某一条语句,而在把整段源码粘过去、点编译,然后收到一屏对着行号的报错。逐条改完再编译,又冒出新的。原因在于两套公式系统对同一个位置该怎么写有不同的约定,而约定是按整段结构生效的,不是按单条语句生效的。
| 转换层次 | 通达信侧 | 大智慧侧 | 是否要改 |
|---|---|---|---|
| 注释符号 | 花括号成对包裹 | 花括号成对包裹 | 不用改 |
| 赋值与输出 | 冒号输出线,等号为中间变量 | 同样区分冒号与等号 | 不用改 |
| 周期引用 | #WEEK、#MONTH 加井号 |
写法与参数位置不同 | 要改 |
| 画线控制 | 先画线再决定隐藏方式 | 用不画线的前置声明 | 要改 |
| 绘图函数签名 | 绘制类函数参数较少 | 同类函数参数项更多 | 逐条核对 |
通达信公式转大智慧的正解不是逐行搜错,而是先把「哪些层可以原样搬、哪些层必须重写」分开。下面按依赖关系从底到上排一遍:先看结构层,再看取数层,然后是绘图层,最后是验证。文中写法以通达信 PC 版与大智慧 PC 版的公式系统常见约定为准,两个软件在不同版本上的函数签名都有增补,具体以你所用客户端帮助文档里的函数说明为准。
一、结构层:先搬骨架,不要先动语句
公式的骨架由四部分组成:参数声明、中间变量、条件判断、输出线。这四层在两套系统里的组织方式是同一套逻辑,因此从通达信搬到大智慧时,骨架可以整段保留,改的是骨架内部某些位置的具体写法。
具体做法是把源码按空行切成若干块,每块对应一个层次,逐块判断。参数声明块可以原样搬;中间变量块里凡是不涉及跨周期引用与绘图的,可以原样搬;输出线块与绘图块要逐条过。
{骨架示例:中间变量层可整段搬}
快线:EMA(C,12);
慢线:EMA(C,26);
差值:快线-慢线;
上面这一段在三处都不涉及跨周期与绘图,所以从通达信搬到大智慧不需要改动。判断依据是:语句里只有价格字段、算术运算与移动类函数,没有井号周期后缀,也没有绘制类函数调用。
二、取数层:跨周期引用是第一个必改点
通达信里取周线、月线的值,写法是在字段或变量后面挂一个井号加周期名,例如 日线值#WEEK。大智慧对跨周期的写法与参数位置不同,这是通达信公式转大智慧时第一类必须重写的地方。
这类差异的麻烦之处在于它不会全部报错。有些写法会被解析成一个未定义标识符,编译器直接报错;另一些写法会被当成一个普通变量名接受下来,编译通过,但取到的是空值或零值,图上那一段线段要么不出现,要么贴在零轴上。第二种情况只靠编译结果发现不了。
若源码里跨周期引用出现在多个位置,建议先把它们全部集中到公式开头,改成一组独立的变量,再在后续语句里引用这组变量。集中之后,改写与验证的工作量都从分散变成一次。
三、画线层:从「先画再隐藏」改成「声明不画」
通达信公式里常见一种做法:把一条线正常画出来,再通过数值处理让它不显示,例如把不想显示的区段赋成一个特殊的空值。大智慧提供了不画线的前置声明方式,思路是把「不画」提到绘制之前表达。
这两种思路搬到一起时,直接照抄会出问题。通达信侧的「先画再隐藏」依赖的是数值层面的处理,大智慧侧的「不画线」依赖的是绘制指令层面的开关。把前者照搬过去,得到的是数值被破坏、线条形态被改坏的结果,而不是「不显示」。
{通达信侧:先画再处理}
原线:EMA(C,20);
展示线:IF(C>原线,原线,空值);
{大智慧侧重写方向:先声明不画,再按条件绘制}
{此处跳过声明写法,按你所用版本的帮助文档填写}
{思路是:把默认绘制关掉,只在条件成立的位置调用绘制函数}
改写顺序上,先处理所有需要隐藏的线,把每一处的隐藏意图用一句话写清楚,再逐一落到大智慧的对应写法上。不要一边改一边编译,那会让报错信息与实际改动错位。
四、绘图层:函数签名逐条核对
画柱、画图标、写文字这几类函数,两套系统的参数个数与顺序不同。通达信的同类函数参数项较少,大智慧的对应函数参数项更多,位置也不同。这一层没有通用规律,只能逐条比。
| 绘图意图 | 核对什么 | 搬错的表现 |
|---|---|---|
| 在指定位置画柱体 | 条件参数与高低值参数的位置 | 柱体画在错误的价位或宽度异常 |
| 在指定位置画图标 | 图标编号的取值范围 | 图标编号越界时不显示或显示成别的图形 |
| 在指定位置写文字 | 文字参数的书写位置与引号要求 | 文字位置偏移或整条语句判为非法 |
| 绘制水平线 | 是否需要在每根上都给值 | 线只在一根上出现,其余位置断开 |
核对这一层时可以借助一个省时的办法:在通达信里先把每个绘图函数的调用单独摘出来做成一段最短的可运行公式,确认它的参数含义,再在对应的大智慧函数上做同样的最短验证。两段都跑通之后,再合并回主公式。
五、通达信公式转大智慧的验证顺序
整段改写完成后,按下面四步验证,顺序不要颠倒。
- 只保留中间变量层,把每一层变量输出成副图线,与源公式在同一根数据上的取值逐个对照。这一步排除取数层的错误。
- 恢复条件判断层,观察在源公式给出条件的位置上,目标公式是否在同几根上给出条件。
- 恢复绘图层,观察线条的形状、颜色与位置,与源公式的截图逐项比对。
- 把两段公式分别挂到同一个较长周期的图上,对比最近若干根上的数值趋势,确认没有整体偏移。
第二步与第四步是这一套里最容易被跳过、也最能暴露问题的两步。条件层的差异只在少数根上出现,看一小段图不容易发现;整体偏移则只有在拉长时间范围之后才看得出来。
六、参数与常量同样要过一遍
除了语句结构,两组公式里的常数值也常常带着原来的口径。通达信公式里一个写死的窗口长度、一个阈值,搬到大智慧之后如果字段单位一致,可以沿用;但如果那个常量是配合某个字段的单位设定的,字段口径变了,常量就要跟着变。
{常量是否可沿用,取决于它配合的字段单位}
若字段单位一致:
阈值 := 原值;
若字段单位不同:
阈值 := 原值 * 单位换算系数;
{判断办法:把该常量所在的算式单独跑一遍,看结果量级是否与源公式一致}
判断办法是把该常量所在的算式单独跑一遍,看结果量级与源公式是否一致。量级差一个固定倍数,说明单位换算漏了;量级一致但数值有细微差,差别来自两套系统在计算精度或复权处理上的不同。
七、跨平台改写之后的两条边界
第一条边界是数据可得性。两套软件提供的历史数据长度与字段完备程度不同,源码里用到较长历史数据的算式,搬到目标平台后可能因为可用数据不足而取到空值。判断方法仍然是拉长图表观察最早的若干根。
第二条边界是复权选项。两套软件对复权的默认设置可能不同,价格类字段在复权设置变化时数值会改变,而量的字段不变。以价格为输入的算式在两边的默认复权状态下跑,结果会有系统性差异。核对口径时先确认两边的复权选项是否一致,再比较结果。相关字段的取法可以对照 通达信公式编写教程 一栏;转换过程中的失败表现与定位顺序,见 报错与卡顿排查 一栏;两边都涉及同花顺时的应对方式,见 跨平台对比与公式转换 一栏。
回到开头那个场景:粘过去、编译、拿到一屏报错,这个顺序本身就不适合跨平台改写。通达信公式转大智慧要先把结构层与取数层分出来,把必须重写的位置集中处理,最后才谈逐条改错。按这个顺序走,报错会少得多,也不会出现编译通过但取值错误这种最难查的情况。
文中函数名与语法按通达信 PC 版与大智慧 PC 版公式系统的常见写法描述;两个软件在不同版本上的函数签名、字段命名与默认设置都有差异,具体请以你所用客户端帮助文档为准。本文只讨论公式语法与转换机制,不构成任何投资建议。
