通达信KDJ二次金叉公式要回答的问题是:两次金叉之间发生过什么。判定顺序是固定的,先有过一次金叉,K 线随后下穿 D 线形成死叉,之后才有第二次金叉。中间那次反向下穿一旦缺失,本根金叉就只是第一次金叉在往后拖,按二次信号处理等于把同一段行情数了两遍。
这篇按四步走:先看 K 线与 D 线各自的来源,再给两种可行写法,接着看参数和周期怎么改变计数结果,最后把中间变量单独输出出来核对。K、D 的计算口径以本机公式编辑器里的函数说明为准。
一、二次金叉难在顺序,不在交叉
KDJ 的三条线由 RSV 逐层推出来。RSV 把收盘价放在最近九根的最高价与最低价之间,量出它在区间里的位置;K 线是 RSV 的加权平滑值,D 线又是 K 线的加权平滑值。平滑权重决定 K 线与 D 线的靠近速度,也决定交叉发生的密度。
金叉与死叉是两个方向相反的穿越。金叉是 K 由下向上穿过 D,死叉是 K 由上向下穿过 D。CROSS 函数把这两件事各写成一行,交叉当天返回 1,其余位置返回 0。
{ KDJ 三条线的来源,参数取 9、3、3 }
RSV := (C - LLV(L, 9)) / (HHV(H, 9) - LLV(L, 9)) * 100;
K := SMA(RSV, 3, 1);
D := SMA(K, 3, 1);
J := 3 * K - 2 * D;
{ 金叉:K 由下向上穿过 D;死叉:方向相反 }
JC := CROSS(K, D);
SC := CROSS(D, K);
把这六行放进公式管理器,副图上就能看到 J 线摆动、K 线与 D 线交叉的位置。到这一步为止,交叉本身没有难点,难点在下一层:一根 K 线上只能读出「此刻交叉」,读不出「这是第几次交叉」。
要拿到次序信息,必须往前看。往前看有两种走法,一种数次数,一种比位置,两者能回答的问题并不一样。
二、写法一:用计数窗口圈出两次交叉
计数窗口的思路是把最近一段长度固定下来,在这段里数金叉与死叉各出现了几次。本根是金叉,窗口内金叉不少于两次、死叉不少于一次,就把它挑出来。
{ 计数窗口法:只保证次数,不保证先后 }
二次金叉: JC AND COUNT(JC, 30) >= 2 AND COUNT(SC, 30) >= 1;
{ 30 是窗口长度,改大改小,入选样本跟着变 }
这种写法短,跑得快,也容易被误用。窗口只约束次数,不约束排列。如果窗口里出现过两次金叉和一次死叉,但死叉排在最前面,实际次序是死叉、金叉、金叉,中间那次反向下穿依然缺失,判据却照样把它选了出来。
窗口长度是这套写法的基本旋钮。窗口给到 30 根,覆盖的是一个偏短的时间跨度;给到 120 根,会把半年前的一次交叉也拖进来凑数。长度定了之后不能只看选中的根数,要看被选中的每一根在图上前后各是什么。
三、写法二:用死叉位置卡住先后
要让通达信KDJ二次金叉公式的判据精确到根,得换成比位置:先量出本根距离最近一次死叉有多少根,再往前回看那根死叉之前有没有出现过金叉。两个条件同时成立,次序才是「金叉、死叉、金叉」。
{ 位置比较法:本根金叉、最近一次死叉在两根之前、且此前出现过金叉 }
G1 := BARSLAST(SC);
二次金叉: JC AND G1 >= 2 AND COUNT(JC, G1 + 60) >= 2;
{ G1 + 60 是回看长度,60 是给「死叉之前那次金叉」留的余量 }
BARSLAST 返回的是「距离上一次成立过去了多少根」。本根如果就是金叉,BARSLAST(JC) 读到的是 0,拿它去数上一次金叉没有意义,所以这里换成 BARSLAST(SC):本根是金叉,死叉的位置落在过去。
判据里那个 60 是近似值,不是精确边界。窗口给得比实际间隔短,上一次金叉落在窗口外,符合条件的样本会被漏掉;窗口给得过长,早年一次无关的交叉也会被算进来。要精确到根,得把中间变量输出到副图上逐根看,这一步没有捷径。
写法二比写法一多一层依赖:它要求 K 线历史足够长。序列刚开始的那几十根里,BARSLAST 还没有可参照的事件,返回值不可靠,判据在这段区间上的结论不能采信。
四、参数与周期怎么改变计数结果
参数决定交叉密度,交叉密度决定窗口该给多长。这三件事在通达信KDJ二次金叉公式里是同一个问题的不同侧面。
| 改什么 | K 线与 D 线的变化 | 对判据的连带影响 |
|---|---|---|
| RSV 周期由 9 调大 | 取值区间拉长,RSV 摆动幅度收窄 | 金叉次数减少,窗口要相应拉长才凑得出两次 |
| SMA 的平滑权重调大 | K、D 更平缓,交叉滞后 | 金叉与死叉的间隔被拉开,二次形态更难出现 |
| 切到周线或月线 | 每根覆盖的时间跨度成倍放大 | 同样 30 根的窗口,覆盖的时间跨度完全不同 |
| 复权方式变化 | 极端价格被改写,RSV 的分母跟着变 | 历史段的交叉位置前移或后移,回看结果随之改变 |
表里最后一行容易被忽略。凡是拿历史区间去数交叉次数的写法,都建立在价格序列不被重写的前提上;复权方式一改,同一个点位上的 K 值与 D 值都会变,此前数出来的次数不能直接沿用。
分钟周期上还有一层:每根覆盖的时间短,价格在区间内的相对位置抖动幅度大,RSV 贴着上下沿来回走,交叉的频次远高于日线。把日线的窗口长度照搬到分钟图上,窗口覆盖的真实时间被压缩到几个小时,判据选中的样本数会明显膨胀。
五、验证:把中间变量单独输出
核对分三步,每一步只看一件事。
第一步看变量有没有值。公式管理器里点「测试公式」,输出区会把每个以冒号输出的变量列出来。把 JC、SC、G1 都改成冒号输出,G1 那一列在序列初期是否空白或异常,一眼能看出。
第二步看位置。把 JC 与 SC 分别画到副图,用不同颜色区分,再看判据选中的那些根。依次找出三根:判据选中的这一次、它左边最近的一次死叉、死叉左边最近的一次金叉。三根凑不齐,说明判据在这一段上是错的。
{ 把交叉位置与计数结果分别输出,便于逐根核对 }
JC: CROSS(K, D), COLORRED;
SC: CROSS(D, K), COLORGREEN;
CNT: COUNT(JC, 30);
{ 图上 JC 亮起的那一根,往前推是否夹着一次 SC }
第三步看窗口是否够用。把窗口长度改小一半再跑一遍:如果选中的根数几乎不变,说明当前窗口是靠中间的交叉在兜底,长度本身没有起作用;如果根数大幅减少,说明窗口一直是紧的,前面的结果里可能含着被凑进来的样本。
三步走完,判据能不能用基本就清楚了。通达信KDJ二次金叉公式的落点不在金叉本身,而在两次交叉之间那次反向下穿有没有真的发生过;次数、位置、窗口这三样对齐了,判据才算站得住。
站内还有 量价形态与信号拆解 的条目,通达信公式编写教程 讲 CROSS 这类判定函数的写法,通达信指标原理与参数 讲平滑权重怎么影响 K 线与 D 线的形态。
本文只作技术研究口径,判据描述的是指标数值之间的先后关系,不涉及也不构成对任何标的的判断。
