把一段日线上跑得正常的公式挂到分时图上,输出会变成一条直线,或者什么都不画,原因不在语法,在取数口径。写通达信分时图指标公式要过的第一道关就是这个:分时周期下每根 K 线是一分钟,一天的样本只有 240 根,同样的 `CLOSE` 和 `VOL` 读到的对象和日线不是一回事。下面讲取数方式、可运行的写法、挂载位置与排查顺序。
一、现象直击:同一段公式换到分时图就不对
同一段公式挂在日线主图上输出平滑,切成 1 分钟周期之后,本来缓慢变化的线变得尖锐,本来一天变一次的值在一天里变了 240 次。这不是公式坏了,是它引用的序列换了长度与单位。分时图归属「分钟周期」一类,1 分钟、5 分钟、15 分钟都算分钟线,差别是每根 K 线覆盖的时间长度。判断方法是把公式分别挂在日线和 1 分钟周期上各看一次输出的量级:量级一致说明字段与周期无关,量级差一个数量级说明引用了随周期变化的字段。
二、一个交易日只有 240 根 1 分钟数据
A 股一个交易日的连续竞价时段合计 4 小时,也就是 240 分钟。按 1 分钟周期切分,一天生成 240 根 K 线;换成 5 分钟是 48 根,换成 15 分钟是 16 根;日线周期上一天是 1 根。公式里写 REF(CLOSE,1),日线上取的是上一交易日的收盘价,1 分钟周期上取的是前一分钟的收盘价;写 REF(CLOSE,240),在 1 分钟周期上取到的才是上一个交易日的同一分钟位置,前提是这两天都没有停牌、都没有缺分钟数据。
| 周期 | 一个交易日的 K 线根数 | 240 根分钟线对应的时间跨度 |
|---|---|---|
| 1 分钟 | 240 | 约一个交易日 |
| 5 分钟 | 48 | 约五个交易日 |
| 15 分钟 | 16 | 约十五个交易日 |
| 日线 | 1 | 240 个交易日 |
三、CLOSE 与 VOL 在分时周期下的含义
字段名相同,读到的对象不同,这是分时取数最容易出错的一处。日线上 OPEN、HIGH、LOW、CLOSE 是一整天的四个价位,VOL 是一整天的成交量;切到 1 分钟周期,这四个价位变成那一分钟内的四个价位,VOL 变成那一分钟的成交量。由此推出两件事。分时周期上的 CLOSE 就是该分钟的收盘价;把一天 240 根分钟成交量相加,得到的就是当天的日成交量,可以拿它和日线周期上的 VOL 对一下。部分字段在分钟周期下的返回口径与日线不完全一致,例如与复权、与昨日结算价相关的字段,判断方法是把该字段在两种周期上各输出一次。
四、跨日累计算的坑:SUM(VOL,10) 是 10 根不是 10 天
通达信分时图指标公式里最容易埋雷的是一类跨日累加写法。SUM、MA、HHV、LLV、REF、COUNT 这些函数,第二个参数数的是「K 线根数」,不是天数。周期换了,同一个数字覆盖的时间跨度就换了。看 SUM(VOL,10):日线上是最近 10 个交易日的成交量合计,1 分钟周期上变成最近 10 根分钟线的合计数。
{同一段写法在两种周期下的覆盖范围}
SUM(VOL,10) 日线 : 最近 10 个交易日的成交量合计
SUM(VOL,10) 1分钟 : 最近 10 根分钟线的成交量合计,约 10 分钟
MA(CLOSE,5) 日线 : 最近 5 个交易日收盘价的均值
MA(CLOSE,5) 1分钟 : 最近 5 根分钟线收盘价的均值
REF(CLOSE,1) 1分钟 : 前一分钟的收盘价
SUM(VOL,10) 要让分时公式表达「最近 N 天的量」,得把参数乘上一天的根数:1 分钟周期上要覆盖 10 个交易日,参数写 2400,而不是 10。
乘 240 这个做法有两个前提:本地分钟数据不足 2400 根时公式开头那段算不出值;这两天都没有停牌、没有缺分钟记录,否则乘出来的跨度对不齐。另一种做法是用跨周期引用函数在分钟周期里取日线数据,格式以公式管理器提示为准。
五、分时均价线与量比的写法
均价线的含义是当天的累计成交额除以当天的累计成交量,写成公式就是两个累计量的比值。
{分时均价线 AVGPRICE 类写法,适用周期:1 分钟 / 分时}
AMOUNT_SUM := SUM(AMOUNT, 0);
VOL_SUM := SUM(VOL, 0);
AVGPRICE : IF(VOL_SUM > 0, AMOUNT_SUM / VOL_SUM, DRAWNULL);
{1. 第二个参数写 0,表示从当日第一根分钟线累加到当前}
{2. 累加窗口随新的分钟线自动推进,不用改成 240}
{3. 分母做零判断,避免开盘第一根之前除零}
这段有两处口径值得记住。SUM 的第二个参数写 0 表示从序列起点累加到当前,得到当天的累计值;写固定数字则是固定根数窗口。分母的零判断不能省。
{分时量比写法,分母按当前分钟位置逐根对齐,适用周期:1 分钟 / 分时}
SPAN := 240;
VMA5 := MA(VOL, SPAN * 5);
BASE := VMA5 * (BARSCOUNT(CLOSE) + 1) / SPAN;
LB : IF(BASE > 0, VOL / BASE, DRAWNULL);
{1. 分母按「已走过的分钟根数 / 一天的根数」折算}
{2. BARSCOUNT 取当日已生成的分钟根数}
量比的分子是当前这一分钟的成交量,分母是过去若干天同一分钟成交量的平均值。分母的构造方式决定了这个值的量级,换了折算方法,读到的数字就换了基准。分时数据的分母依赖过去若干个交易日的分钟记录,本地数据不够时取不到。
六、挂载位置:分时主图与分时副图怎么选
挂载位置由公式管理器里的「公式类型」决定,主图叠加与副图是两类不同的归属,选错了就出现「公式存在但图上没有」的情况。主图的坐标轴跟着价格走;副图的坐标轴独立,输出可以是比值或成交量。
{挂载位置与公式类型的对应}
主图叠加 -> 输出与 K 线共用坐标,例如均价线
副图 -> 输出在 K 线下方的独立区域,例如量比
挂载操作:打开分时图,在图上右键选择主图指标或副图指标,在列表里选中公式名
七、分时上画不出来时的排查顺序
公式不显示时按下面的顺序逐项检查:先查公式类型,看它选的是技术指标还是条件选股;再查输出方式,看输出名后面是冒号还是等号,冒号画出线,等号只在内部计算;再查周期匹配,分时公式要挂在分时周期上;最后查数据完整性与除零判断。
| 现象 | 对应含义 | 处理 |
|---|---|---|
| 公式管理器里有公式,主副图列表里找不到 | 公式类型选错,导进了另一类别 | 改公式类型,或在对应类别下重新建立 |
| 挂上去只有一条水平线 | 输出为常数,或分母为零后取到固定值 | 检查累加窗口与分母的零判断 |
| 线从中间某一根才开始画 | 本地分钟数据起点在那一根之后,或窗口根数不足 | 先补分钟数据,或把窗口参数改小 |
| 日线上正常,分时上量级差很远 | 参数按「根数」计,未做跨日折算 | 把参数乘上一天的根数,或改用跨周期引用 |
| 整条线完全不显示 | 公式未挂载,或输出为条件不画线 | 确认挂载位置与输出符号,改挂副图再看 |
八、T0002 目录与公式管理器的入口
公式文件落在 T0002 子目录里,备份在 T0002\gs_bak,导入导出用 tn6 后缀。入口在公式管理器,客户端主界面上按 Ctrl+F 可以直接调出;导入时选「导入」再选中 tn6 文件并指定公式类别;新建时选「新建」,填名称、选类型、写公式体,保存后点「测试公式」检查语法,通过之后挂图查看。
{分时公式从建到看的路径}
1. 打开客户端,Ctrl+F 调出公式管理器
2. 新建或导入,指定公式类别
3. 公式类型按用途选:主图叠加 / 副图 / 条件选股
4. 点「测试公式」检查语法与函数名
5. 打开分时图,右键选择主图指标或副图指标
公式文件位置:
T0002 用户公式与板块数据
T0002\gs_bak 公式备份
*.tn6 导出与导入的公式包
回到开头那个现象:公式换到分时图不对,根源是「根数」与「天」两个单位混用。把每个参数按一天的根数折算一遍,把跨日累加换成大窗口或跨周期引用,把公式类型与挂载位置对上,通达信分时图指标公式在分时周期上的输出就能稳定下来。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 通达信主图副图指标 的条目,通达信指标原理与参数 里讲参数口径与周期换算,通达信公式编写 里讲语法与函数写法,可对照查看。
