通达信里的自编公式,多数要从同一组数据出发:开盘、最高、最低、收盘、成交量、成交额。通达信行情函数用法讲的就是这六个序列怎么取、取出来是什么,以及在不同图表周期下取到的值有什么不同。写法本身只有一行,出问题的地方都在「取到的是什么」这一层。
下面按数据的来源顺序讲,最后给一个可以逐点核对的验证办法。全文只讲取值机制与核对方式,不涉及任何品种的判断,也不给操作结论。文中函数名以通达信金融终端为参照,函数列表可在公式编辑器内查询。
一、六个基础序列
这六个序列在公式里直接用名称调用,不需要参数,取的都是当前这一根的时间点上的值。当前这一根在盘中是未走完的那一根,在收盘后是当天的那一根。这个区别在盘中看图和盘后复盘时会显出不同的结果。
{ 六个基础序列的标准写法 }
K1:OPEN; { 开盘 }
K2:HIGH; { 最高 }
K3:LOW; { 最低 }
K4:CLOSE; { 收盘 }
K5:VOL; { 成交量 }
K6:AMOUNT; { 成交额 }
{ 每一行都输出当前这一根的值 }
把它们直接输出到图上,能看到输出与 K 线的位置关系:开盘、最高、最低、收盘四条线在日线图上与 K 线的四个端点重合。这个重合本身就是一次验证——不重合说明取到的不是这一段数据。
放到不同周期上再看一遍,四个端点的含义会变。日线上一根 K 线对应一个交易日,分钟线上一根对应一分钟;同样写 CLOSE,在两种周期下取到的是两个不同时点的价格。这一点决定了一件事:把一段写法从日线搬到分钟线,公式不需要改,但输出所描述的对象已经换了。核对时先确认当前图表的周期,再看输出。
二、取当根还是取前面若干根
六个基础序列只能取到当根。要看前面某几根的值,要套一层引用函数,写法是在函数名后给一个根数。给 1 表示前一根,给 0 表示当根,给负数表示从当前往后数。
{ 引用前面若干根的值 }
Q1:REF(CLOSE,1); { 前一根的收盘 }
Q2:REF(CLOSE,5); { 五根前的收盘 }
Q3:REF(VOL,1); { 前一根的成交量 }
{ 对照:直接用 CLOSE 是当根 }
引用函数有一个容易踩到的边界:图上最左边若干根没有足够的更早数据,引用会取不到值,输出为空。这类空值在图上是断线,在计算里参与运算会让整段结果失效。判断办法是把输出直接画出来看断点位置,断点的根数与引用根数一致,就属于这个边界,不是写法错误。
引用函数也可以在同一行里用多次,把若干个位置的值放在一起比较。需要比较两个时点时,把引用直接写进条件里,比先算出一列再回头引用要清楚。通达信行情函数用法里需要记住的只有一件事:引用给的是根数,根数与时间长度之间的关系由当前周期决定。
周期切换会改变「根」的含义。同一段写法在日线上引用的是前一个交易日,在十五分钟线上引用的是前十五分钟。周期参数写死了根数,换周期之后取到的时间跨度就跟着变,这一点在后面第四条还会再遇到一次。
三、分钟线与复权带来的差别
用通达信行情函数用法时最容易忽略的是周期与复权两件事,它们不改变写法,但改变含义。周期决定一根代表多长时间;复权决定这根 K 线记录的价格是原始价格还是经过处理的连续价格。
| 情形 | 取到的值 | 核对位置 |
|---|---|---|
| 日线,不复权 | 当日实际成交价格 | 行情列表中的当日价格 |
| 日线,前复权 | 按除权因素调整后的价格 | 复权设置项,图表右上角标识 |
| 分钟线 | 该分钟内最后一笔的价格 | 分时图与分钟图对照 |
| 指数 | 指数点位,不是价格 | 指数与个股分别取数时的差异 |
复权的影响在除权日前后显现。同一根 K 线在复权与不复权下是两个不同的收盘值,而公式里的均线、涨跌幅这类由收盘价算出来的量会跟着变。用不复权的数据去套在复权图上验证过的公式,两边的结果对不上,原因不在公式。
复权设置一般在图表右键菜单或系统设置里,选中之后历史价格会整体重算一次。切换前后各看一根已知的 K 线,就能看出这一次调整影响了哪些位置。这一步做过一次,后面看到输出与预期不符时,会先想到去核对复权,而不是先改公式。
这一节讲的三件事——周期、复权、单位——都不改变公式的写法,只改变输出的含义。把三者分别确认一遍,再去看输出是否符合预期,排查的方向就固定下来了,不必在几个可能的原因之间来回换。这也是这段写法能被复用到不同品种上的前提:数据来源与取值范围都明确了,换一个品种只需要换数据,不需要换思路。
把这三项记在一处,比分散记在几个地方要省事。取数的口径、复权的设置、单位的定义写在同一份笔记里,下次换品种或者换周期时,逐项对照一遍即可。
四、成交量与成交额不能互替
成交量与成交额是两个不同的量。成交量是按手数统计的,成交额是按金额统计的,两者相差一个价格因子。在不同价格的品种之间横向比较,用成交量得出的大小关系与用成交额得出的可能相反,因为高价股的每一手代表的金额更大。
指数上的这两项也有各自的口径。指数本身不成交,它的成交量与成交额来自成分品种的汇总,因此把个股公式里以成交量为分母的计算直接套到指数上,分母的含义已经变了。这类写法不会报错,但输出的数值不具备个股语境下的可比性。
需要把两个量换算时,除了价格之外还要注意最小变动单位与手数的定义。换算本身可行,前提是把单位写在公式的注释里,隔一段时间回看能知道当初用的是什么口径。
两个量放在一起用,还有一个单位问题值得单独记一笔。成交量的显示单位是手,成交额的单位是元,两者相差两个量级。图上直接用两条线表示,量级小的那条会被压在底部,看起来像一条直线。这不是数据错了,是两条线不该放在同一个纵坐标里。
五、核对一段输出
验证通达信行情函数用法是否正确,不需要整段核对。挑一根日期已知的 K 线,把公式里最重要的那一条输出手算一遍,与前一步对照即可。手算需要的中间量,可以在源码里临时加输出逐层打印。
{ 逐层打印,用于手算核对 }
B1:=CLOSE; { 当根收盘 }
B2:=REF(CLOSE,1); { 前一根收盘 }
B3:=B1-B2; { 两者之差 }
X:B3; { 图上显示的 X 应与手算一致 }
对得上说明取值链条接对了,接下来如果结果仍然不对,排查方向就落到了参数与周期上,而不是数据本身。指标原理与参数优化 一栏讲参数改变对计算的影响,主图副图指标 一栏讲输出挂在哪张图上,两处接在这一步之后看。
文中函数名与菜单路径以通达信金融终端为参照,函数列表与参数说明可在公式编辑器的函数查询中核对;不同版本与券商定制版的支持范围可能存在差异,请以你所用版本的「帮助 → 关于」与编辑器内的函数说明为准。
