通达信波段指标公式的输出是一条在 0 到 100 之间来回摆动的线。数值贴在 100 附近,说明当前价格处在所选区间的上端;落到 0 附近,说明处在下端。它输出的不是价格,也不是价格的平均值,而是当前价在区间里占的位置。把这一点先分清,后面的区间取数、分母处理与参数取值才有落点。
下面按「与均线类的差别、区间取数、相对位置算法、分母为零的位置、参数影响、核对方法」六步讲。涉及的都是取值与计算,不涉及任何方向判断;文中写法以通达信公式编辑器内附的函数说明为准,不同版本对函数的支持范围存在差别。也可以先看 通达信指标原理与参数 一栏里其他量纲的对照写法。
一、波段位置与均线不在一个量纲上
均线类指标的输出是价格单位。把均线与 K 线画在同一个主图上,两条线之间的距离可以直接读出来,位置偏高还是偏低一眼能判断。波段位置类指标走的是另一条路:它先把「这段区间里的最高价与最低价」固定成上下两条边界,再把当前价换算成边界之间的一个比例。
{ 两类输出的量纲差别 }
均线类 —— 输出值与价格同单位,可与 K 线同图比较
位置类 —— 输出值是区间内的比例,与 K 线不同量纲
{ 位置类放在副图上读;要上主图得先换算回价格 }
量纲不同带来的第一个实际约束是叠加位置。位置值直接叠加到主图,会因为取值范围只有 0 到 100 而被压在主图底部的一条窄带里。要用在主图上,需要先把位置换算回价格:把位置百分比还原成区间内的价格,写出来就是「区间低 + 位置 / 100 ×(区间高 – 区间低)」。换算之后的上主图版本在形状上与 K 线一致,但它已经不再是位置值了。
第二个约束是比较对象。两条位置线可以互相比较,因为它们量纲相同;一条位置线与一条均线不能直接比较数值大小,只能比较各自的拐点位置。副图上同时挂位置线与均线时,读的是两条线的高低次序变化,而不是两条线的数值差。
二、区间取数:最高价与最低价怎么取
通达信波段指标公式的区间上下边界由取数函数决定。取最高价用 HHV,取最低价用 LLV,后面跟一个参数表示取多少根。这个参数就是区间长度,也是这类指标上需要单独调的参数。
{ 区间边界的取数 }
区间高 := HHV(HIGH, N);
区间低 := LLV(LOW, N);
{ N 为区间根数,取值时包含当根 }
取 HIGH 与 LOW 还是取 CLOSE,得到的结果不同。用最高价与最低价构造的区间更宽,凡是盘中冲高或下探过的位置都会计入;用收盘价构造的区间更窄,只反映每天收盘的位置。两者没有对错,区别在于你希望区间描述的是「价格走过的范围」还是「收盘所在的范围」。同一个公式里分子分母要用同一种口径,混用会让位置值越界。
区间根数不足时取不到完整窗口。上市不久、长期停牌或因数据未补充而 K 线根数不够的位置,HHV 与 LLV 会按已有数据计算,得到的区间比设定的 N 根窄。核对这类位置时,先把该品种的 K 线根数与自己的参数对上,再看位置值是否异常。
三、相对位置的计算口径
位置值的算法是一条除法:当前价减去区间低点,得到它离下边界的距离;再除以区间的总高度,换算成比例。
{ 相对位置的基本写法 }
位置 := (CLOSE - 区间低) / (区间高 - 区间低) * 100;
{ 分子分母共用同一组当根含内的区间边界 }
只要分子分母取自同一组把当根包含在内的边界,位置值就落在 0 到 100 之间。原因很直接:收盘价不会低于当根所在区间的最高价,也不会高于这个区间的最低价,因为这两个边界本身就是从同一段数据里取出来的极值。位置贴到 0 或 100,说明当根的收盘正好是这段区间的最低收盘或最高收盘。
把边界往前挪一根,性质就变了。写成「REF(HL, 1)」的形式之后,区间不含当根,收盘价可以超出这个区间,位置值随之越界。这不是缺陷,而是一种可用的写法:位置超过 100 说明当前收盘高于此前 N 根的最高价,低于 0 说明低于此前 N 根的最低价,越界本身就把「走出区间」这件事量化了。
{ 不含当根的区间写法 }
位置 := (CLOSE - REF(区间低, 1)) / (REF(区间高, 1) - REF(区间低, 1)) * 100;
{ 位置超过 100 或低于 0 即表示走出了此前区间 }
两种写法要分清使用场合:做区间内位置读数用第一种,做「是否走出区间」的量化判断用第二种。同一个公式里混着用,等于把两套边界叠在一起,位置值会出现无法解释的跳变。
四、分母为零的位置怎么处理
除法里需要单独处理的地方在分母。区间高与区间低相等时,区间高度为零,位置值没有定义。这类位置在数据上确实存在:连续一字线、长期停牌期间只有重复报价、或者所选区间内价格没有变化,都会让最高价与最低价取到同一个数。
处理办法是在公式里显式判断,把这类位置挡掉。用 IF 把结果替换成一个固定值,或者用条件语句让它不参与后续计算。
{ 分母为零时的挡法 }
分母 := 区间高 - 区间低;
位置 := IF(分母 > 0, (CLOSE - 区间低) / 分母 * 100, 0);
{ 换成 DRAWNULL 可以让这类位置不画线,效果是曲线上断开一段 }
替换成 0 与替换成空值是两种取向。替换成 0 会让曲线继续连上,适合下游还要对位置取平均的写法;替换成空值会让曲线断开,适合只做视觉观察的写法,因为断开处一眼能看出是数据问题而不是真的落到了区间底部。选择哪一种,取决于这条位置后面还要不要参与计算。
五、参数 N 的影响
通达信波段指标公式的参数 N 决定的是观察窗口的长度,与均线参数的作用方式相同:窗口越长,位置变化越平缓;窗口越短,位置对单根价格的变化越敏感。
| 区间根数 | 位置线的形状 | 适合读取的内容 |
|---|---|---|
| 偏小 | 上下摆动幅度大,贴边次数多 | 近期价格在小区间内的相对位置 |
| 居中 | 摆动与平滑之间有过渡 | 一段中等长度区间的相对位置 |
| 偏大 | 曲线平缓,长期停留在中段 | 较长周期区间内的相对位置 |
参数改动之后,位置值的大小会整体变化,但走势形状的转折点位置未必同步改变。核对参数影响时,把两套参数分别输出到两条副图线上对照,看转折点是否位移、贴边次数是否变化,比单看某一天的数值有意义。
参数不宜与其他指标共用同一套取值习惯。位置类指标的窗口长度直接决定区间边界,而均线类指标的窗口长度决定的是平均值,两者即使取同一个数字,得到的曲线性质也不一样。
六、核对方法
核对分三步走。第一步把区间边界的取数单独输出,确认边界本身取对了。
{ 边界与位置同时输出,便于逐根核对 }
区间高 := HHV(HIGH, N);
区间低 := LLV(LOW, N);
位置 : (CLOSE - 区间低) / (区间高 - 区间低) * 100;
区间高线 : 区间高;
区间低线 : 区间低;
第二步挑一根 K 线手工复算。取该根的最高价与最低价起点,按 N 根窗口量出区间高与区间低,再用收盘价算一遍位置值,与公式输出对照。两者一致说明取数与窗口都对上了;不一致时先看窗口根数,再看分子分母用的是 HIGH/LOW 还是 CLOSE。
第三步查异常位置。把位置值贴到 0 或 100 的根数挑出来,逐个确认是收盘确实处在区间端点,还是分母为零被替换成了固定值。这一步能同时验证分母处理是否生效。相关的排查顺序可以参考 公式报错与卡顿排查 一栏里关于结果与预期不一致的分层查法,量纲与叠加位置的检查可以对照 主图副图指标 一栏。
把上面的内容收一下:通达信波段指标公式的两个关键点是区间边界与除法分母。边界取自 HHV 与 LLV,是否包含当根决定位置值会不会越界;分母是否为零决定该根的位置值有没有含义。这两点确认之后,参数的调整才有可对照的基准。
文中函数名与写法为通用描述;通达信不同版本与券商定制版对 HHV、LLV 一类统计函数的支持范围、参数写法与越界值的处理方式存在差异,具体写法请以你所用版本公式编辑器内附的函数说明为准。本文只讨论取值与计算口径,不构成任何投资建议。
