「点测试没反应」「有结果但一片空」「结果与图上不一致」,这三种说法常被一句「通达信公式测试不了」带过去,可它们的成因不在同一处。三种样子分别卡在取数、数据与设置上,分开之后才有查的方向。

下面按这个顺序走一遍:公式有没有输出线,数据在不在本地,周期与市场选得对不对,参数有没有落在定义域里,测的是公式入口还是选股入口。文中的菜单名与函数名以本机版本为准,券商定制版的入口位置与措辞会有差异。

一、「测试不了」分三种样子

先把现象分开。三种样子各自对应不同的对象,混着谈就会拿设置的问题去改公式。

  • 点了没反应:按钮点下去,界面不动,或者弹一句提示就结束,这类是公式没通过编译。
  • 有结果但一片空:跑完了,结果窗口没有数值,图上也没有线。要么取到了空值,要么公式本来就没有输出线。
  • 结果与图上不一致:数值有,但与主图上看到的位置对不上。周期、市场范围或者取值口径不一致。

前两种要先看公式与数据,第三种要先看设置。这个划分决定了从哪里下手:输出线的问题在编辑器里就能看出来,不用跑数据。

二、先确认公式有没有输出线

遇到通达信公式测试不了,第一处要看的不是数据,是这条公式有没有输出线。通达信的赋值有两种写法:冒号是输出,冒号加等号是中间量。中间量只在公式内部参与计算,不进输出清单,而测试界面读的正是输出清单。整条公式只用中间量赋值时,编译能过,输出清单却是空的。

输出清单在公式管理器的编辑区里能看到,列出的是这条公式对外给出的量,测试与画线都走这份清单。清单的位置各版本不同,以本机版本为准。

第二处容易误判的是画图类函数。DRAWTEXT、STICKLINE、DRAWICON 这些只往图上画东西,它们不产生可读的数值输出。一条公式如果只由画图语句拼成,测试界面拿到的仍然是空,这跟数据没关系。

{ 全部用 := 时,输出清单是空的,测试界面读不到可看的量 }
MA5 := MA(C,5);
MA10 := MA(C,10);
DIFF := MA5 - MA10;
{ 要看的那个量改成冒号,才会进输出清单 }
MA5 : MA(C,5);
MA10 : MA(C,10);
DIFF : MA5 - MA10;
{ DRAWTEXT / STICKLINE 只画图形,不产生数值输出线 }

改法只有一处:把你要看的那条线改成冒号输出。中间量照旧用等号,不用全改,改多了会把一堆辅助变量都画到图上。

冒号进输出清单,冒号加等号不进;画图类语句只改外观,不改输出清单。

三、数据没补全时读到的是空

输出线确认过之后,第二种样子就轮到数据了:有线,但一条都不画,或者结果窗口里全是空。公式读的是本地数据,本地没有的周期与品种,序列取出来就是空值。空值不是 0,也不是前一日的值,它沿表达式传下去,最后什么线也画不出来。

数据存在安装目录的 T0002 下面,按市场与周期分目录存放,日线、五分钟线、一分钟线各占一处。补数据的入口在各版本里叫法不一,「盘后数据下载」是其中一种,菜单名与层级以本机版本为准;补的时候按周期勾选,缺哪个周期补哪个,补完重跑,公式不用动。

判空用 ISNULL,不画线用 DRAWNULL。取值之前先判一次,把没有数据的那一根挡住,缺数据时线上断开,不会贴着零轴画出一条假线。

{ 先判空,再决定画不画 }
X := REF(C,1);
OK := NOT(ISNULL(X));
PREV : IF(OK, X, DRAWNULL);
{ C < X 这类比较在 X 为空时没有意义,先过 OK }

另有两处属于数据长度,不属写法问题。一是除权数据没补时,跨除权的段落上前复权序列会出现缺口,数值看着跳了一下,把除权数据与行情一起补齐再看。二是上市时间短的品种,REF(C,60) 取不到 60 根,前面那一段本来就是空的。

空值参与大小比较,得到的结果不说明任何事。先判空再比较,顺序反了会出现「某一段条件成立、另一段不成立」的假象,改公式修不掉。

四、周期与市场不匹配

第三种「通达信公式测试不了」的样子,是周期和范围设了,但设的那一项与公式对不上。测试界面与条件选股都要指定周期,公式里的取数也带周期语义,两处不一致时,读到的就是另一条序列。

