写通达信公式取多日数据时最常出现的错位,是把窗口参数当成自然日。窗口数的是根数,一根 K 线算一根,遇上停牌或长假,二十根窗口覆盖的日历跨度会比二十天长。看清这一点,REF、HHV、LLV、COUNT 这几个函数的返回值才好解释。
下面按窗口的定义、四类取数函数的分工、窗口起点不足时的表现、组合写法、周期折算、三处常见错位与验证顺序展开。文中函数写法以通达信 PC 版的公式系统为准,不同版本与券商定制版在无效值处理上存在差异,请以你所用客户端帮助文档为准。
一、窗口是从当前根向前数的
所有带窗口参数的函数都遵循同一个约定:窗口以当前正在计算的那根 K 线为终点,向前数到第 N 根为止,当前根本身算在内。所以 HHV(HIGH,20) 参与比较的是含当前根在内的二十根,而不是当前根之前的二十根。
这个约定有一个容易验证的推论:把窗口设成 1,HHV(HIGH,1) 等于当前根的最高价,而 REF(CLOSE,1) 等于上一根的收盘价。两个「1」含义不同,一个是窗口长度,一个是向前的偏移根数,写的时候不要混用。
再往下一层看,REF(CLOSE,0) 就是当前根的收盘价,与直接写 CLOSE 等价。把偏移量做成参数时,允许的取值下限是 0,这一点在参数表里可以限制。
二、四类函数各取什么
通达信公式取多日数据的取值需求可以归成四类,对应的函数分工清晰。
| 取数需求 | 函数 | 返回值 |
|---|---|---|
| 某一根的具体取值 | REF(X,N) |
当前根向前第 N 根上的 X |
| 窗口内的极值 | HHV(X,N) / LLV(X,N) |
窗口内 X 的最大值 / 最小值 |
| 窗口内满足条件的根数 | COUNT(条件,N) |
一个整数,取值不大于 N |
| 窗口内的数值合计或均值 | SUM(X,N) / MA(X,N) |
窗口内 X 的合计 / 算术平均 |
第二类与第三类的差别值得单独确认。HHV 返回的是价格,COUNT 返回的是根数,两者的输出量纲不同。写成 COUNT(HIGH,20) 没有意义,因为 HIGH 是价格序列而不是判断条件,需要改写成 COUNT(HIGH=HHV(HIGH,20),20) 这类逐根只有真假的表达式。
还有一处细节:价格类的极值取的是最高价与最低价序列,量能类的极值取的是成交量序列,两者不能混用。HHV(VOL,20) 给出的是窗口内最大成交量,和 HHV(HIGH,20) 是两个不同的量。若要把量能放到价格坐标系里对照,需要先做归一化,否则两条线的刻度无法互相解释。
三、窗口起点不足时会发生什么
图表最左边的若干根上,向前数不满 N 根。此时函数不会自动缩短窗口,而是按各自规则给出结果:均线与合计类在数据不足时返回无效值,图上表现为断点;极值类会把已有的几根都算进去;REF 取到窗口外时同样给出无效值。
这类现象在新股、长期停牌复牌的品种上会集中出现。判断方法很直接:把图表横向拉到最左边,看指标线的起点在哪一根。若线从第一根就开始画,说明这段算式没有正确处理数据不足的情形;若前面有一段空白再开始,那是正常取值。
MAX(窗口极差,0.0001) 的形式,避免除零把整段线变成无效。这不是精度问题,而是结果存在与否的问题。四、组合写法
实际需求很少只要一个数字,多是几个窗口的组合。写通达信公式取多日数据时,把中间结果逐个命名,比把几层嵌套压在一行里更容易排查。下面这段可以当作模板改。
{ 单点:上一根与更早一根的收盘价 }
昨收:=REF(CLOSE,1);
前收:=REF(CLOSE,2);
{ 极值:近 20 根的高低点 }
近20高:=HHV(HIGH,20);
近20低:=LLV(LOW,20);
{ 计数:近 20 根里收盘上行的根数 }
上行根数:=COUNT(CLOSE-REF(CLOSE,1)>0,20);
{ 合计与均值:近 20 根的量能 }
量合计:=SUM(VOL,20);
量均值:=MA(VOL,20);
{ 组合:当前价在近 20 根区间中的相对位置 }
区间差:=MAX(近20高-近20低,0.0001);
区间位置:=(CLOSE-近20低)/区间差;
写这类组合时,变量按用途命名,不要把多个中间结果压进同一个名字。窗口参数能提成公式参数就提出来,用参数表统一管理,将来调档不用逐行改数。
五、窗口长度与周期的关系
同一段算式挂在不同周期上,二十根窗口覆盖的时间跨度会一起变。日线上的二十根大致对应一个月,周线上的二十根对应二十周。这不是公式的问题,而是窗口按根计数带来的直接结果。
所以跨周期对照时,比较的应该是相同根数下的结果,而不是相同日历跨度。要让两段算式在时间上可比,需要把窗口参数按周期折算,或者改用跨周期取值的方式。折算之后的结果与原生周期上算出来的并不完全一致,原因是每个周期的开高低收来自不同的采样口径,这一点在跨周期对照时要一并说明。
六、三处容易出现的错位
- 把窗口当成「不含当前根」。写成
HHV(HIGH,20)却按前二十根去理解,结果总会差一根。验证方法是把窗口设为 1,看返回值是否等于当前根的取值。 - 把 COUNT 的条件写成序列。COUNT 的第一个参数需要逐根只有真假的表达式,传入价格序列会得到无意义的结果。
- 把窗口参数写成会被覆盖的变量。同一根 K 线上窗口长度不能再变,写成变量后若该变量在同一根内被重新赋值,整段结果会一起偏移。
七、验证顺序
取数类算式写完,按下面四步核对。
- 用窗口等于 1 的特殊值验证。极值类应回退到当前根本身,REF 类应回退到上一根。
- 取图上最后一根,手工按定义算一次,与副图读数对照。
- 把窗口从 5 改到 20,观察结果方向是否与定义一致;计数类结果不应超过窗口长度。
- 把图表拉到最左边,确认数据不足的头部是按预期留空,而不是画出一条错误的线。
验证时把用到的窗口参数写成参数,比每次手动改数字省事,也便于把不同取值下的结果并排对照。参数档位建议取成常用的几个长度,例如 5、10、20、60,改动时一次到位。
通达信公式取多日数据这件事,最终落在一句话上:窗口数根不数日,取值之前先确认数的是哪一段。函数按类别整理的对照表,见 通达信公式编写教程 一栏;把取出来的数据用到观察指标上时的口径问题,见 指标原理与参数 一栏;用这些取值做区间记录的方式,见 复盘方法与数据工具 一栏。
文中函数名、参数顺序与无效值规则按通达信 PC 版公式系统的常见形态描述;不同版本与券商定制版在窗口上限、无效值返回方式上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式取数机制,不构成任何投资建议。
