「双底」「头肩底」这些词在人眼看图时是直观的,写进公式时立刻会碰到一个问题:人眼判断形态用的是相对位置和大致比例,而公式需要的是确定的数值条件。通达信形态类公式的难点,全部集中在这个转换过程里。
下面以双底与头肩两种形态为例,把描述逐步拆成条件和写法,说明容差为什么必须存在,并给出验证办法与几类失效情形。全文只讨论形态条件的量化表达,不构成任何投资建议。
一、从描述到条件的距离
人看图时的判断流程大致是:先找到几个转折点,再看它们的高低关系,最后看整体像不像一个熟悉的形状。这三步里前两步可以量化,第三步是模式匹配,公式不好直接表达。
所以形态公式的写法分两段。第一段定位转折点,也就是局部的高点与低点;第二段检查这些点之间的相对位置是否满足一组数值条件。条件满足就输出一个标记,说明这组位置关系成立,而不是说明「这就是双底」。
这个区分很重要。公式输出的是一组几何关系的成立与否,形态名称只是这组关系的通俗叫法。理解了这一点,后面所有条件的取舍都有依据:条件写得越收紧,符合的情形越少,代价是与人眼判断的偏差也越大。
二、双底的量化条件
一个标准的双底描述包含三个点:两个低点与中间的一个高点。可写成条件的部分有几项:两个低点之间的间隔在某个范围里;两个低点的价格相差不超过某个比例;中间的高点比两个低点都高出某个比例。
定位低点用 LLVBARS 一类函数,它返回指定周期内最低值出现在距今第几根。有了这个距离,就能用 REF 把它前面的取值调出来使用。
{ 双底条件的一种写法 }
{ 前一低点距今 K1 根,当前为 K2 根处的新低 }
K1:=LLVBARS(LOW,60);
L1:=REF(LOW,K1);
L2:=LOW;
{ 条件一:两低点间隔在 10 到 40 根之间 }
JIANGE:K1>10 AND K1<40;
{ 条件二:两低点价格差不超过前低点的 5% }
CHAPING:ABS(L1-L2)/L1<0.05;
{ 条件三:中间高点高出两低点至少 8% }
ZHONG:=REF(HHV(HIGH,K1),1);
GAODU:(ZHONG-LLV(L1,L2))/LLV(L1,L2)>0.08;
{ 三项同时成立 }
SHUANGDI:JIANGE AND CHAPING AND GAODU;
三项条件里的数字都是取值,不是定理。容差收窄一档,选出的情形会明显减少;放宽一档,会包含两个低点相差较远的情形。取哪一个取决于你打算用这个标记做什么,这一点在写通达信形态类公式时值得先想清楚,再动手填数字。代码里那两个数字决定容差的松紧,改动它们比改动条件本身更容易看出差别。
三、头肩形态的相对位置
头肩形态比双底多一个点:左肩、头、右肩三个高点,其中头部最高,两肩低于头部,两肩之间又大致接近。要多定位一个高点,写法和上一节相同,只是取值的方向反过来,用 HHVBARS 与 HHV。
{ 头肩形态的相对位置条件 }
KA:=HHVBARS(HIGH,120);
{ 头:区间内最高点;两肩:头部之前与之后的次高点 }
{ 条件一:两肩高度接近 }
{ 条件二:两肩均低于头部,且低出比例在给定区间 }
{ 条件三:两肩与头部之间的间距大致对称 }
{ 实际写法需要先用 BARSLAST 或分段函数锁定三个位置, }
{ 再逐项比较。定位方式随需求不同,这里给出条件框架 }
用文字把条件写清楚再动手,比直接写代码省时间。上表三行条件里,第一条与第二条是位置关系,第三条是间隔关系,都能用比较式表达。写不出来的部分,是「看起来像个头肩」这种整体印象,那部分不必强求写进公式。
四、用转折点函数定位可行吗
有人会想到用峰谷识别类函数直接把转折点标出来,省掉前面那些定位的步骤。这类函数确实存在,它们的工作方式是先确定一段区间的最高点或最低点,再向两侧找反向的转折。
替代办法是用固定窗口的极值函数,比如上面用的 LLVBARS 与 HHVBARS。它的代价是窗口长度要预先定好,窗口外的转折点不会被找到,但它的输出不依赖窗口之后的数据,位置是确定的。形态公式里用这一类函数。通达信形态类公式能否用在还没走完的区段上,取决于这一步的选择:要求位置确定就用固定窗口极值,只做事后观察则两类都可以。
五、形态公式的失效情形
第一类是复权带来的价格跳变。除权除息之后,历史价格序列被重新计算,一段本来满足容差条件的低点关系可能因此不成立,或者反过来从不成立变成成立。核对办法是把复权设置切换前后各跑一次,看输出标记的数量变化。
第二类是停牌与数据缺口。区间内出现长时间无行情,极值定位函数会把缺口前后的数据当成连续序列处理,位置的周期数计算因此偏离实际情况。
第三类是窗口边界。条件里用到的最大周期数决定了公式能看到的范围,一段形态横跨的距离超过窗口长度时,转折点会被截断,条件无法成立。
第四类是容差取值与品种特性不匹配。价格波动幅度较小的品种,同样的百分比容差会包含更多情形;波动幅度大的品种则相反。同一套数值条件在不同品种上的含义并不相同。条件里的比例取值要不要随品种调整,是写下这段源码时就要决定的事。
失效情形的记录方式建议统一:每遇到一次,记下品种、日期、当时的复权设置与参数取值。积累几条之后再看这些记录,能看出问题是集中在某类品种上,还是集中在某种参数取值上。这比零散记住几个印象要可靠。
六、写成什么程度才够用
通达信形态类公式写到能稳定输出一组条件成立与否,就可以停下来。继续加条件会掉进一个循环:为了排除某个不符合直觉的输出而增加约束,约束增加后又漏掉了一些符合直觉的情形,再来调整容差。这个循环没有收敛点,因为判断标准是人眼的整体印象。
可行的做法是把条件与容差全部放进取值可调的形式,放进参数表,然后在同一段历史上用几组取值各跑一次,把输出的标记数量与位置记录下来。这样做的好处是判断依据变成了可以对照的记录,而不是「感觉哪个更准」。
验证一个点的方式与前面几节一致:挑一根被标记的 K 线,把三个关键位置的价格手工取出来,逐个验算不等号。所有条件都成立,说明写法正确;有条件的取值落在边界附近,就把它记下来,这是容差选择带来的不确定性。
站内还有几处可以对照查看:公式编写与语法函数 一栏讲定位与比较类函数,量价形态与信号拆解 一栏讲把形态说法拆成条件的方法,回测验证与风险控制 一栏讲怎么判断一个条件稳不稳。三处侧重点不同,按需要挑一处看即可。
文中出现的函数名、参数写法与菜单路径以通达信金融终端个人版为参照;不同版本的函数表收词与行为可能存在差异,请以你所用版本的「帮助 → 关于」与公式编辑器内的函数说明为准。