周期这一侧有几种情形。测试选的是分钟周期,而本机的分钟数据没有下载,序列为空;公式按日线写,测试挂到周线上跑,数值跟着周期变;公式里引用别的周期,要用形如 "MACD.MACD#DAY" 的跨周期引用,各版本支持的周期代号与写法不一样,以本机函数列表为准。本机保留的分钟数据只覆盖一段区间,测试区间拉到很早的日期也取不到值。

范围这一侧更直接:测试与选股都要先圈定市场、板块或自选,范围里不含被测品种时,结果自然是空的。范围还要与数据对得上,选了某个市场而该市场行情没下载,同样读不出东西。

核对的办法是把两处并排看:界面上选的周期与公式里取数隐含的周期是不是同一个,圈定的范围与数据目录里已下载的市场是不是同一批。这两组对齐之后,空结果才轮到公式本身。

五、参数没填或填在定义域外

带参数的公式在编辑器里有一张参数表,写着参数名、缺省值、最小值与最大值。测试或选股时参数框留空,或者填了一个超出定义域的值,公式在这一组取值下算不出正常结果,输出就成了空或一条没有意义的线。

  • 周期类参数填 0 或负数:MA(C,0) 这类写法得不到均线序列。
  • 最小值大于最大值:参数表本身写反了,任何取值都落在定义域外。
  • 缺省值留空:各入口对空缺省值的处理不同,有的按参数表取值,有的按 0 处理,同一条公式在两个入口里结果不一样。
  • 参数名与内置对象同名:参数名取成 C 或 MA,取值会被同名对象盖住。

核对的方式是把参数表与测试时填的参数框并排看:缺省值有没有填,上下限有没有写反,填的值有没有落在上下限之间。参数表的字段与位置以本机版本为准。

六、公式入口与选股入口分开测

前面几项都过了一遍,结果还是对不上,就要看测的是哪个入口。公式管理器里对单条公式做的测试,读的是这条公式的输出清单,加上指定周期与区间上的数值;条件选股读的是公式在选定范围上的成立情况,它只关心最后一个输出是不是为真。两者读的对象不同。

差异落到现象上:一条只在主图上画线的指标公式,放到条件选股里跑,结果为空是预期内的;反过来,一条全是中间量的选股公式,选股入口里也出不来东西,原因与第二节一样,缺的是输出。

还有一处更靠前:建公式时要选分类,技术指标、条件选股、交易系统分开存放。分类选错时,另一个入口的列表里不会列出这条公式,看着像公式没建好,其实是入口不同。分类名称以本机版本为准。

编译没通过的公式,两个入口都跑不起来;提示的位置与措辞各版本有差异,原文对照放在站内的报错排查条目里,本文不重复。

七、逐项检查表

把上面几项排成一张表,查的时候从上往下走,不要跳到中间某一行去改公式。

顺序 样子 先查什么 判定依据 改法
1 点了没反应 编译是否通过 编辑区下方有没有提示,输出清单是不是空的 先按提示定位语法,提示原文对照见报错排查那组条目
2 有结果但一片空 有没有冒号输出 输出清单里有没有条目 把要看的量从中间量改成冒号输出,画图语句不算输出
3 有结果但一片空 数据补齐没有 该周期该品种的行情在不在 T0002 下,判空表达式是否成立 在盘后数据下载里补对应周期,补完重跑,不动公式
4 有结果但一片空 周期是否匹配 测试区间内该周期的序列是否为空 换到数据存在的周期,或按本机函数列表写跨周期引用
5 有结果但一片空 市场与范围 圈定的范围里有没有含被测品种 把范围改到含该品种的市场,并确认该市场已下载
6 结果异常或为空 参数取值 参数框是否留空,填的值是否落在上下限之间 填回定义域内的值,缺省值按参数表补齐
7 与图上不一致 测的是哪个入口 两个入口各跑一次,看读的对象是否相同 分开记录:主图看数值,选股看条件成立情况

表里第 2 到第 5 行的先后可以按本机情况换,这几行都不需要改公式,只需要看清单、补数据、改设置。走完这张表,通达信公式测试不了这件事就不再是一句模糊的话,而是几项能逐条确认的设置。

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

站内还有 通达信指标回测与风险验证 的条目,通达信报错排查 里讲提示原文与格式类隐形问题,通达信新手入门问答 里讲本地数据与公式管理器的基本操作,可对照查看。

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