开盘前的那段撮合只产生一个成交价与一个撮合量,落在当日 K 线的开盘价位置上。把这段数据写进通达信集合竞价公式,难点从来不在函数怎么拼,而在你取的是哪个时点、哪个价:是当日开盘那个竞价价,还是竞价时段那个量。两者的取值入口不同,写出来的公式也不通用。

下面按「数据形态、三种取价口径、当日数据依赖、适用边界、验证办法、下一步动作」六步展开。文中出现的函数名与字段名,以本机公式编辑器内附的函数列表与数据字段列表为准。

一、集合竞价的数据长什么样

开盘前的撮合过程不逐笔生成 K 线,它收敛成一个结果:一个成交价,一个撮合量。这个成交价被写进当日 K 线的开盘价位置,也就是 O 或 OPEN 所指向的那个值。撮合量则挂在竞价时段的分时数据上,不占用日线成交量字段里那个整日累计的数值。

写公式之前先答一个问题:你要读的是价还是量。这两件事的数据来源不同,能成立的周期也不同。价可以从日线序列里直接取,量要看分时或该时段的数据字段,两者的前置条件不一样。

把通达信集合竞价公式拆开看,它的结构只有两截:一截是取数,一截是判定。取数决定公式读到的是哪一个时点的对象,判定决定没数据时公式输出什么。写法上出问题的地方,落在取数那一截的次数比落在判定那一截多。

还有一个容易混进来的对象是昨日结算价与昨日收盘价。它们都不是竞价撮合的结果,一个是交易所结算用的参考价,一个是前一日最后一笔的成交价。把它们当成竞价价使用,得到的是另一套口径。

还有一层容易被忽略:这段撮合发生在当日开盘之前,所以它对应的值在当日开盘之后才有内容。当日行情还没生成时去读它,读到的是空值,不是零。

二、三种取价口径

通达信集合竞价公式的取价方式可以归到三类,各自读的对象不同。先看清三者分别读的是什么,再决定用哪一条。

当日开盘取价

入口是 O,也就是当日开盘价。它的写法最短,取值也直接:当日 K 线的第一个价就是竞价撮合出来的那个价。要留意的是「当日」两个字:O 读的是当日开盘价,当日尚未开盘时这个值没有意义,盘中与盘后才成立。把含 O 的条件写进条件选股时,运行时段会影响结果:在开盘之前跑,当日 K 线还没生成,取到的是空。

分时首笔

分时序列的第一笔反映开盘瞬时的那一笔成交。它与 O 在多数位置上取到的是同一个数,但在有集合竞价撮合的品种上要看数据源怎么落地:有的数据源把竞价撮合单独记成一个开盘量,有的把它并进第一笔分时。判断办法是把分时首笔与 O 各输出一次,逐根对照,看两者在同一根上是否相等。分时数据的取法在 1 分钟与分时周期下并不共享同一套入口,具体以本机公式编辑器的数据字段列表为准。

竞价量能

撮合量与 K 线成交量字段里的那个量不是同一个数。日线的成交量字段是整日累计,竞价撮合只占当日开盘前那一个时段,两者的统计范围不同。要统计竞价量,得取该时段对应的成交量字段,字段名在各版本里未必统一,以本机公式编辑器的数据字段列表为准。取不到该字段时,能拿到的是整日成交量,两者不能互相代替。

三、前置数据依赖:读出来是空值

O 与分时数据都属于当日数据。当日数据没有下载、或者当日行情还没生成时,读出来是空值。空值参与四则运算会一路传下去,最后输出一条不画线的结果,看起来像公式写错了,其实是数据没到位。

所以取价之前先做一次非空判定。下面的片段取当日开盘价,判它是否为空,再输出一条竞价价线。

