图表上把一段走势叫成横盘靠的是眼睛,公式里没有「横盘」这个词,只有区间。通达信横盘整理公式要做的第一件事,是把「看着在横着走」翻译成三个能比较的量:两条边界的距离、跨了多少根 K 线、这一段成交量与前一段的比值。
下面按区间、带宽分母、时间跨度、量能收敛、与突破的分界、失效与核对六步展开。函数名与参数取值以本机公式编辑器的函数列表为准。
一、横盘不是一个形态,是一个区间
形态是画在图上的说法,公式语言里没有对应函数,得自己写成算式。边界用 HHV(H,N) 与 LLV(L,N) 取,前者是最近 N 根里最高的最高价,后者是最低的最低价:两个函数先按窗口截取一段,再在这段里取极值,取的是一段里的极值,不是当根的 H 与 L。算式分三支:上下边界、边界之间的带宽、带宽成立的根数。
{ 两条边界与带宽骨架 }
UP := HHV(H, N);
DN := LLV(L, N);
BW := (UP - DN) / DN;
{ UP / DN 是滚动值,每根按最近 N 根重算一次 }
滚动决定了区间不是画完就不动的框:每往前一根,窗口丢掉最老的一根、收进新的,两个极值都可能变,不同根上看到的边界不是同一个值。判定输出的是逐根成立的量,这一根带宽小于阈值记成立,下一根不成立就断在这里,它不给出一条线。
二、带宽口径:分母取谁
写通达信横盘整理公式时,带宽这一支最含糊的地方是分母。分子都是一段里的最高价减最低价,分母换成谁,算出来的数就换一个含义,阈值也不能通用。
分母取 LLV(L,N),带宽是这段振幅相对本段最低点的比例,分母与分子同源、随窗口变:窗口内最低点被刷新时分母变小、比值变大。
分母取 REF(C,N),也就是 N 根之前那一根的收盘价。分母落在窗口之外,不随窗口内价格变化;它也可能高于窗口内所有价格,窗口里是一段下跌时就是这样,比值会被压小。同一段走势两种分母算出的数不一样,阈值不能互换。
分母趋零时比值发散,价格字段落在很小的量级(长期低价、复权后的价格),或者分母取到空值(停牌、当日数据没下载、字段名取错),都会走到这里;空值参与除法,结果一路是空,图上是条不出现的线,看着像阈值设得太紧,其实是分母没有值。
{ 分母的两道保护 }
D0 := LLV(L, N);
SAFE := NOT(ISNULL(D0)) AND D0 > 0;
BW : IF(SAFE, (HHV(H, N) - D0) / D0, DRAWNULL);
{ ISNULL 判空,D0 > 0 拦零与负值,DRAWNULL 让这一根不画线 }
阈值是设定值,不是统计结论。把带宽阈值设在 5% 到 8% 之间,说的是你允许这一段的最大跨度有多大;收到 2% 到 3% 之间,一天的振幅就能把它顶穿;放到更宽,单边下跌的中段也会被算成整理。选定之后写进注释。
三、时间跨度:多少根才算整理
N 与「整理持续了几根」是两件事,常被写成同一个参数。带宽窗口只回答最近 N 根的高低差有多大,不回答条件成立了几根:N 取 20 只说明窗口里有 20 根,这 20 根之前要是也窄,公式并不知道。
{ 成立根数与连续成立根数;SUM 与 COUNT 写法一致 }
OK := SAFE AND (HHV(H, N) - D0) / D0 < TH;
CNT : SUM(OK, M);
RUN : BARSLAST(NOT(OK)) + 1;
BARSLAST(NOT(OK)) 回答的是「连续」:条件成立时取 0,加 1 就是当根的连续根数,断一次回到 0 重新数。判整段用 RUN 比用 CNT 直接:CNT 只做累计,开一个断口不影响它,RUN 会被清零。
跨度取几根是设定值,20 到 60 根之间是一个可用的起点。设得太短,比如 10 根,急跌之后两三根平走就能成立;设得太长,窗口会把更早的那一段行情一起圈进来,而它与眼下这一段未必是同一件事。
周期口径要跟着跨度一起写:同样一个 N,挂在日线上是 N 天,挂在 30 分钟线上是 N 个 30 分钟。带宽窗口与跨度也不必等长,窗口长短管多窄,连续根数管窄了多久。
HHV 与 LLV 按实际存在的根数计算,得到的是很短窗口给出的极窄区间,很像整理。四、量能收敛:第三个条件
通达信横盘整理公式只靠价格那一支不够用。价格在窄幅里来回走而成交量还在放大是一种形态,价格窄幅、成交量同时落到低于前一段的水平是另一种,量能收敛管的是后一种。
{ 本段均量与前段均量的比值 }
V1 := MA(V, N);
V2 := REF(MA(V, N), N);
VR : V1 / V2;
{ 前段均量趋零时比值失真,保护写法同带宽分母 }
不取单根量,是因为一根的量会被单日的事件带偏:一笔大宗交易、一次指数样本调整,都能让这一根与这一段脱节。用 N 根的均值把这段摊平,比值才代表水平的变化;REF 这个手法与带宽的第二种分母同源,区别只在挪的是收盘价还是均量。
这一支是旁证,不是主条件:成交量没有收敛的一段窄幅,价格上仍然是窄幅,带宽判定照旧成立。把量能写进必选条件,等于把「窄幅」换成了「窄幅且量缩」,那是另一个判定对象。比值阈值设成一个小于 1 的数,比如 0.8,同样是设定值。
五、与突破判据的分界
本篇只界定整理本身,突破那一侧另有判据,这里不展开。整理判定回答「区间是否还在延续」,另一侧回答「区间是否已经结束」,答案相反,两套条件不能共用同一条输出。
| 环节 | 整理侧的口径 | 分界处要说明的事 |
|---|---|---|
| 边界取数 | 窗口含当根 | 含当根说的是这一段,不含当根说的是这一段之前 |
| 时间跨度 | 用 RUN 判连续 | 断口标在 RUN 归零的那一根 |
| 输出量 | 逐根成立标记 | 与价格线量纲不同,不共用一个坐标轴 |
第一个位置是边界含不含当根。HHV(H,N) 的 N 根含当根,这是自指的:价格刚创出窗口内新高时上边界跟着上移,带宽未必变大,整理条件可能继续成立,而含当根的边界是把新价当成边界的一部分。
第二个位置是输出对象。整理判定输出逐根的成立标记,或者用 DRAWNULL 让不成立的根不画线;价格线是有量纲的连续值,共用一个坐标轴会互相干扰,用 STICKLINE 画的成立段要留在副图。
第三个位置在时间跨度上。带宽窗口是滚动的,价格冲高回落之后窗口里重新排满窄幅的根,条件重新成立,两个成立段贴在一起,中间那几根就是分界的位置。
六、失效情形与逐根核对
阈值放宽会造成误判:判定在单边走势的中段也成立,整理段被拉长;阈值收到比正常波动还小,则任何一根上都不成立,输出一条不出现的线,像公式写错了。定阈值前先把带宽输出成线,看它在你要研究的行情里落在什么量级。
停牌与新股没有足够样本,是第二类失效。新股上市头几根,窗口里的 K 线不足 N 根,HHV 与 LLV 按实际存在的根数计算,极窄区间让判定成立;停牌不生成 K 线,窗口里的根是跨过停牌取来的,复牌一根跳空就能让两条边界拉开。核对时看 K 线根数与交易日对齐。
第三类是带宽随价格漂移。带宽是比值,分母在变的时候,同样的价格跨度算出来的带宽不同:下边界逐日下移的一段里,带宽会自己往上走,阈值没有改过,判定却从成立变成不成立。核对时把上下边界的差值一起输出做对照。
{ 中间量一起算出来,核对时按需要改成输出 }
UP : HHV(H, N);
DN : LLV(L, N);
AMP : UP - DN;
BW : IF(SAFE, AMP / DN, DRAWNULL);
逐根核对按这个顺序走:
- 先数根数,看这一根之前有没有 N 根 K 线,停牌段与上市初期单独标出来。
- 再看分母有没有值,是不是落在很小的量级。
- 再看带宽线在区间第一根、中段、最后几根的取值,与阈值各差多少。
- 最后看 RUN 断在哪一根,断口与价格离开窄幅的位置对不对得上。
:= 算出来,核对时一次只把一条改成 : 输出,看完改回去。多条线同时输出,量纲混在一起,看不出哪一条有问题。横盘整理在图上是一段感觉,在通达信横盘整理公式里只能是三个数:窗口多长、持续几根、量能比到多少。这三个数写不出来,判定就只能停在感觉那一层。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
站内还有 量价形态与信号拆解 的条目,指标原理与函数口径 讲取数与窗口的算法,公式回测与失效复核 讲把中间量输出成线逐根对照的办法,可对照查看。
