同一段源码,挂在本地公式管理器里出信号正常,做成云公式选股之后却报错,或者报错是空的、结果集也是空的。这种落差让通达信云公式报错排查不能只盯着公式本身看,得从同步状态、取数时间、结果集刷新顺序三段往回查。本地计算用的是本机已经落盘的数据,云公式还要经过一次同步和一次远程计算,两次都成功了才会有结果。下面按报错原文、判错层次、核对顺序逐层说。
一、先分清报错出现在哪一段
云公式的执行链路有三段,报错信息里会带出它停在哪一段。
| 出现位置 | 提示特征 | 该段在做什么 |
|---|---|---|
| 公式管理器保存时 | 提示语法错误,并给出出错的行号 | 本地编译,与是否上云无关 |
| 云端同步时 | 提示同步失败,或状态一直显示未同步 | 把本地公式推送到服务器 |
| 选股与预警运行时 | 提示数据不足、取不到值,或结果集为空 | 在服务端用服务端数据计算 |
第一段的报错属于写法问题,改源码就能解决,和云不云没有关系。后两段才是云公式特有的,也是通达信云公式报错排查真正要处理的部分。
二、同步段:状态没到位就往下走
同步段的报错有两种表现,一种直接弹提示,另一种没有任何提示,只是公式状态一直停在未同步。
没有任何提示的那一种更麻烦,因为它不报错,只是不生效。判断办法是打开公式管理器,看这条公式的状态标记:已经同步的会带一个云标识,没同步的没有。没有标识就说明本地改动还没推上去,此时在选股里跑的是服务器上一次收到的旧版本,报错或者结果不对都属正常。
{云公式在本地源码里要用云函数取数,不能用本地文件函数}
{以下写法在本地能跑,上云后取不到值}
LOCALV:=EXTDATA(1);
{云公式取数要用服务端能识别的方式,具体函数名以本机说明为准}
CLOUDV:REF(C,1);
三、取数段:数据补全时间没到
同步成功之后,报错换成了「数据不足」或者结果集为空。这一段的根源一般是时间:服务端的数据不是收盘立刻补全的,收盘后的一段时间里,日线数据还在陆续落盘。
这个时间差会带来一个具体的现象。同一段源码,收盘后立刻跑一次是空结果,过一段时间再跑,结果出来了。这中间源码没有任何改动,变的只有服务端数据。核对办法是记录两次运行的时间点,对照当时的数据补全情况。
取数段还有两个容易忽略的细节。
第一,跨周期取数时,日线补全了不代表周线也补全了。周线要等当周最后一个交易日收盘后才定型,在周中取周线数据,取到的是未走完的那一根。周中跑云选股,跨周期引用的部分会和服务端实际存储的周线错位。
第二,云公式选股用的是服务端的数据范围。本地公式可以选全市场,也可以选自定义板块,云选股的范围受服务端订阅的数据集限制,范围之外的标的取不到数据,表现为这批标的静默落在结果之外,而不是报错。
还有一种情形要单独说:源码写得对,云端也同步成功,但取数范围被限在服务端订阅的数据集之内。范围之外的标的取不到数据,既不报错也不进入结果集,表现为「选出来的数量比预期少一截」。核对办法是把云端结果集与本地全市场结果集做一次差集,看少掉的那一批是不是正好落在数据集边界之外。这个差集也是判断「是数据没到还是范围没盖住」的分界线:差集落在边界之外,是范围问题;差集在边界之内且分布零散,则要回到时间上再确认一次。
四、结果段:刷新顺序影响看到什么
前面两段都正常,还有一种情况会让人误判成报错:结果集没刷新。云端算完之后,本地界面上的结果不会自动跟上,需要手动触发一次刷新或者重新进入选股界面。
处理顺序上,先确认同步状态带云标识,再确认数据补全时间已过,最后触发一次重新取数。三步按这个顺序走,中间任何一步跳过,后面看到的都可能是旧缓存。反过来,先怀疑公式写法会把排查带偏,而源码在本地已经编译通过。
{用一条最简公式分离问题:只取收盘价,不带任何条件}
TEST: C;
{逐段加上条件,每次只加一处,定位是哪一段带来的空结果}
C1: C > REF(C,1);
C2: C1 AND V > 0;
用这种逐段加条件的办法,可以判断空结果是从哪一处条件开始出现的。加法比删法可靠,因为每加一处都是一次可复现的对照。
五、云公式与本地公式的差异点
通达信云公式报错排查里绕不开的,是两者在设计上的差异。差异集中在三处。
| 差异项 | 本地公式 | 云公式 |
|---|---|---|
| 数据来源 | 本机已落盘的数据,补全时间取决于本机更新进度 | 服务端数据集,补全时间由服务端决定 |
| 可用函数 | 文件读写、外部数据类函数可用 | 只有服务端实现过的函数可用 |
| 生效方式 | 保存即生效 | 要经过一次同步,未同步时跑的是旧版本 |
三处差异里,第二处最容易踩。本地调试时为了取外部数据加了一段文件读写,上云之后这段在服务端没有对应实现,编译能过,运行时取不到值,表现为结果为空而不是报错。核对办法是把这段单独摘出来,看服务端的函数说明里有没有同名函数。
六、核对顺序与验证方法
按下面的顺序走,每一步对应一段链路,把范围逐步收窄。
- 打开公式管理器,核对这条公式的状态标记,确认是否带云标识。没有标识就先同步,不要在未同步的状态下判断结果对错。
- 确认当前时间是否已过数据补全时段,把第一次运行的时刻记下来,隔一段时间用同一段源码再跑一次,看结果是否出现。
- 把手动触发的刷新做一次,排除界面缓存。如果刷新之后结果出来了,问题在刷新顺序上,不在公式里。
- 用最简公式做一次单点检查,只取收盘价,确认链路本身通。通了之后再逐段加条件。
- 把本地能跑、云端取不到值的函数段单独摘出来,对照服务端函数说明确认是否有对应实现。
这五步做完,报错大致能落到某一段上。需要提醒的是,界面入口的名称与状态标记的样子在不同版本和不同券商定制版之间存在差异,具体以你所用客户端的帮助文档为准。函数是否被服务端实现,也要以本机函数说明为准。
公式的写法与函数名随版本变化,本文给出的判断顺序不依赖具体版本,但每一步的操作入口请按自己的客户端核对。通达信云公式报错排查的最后一步,是把每次核对的时间点与结果记在公式说明栏里,下次遇到同样现象时能直接对上,不用从头再走一遍。
