写通达信公式取多日数据时最常出现的错位,是把窗口参数当成自然日。窗口数的是根数,一根 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. 用窗口等于 1 的特殊值验证。极值类应回退到当前根本身,REF 类应回退到上一根。
  2. 取图上最后一根,手工按定义算一次,与副图读数对照。
  3. 把窗口从 5 改到 20,观察结果方向是否与定义一致;计数类结果不应超过窗口长度。
  4. 把图表拉到最左边,确认数据不足的头部是按预期留空,而不是画出一条错误的线。

验证时把用到的窗口参数写成参数,比每次手动改数字省事,也便于把不同取值下的结果并排对照。参数档位建议取成常用的几个长度,例如 5、10、20、60,改动时一次到位。

通达信公式取多日数据这件事,最终落在一句话上:窗口数根不数日,取值之前先确认数的是哪一段。函数按类别整理的对照表,见 通达信公式编写教程 一栏;把取出来的数据用到观察指标上时的口径问题,见 指标原理与参数 一栏;用这些取值做区间记录的方式,见 复盘方法与数据工具 一栏。

文中函数名、参数顺序与无效值规则按通达信 PC 版公式系统的常见形态描述;不同版本与券商定制版在窗口上限、无效值返回方式上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式取数机制,不构成任何投资建议。

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