{ 当日开盘价取值、非空判定与输出 }
O0 := O;
HASO := NOT(ISNULL(O0));
KJJ : IF(HASO, O0, DRAWNULL);
{ 1. O 读的是当日开盘价,当日尚未开盘时为空 }
{ 2. ISNULL 判空,NOT 取反得到非空标记 }
{ 3. 为空时输出 DRAWNULL,图上不画线 }
{ 4. ISNULL / NOT / DRAWNULL 的写法以本机函数列表为准 }

这段的骨架同样适用于竞价量能:把 O0 换成该时段的成交量字段,非空判定的写法不变。判定本身不产生交易含义,它只回答「这一根有没有数据」。

另有一种不查空值直接判断的写法,用 DYNAINFO 系列取当日动态数据。这类函数取的是运行时刻的即时值,能否在历史序列上逐根回溯,各版本表现不同,写法以本机函数列表为准。要做逐根核对,用 O 这条路径更直接。

四、三种口径的适用边界

口径 读的对象 适用 不适用
当日开盘价 O 当日 K 线的开盘价 当日盘中与盘后,取当根的开盘位置 跨日比较时不能把它当成前一日或此后某一日的竞价价
分时首笔 当日第一笔分时成交 需要看开盘瞬时那一笔的位置 数据源把竞价撮合单独记成一个开盘量时,首笔与开盘价要分开确认
竞价量能 竞价时段的成交量字段 统计竞价这一段匹配出来的量 与整日成交量不同量纲,两数相除得不到任何占比

三行里最需要守住的是第一行与第三行。当日开盘价带的是「当日」这个限定,拿它去与前一日的竞价价相比,比的是两个不同时点的值,先要说明你比的是什么。竞价量能带的是「时段」这个限定,与整日成交量放在一个式子里相除,量纲对不上,结果没有含义。

分时首笔那一行的边界落在数据源上。同一台机器上换了数据源,首笔的落地方式可能就变了,核对办法仍然是把它与 O 逐根对齐看是否一致。

五、验证方法:把竞价价输出成一条线

验证的做法是把竞价价用 : 输出成一条线,挂到主图或副图上,与 K 线的开盘位置逐个核对。用冒号输出会进入输出清单,画在图上;用等号只在公式内部计算,图上不出现。

挂到主图之后,这条线的每一个点应当与对应 K 线的开盘位置落在同一水平上。发现某一段偏离,按顺序查三处:该段是否停牌或无数据、当日数据是否补齐、取的是当日开盘价还是分时首笔。竞价量能的核对同理,把它与分时图开盘那一笔对照,量级对不上时先确认字段取的是哪个时段。

核对时不必逐根看完整段,挑几处跳空与连续横盘的位置即可。跳空的位置上开盘价与前一收盘的距离拉开,画出来的线是否还贴着 K 线开盘位置,一眼能看出来。横盘的位置上则能看出这条线有没有被非空判定误伤。

输出方式决定线是否可见:: 进输出清单并画线,:= 只做中间量。挂载位置决定坐标轴归属,这一点在站内主图副图一栏里有对照说明。

六、下一步动作

按本机版本先把两件事确认下来:一是 O 的取法,二是分时数据的取法,包括它在哪个周期下可用、字段名怎么叫。两处都以外接的函数列表与数据字段列表为准,不要照着别人的截图照抄函数名。

确认之后,先把「当日开盘价非空」这条判定单独跑一遍,不要急着把它与其它条件拼在一起。跑的目标只有一个:在当日数据没下载的情况下,公式不报错,只输出空值、图上不画线。这一点成立,说明取值路径是通的,后面再加条件不会把数据问题误当成写法问题。

这条判定稳定之后,再看竞价量能那一侧。把 O 换成该时段的成交量字段,非空判定的骨架不动,先单跑一遍看它有没有值。两处都通了,再把它们放进同一段通达信集合竞价公式里。

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

站内还有 通达信新手入门问答 的条目,通达信主图副图指标 里讲输出线与挂载位置,通达信公式编写 里讲语法与函数写法,可对照查看。

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