为什么同一个突破条件,写在日线图上很安静,换到分时图上就到处都是信号?通达信分时突破公式遇到的这类问题,原因不在条件写错了,而在判据跟着周期一起变了。窗口长度、均价线的算法、当前这根是否定型,三件事在分时级别上的表现与日线不同。
下面按窗口含义、均价线算法、未定型的一根、判定用哪一侧价格以及减少误判的动作五层讲。文中函数名与字段单位为通达信客户端的通用描述,不同版本与券商定制版对分钟数据的长度、字段单位与函数参数存在差别,请以你所用客户端的帮助文档为准。
一、窗口长度换了周期就换了含义
通达信分时突破公式里写的窗口长度是一根根计数的,不是按时间计的。日线上写 20,覆盖的是 20 个交易日;把同一段算式放到 1 分钟周期上,覆盖的是 20 分钟。两个窗口覆盖的时间跨度差了两个量级,判据却没变,信号自然会长得不一样。
| 周期 | 窗口 20 覆盖的时间 | 窗口内包含的信息 |
|---|---|---|
| 日线 | 约 20 个交易日 | 一段中期走势的高低点 |
| 5 分钟 | 约 100 分钟 | 当日盘中一段的波动区间 |
| 1 分钟 | 20 分钟 | 很短的一段价格摆动 |
要让通达信分时突破公式的条件语义保住,窗口长度需要按时间跨度折算。想在分时上描述「相当于日线 20 天」的范围,就得先算出一天有多少根分钟 K 线,再按这个倍数放大窗口。折算系数与交易时段长度有关,写进公式时留一个显式的常量,方便日后调整。
二、分时均价线不是均线
分时图上那条平滑的参考线来自累计成交额与累计成交量的比值,是当日的加权平均成本;均线是收盘价的算术平均。两者的计算依据完全不同,把均线公式套在分时图上得到的曲线与图上那条参考线不是同一条。
{ 当日加权均价的计算结构 }
{ 分子是当日累计成交额,分母是当日累计成交量 }
累计额:=SUM(AMOUNT, 0);
累计量:=SUM(VOL, 0);
{ 两个字段的单位不一致,需要按字段说明换算后再相除 }
均价:=IF(累计量=0, C, 累计额/累计量/100);
最后一行里的换算系数是这一处最容易出错的地方。成交量的常用单位是手,成交额的常用单位是元,两者相除之前要统一,否则均价会比实际值大出两个数量级,任何以它为基准的比较都会失效。系数取值请以你所用客户端的字段说明为准,核对办法是把算出来的均价与图上那条线对照,偏差应当是量级上的差别而不是几个点。
除了均价线之外,分时图上还有几处参考信息容易被误当成公式算出来的结果:昨收、今开、当日最高最低,这些由客户端直接给出,不需要在公式里重新计算。判断一条曲线是自算的还是自带的,办法是看公式的输出列表里有没有它。列表里没有,说明它来自客户端,改公式不会改变它的位置。
三、盘中最后一根没有定型
行情进行中,最后一根分钟 K 线只包含已经成交的那部分数据,最高、最低、收盘都还在变。公式在每一笔新成交上重算一次,最后一根的取值就跟着变,条件在最后一根上的成立与否会反复切换。
这解释了盘中看到的信号闪动:它不是公式在乱跳,而是判据作用在一根还没有走完的 K 线上。要让信号稳定,判定要么只作用于已经走完的那些根,要么把最后一根的最低价与收盘价换成更保守的取值。
未走完的根还会影响条件内部的前后比较。判断「当前价高于前一根的最高价」时,前一根已经定型而当前根未定型,比较的两侧一静一动,含义还算清楚;如果把条件写成「当前根与前三根的平均值比较」,那三根里包含了上一根,而上一根在盘中同样未定型,比较的两侧就都在动。核对条件之前,先把涉及的每一根属于定型还是未定型逐个列出来。
{ 只对已走完的根做判定 }
已走完:=REF(条件, 1);
{ 用 REF 把条件后移一根,盘中不再随最新价跳动 }
{ 代价是信号出现的时间晚一根 }
四、突破用最高价判还是用收盘价判
用最高价判,条件在盘中触碰的瞬间就成立;用收盘价判,要等这一根走完才确认。前者的信号更早,同时把盘中瞬间冲高又回落的情形也算成了突破;后者的信号滞后,漏掉那些当天冲高后回落到区间内的情形。
{ 把上沿定义成前若干根的最高值,避开当前这根 }
上沿:=REF(HHV(H,20), 1);
{ 触碰式:只要最高价越过上沿就成立 }
触碰式:=H>上沿;
{ 确认式:以收盘价是否落在上沿之上为准 }
确认式:=C>上沿;
{ 两者成立的时间与数量都不同,选一种固定下来 }
两种方式没有优劣,选哪一种取决于你要记录的是「曾经到达」还是「收在之上」。写进记录时要标明用的是哪一种,否则同一段行情在两个不同口径下会得出相反的数量。
还有一种折中的写法可以两者兼顾:用收盘价确认方向,用最高价记录是否曾经触及。两段条件分别输出,一段用于判定,一段用于标注。这样既不会因为盘中瞬间冲高而反复产生信号,也不会丢掉「曾经触及但收回」这一类信息。
五、分时与日线各自维护一套参数
把日线的参数直接搬到分时上,或者反过来把分时的参数搬回日线,两种做法都会让判据失真。可行的安排是两套参数各自维护一份,并在文件命名上用周期做后缀区分,例如同一条公式在日线上叫一个名字、在分钟周期上叫另一个名字。这样挂载时不容易拿错版本。
两套参数之间可以建立换算关系,但换算不是等比例缩放。分钟周期里一天有多少根 K 线,取决于交易时段的长度,而这个数量在不同品种与不同交易制度下并不一样。把换算系数写成显式常量而不是直接算进窗口长度,换品种时只需要改这一处。
记录时把周期写在最前面,再写窗口长度。只写「窗口 20」无法判断指的是 20 天还是 20 分钟,而这两个口径下得到的结果完全不同,前一份记录与后一份记录放在一起看会得出相互矛盾的结论。
六、减少误判的三个动作
把通达信分时突破公式调到可用状态,可以按这三个动作推进。第一步,把窗口长度按周期折算成显式常量,不再沿用日线的数值。第二步,把均价线换成按累计额与累计量算的那种,并核对换算是量级差异还是数值差异。第三步,把判定分成已走完与未走完两段,分别输出,观察一段时间之后再决定哪一段作为记录依据。
三步做完之后,再把信号的分布按时间段落统计一遍,看通达信分时突破公式的输出是否均衡。如果信号集中在开盘后的一段,说明判据对开盘的波动幅度敏感,需要给窗口加一个时间过滤;如果信号在尾盘集中,情况类似,方向相反。区间的切法与记录字段,见 复盘方法与数据工具 一栏;形态与信号的口径写法,见 量价形态与信号拆解 一栏。
文中函数名与字段单位为通达信客户端的通用描述;不同版本与券商定制版对分钟数据的可用长度、成交量与成交额的单位、函数参数与除零处理存在差异,具体请以你所用客户端的帮助文档与实际输出为准。本文只讨论公式写法与计算口径,不构成任何投资建议。
