写通达信KDJ金叉公式之前要纠正一个印象:金叉不是 KDJ 本身的一部分,而是在 K 与 D 两条输出之上再定义的一层条件。KDJ 算出来的是三条数值序列,交叉与否需要另写一句条件去判断。这一层分清楚了,参数改动影响哪一段、条件写错了怎么看出来,都能各自定位。
下面按「三个输出怎么算、金叉的两种写法、参数与周期的影响、钝化、验证、边界」的顺序讲。全文只讲计算口径与条件写法,不涉及任何品种判断,也不把交叉当作用来处理的信息。文中默认参数与函数名以通达信金融终端为参照。
一、KDJ 的三个输出怎么算
KDJ 的计算分两步。第一步把收盘价在最近 N 根区间里的位置换算成一个百分数,这一步得到的是一个中间变量;第二步对这个中间变量做两次带权重的平滑,得到 K 与 D,再由 K 与 D 推出 J。
{ 通达信KDJ金叉公式的三个输出 }
中间变量 = (收盘价 - N 根最低价的最小值) ÷ (N 根最高价的最大值 - N 根最低价的最小值) × 100
K = 对中间变量做 M1 期加权平滑
D = 对 K 做 M2 期加权平滑
J = 3 倍 K 减去 2 倍 D
{ 通达信内置 KDJ 的默认参数是 9、3、3,可在参数表里看到并修改 }
三步里第一步最关键,它决定了三条输出的大致形态。收盘价靠近区间高点时,中间变量接近 100;靠近低点时接近 0。K 与 D 是对这条中间变量做的平滑,因此它们的取值区间也在 0 到 100 之间,而 J 由 K 与 D 线性组合得到,取值范围会超出这个区间。
中间变量的分母存在取不到值的位置。当 N 根内的最高价与最低价相等时,分母为 0,这一步算不出结果。这类位置在公式里的表现是输出为空或输出异常,处理办法是在分母上加一个极小的常数,或先用条件把这类位置排除。相关写法可以对照 公式报错与卡顿排查 一栏里关于空值处理的说明。
二、金叉的两种写法
判断金叉有两种写法,含义并不相同。一种判断的是「交叉这一根」,另一种判断的是「当前处于交叉之后的状态」。混用会让输出的根数差出许多。
| 写法 | 含义 | 命中的根数 |
|---|---|---|
| 交叉判定 | 上一根 K 在 D 下方,本根 K 在 D 上方 | 每个交叉位置一根 |
| 状态判定 | 本根 K 高于 D | 交叉之后连续的多根 |
交叉判定的写法在表达上更准确,但它只标记交叉发生的那一根。把这个条件用于图上标注,看到的是一根根独立的标记;用于条件选股,得到的是发生交叉的位置列表。状态判定把条件放宽成持续成立,用于观察「处于什么状态」更合适。
{ 两种写法的判别办法 }
把条件输出到副图,看命中位置的分布
命中位置互相分离,间隔若干根 → 交叉判定
命中位置连成一段,中间无间隔 → 状态判定
{ 分布形态本身就是答案,不必回头读源码 }
还有一处需要提前定下来的是取值区间的方向。把三条输出按固定边界做一次反向换算,相当于把位置换成反向位置,此时交叉判断的方向也随之反转。公式里如果同时存在正向与反向两种写法,输出会互相矛盾。做法是在注释里写明所采用的区间方向,或者统一成一种方向。
三、参数与周期的影响
三个参数里,N 决定取样窗口,M1 与 M2 决定平滑程度。改动任何一个都会同时改变三条输出的形态,而交叉条件建立在输出之上,因此参数改动对交叉位置的影响是成片的,不是局部的。
{ 参数改动的方向 }
N 变小 → 区间取样更短,中间变量的波动变大,交叉更频繁
N 变大 → 中间变量更平滑,交叉位置减少且整体后移
M1、M2 变大 → K 与 D 更平滑,两条线的距离收窄,交叉位置减少
{ 参数改动之后,原有的交叉位置需要全部重新核对 }
周期的影响类似。同一组参数在日线与三十分钟线上的取样长度不同,覆盖的时间跨度相差若干倍。把公式从一个周期搬到另一个周期时,参数需要重新确定,而不是沿用原值。
四、钝化:在极值附近停留
K 与 D 落在区间两端附近并持续停留,是这类公式写起来最需要提前说明的情形。此时两条线的距离很小,交叉判断会连续命中,输出的位置密集地排在连续若干根上。
判断是否处在停留状态,看中间变量的取值即可:它接近 100 或接近 0,说明这段时间价格一直在区间的一端。此时交叉发生的频率上升,而两次交叉之间并没有对应的形态变化,输出的位置在图上连成一片。
{ 停留在极值附近时的三种处理思路 }
思路一:只保留第一次交叉,后面的用连续函数压掉
思路二:加一个区间条件,把条件限制在中间区域
思路三:不做处理,在公式说明里注明这一点
{ 三种都能用,差别在于输出要不要保留完整信息 }
判断是否进入停留状态可以用中间变量来做:把它接近区间两端的根数统计出来,与总根数比较,就能看出停留占了多长一段。这个比值本身也是一项可以记录的口径,参数改动之后重新统计一次,能看出改动对停留长度的影响。
五、把中间变量输出出来核对
核对通达信KDJ金叉公式的做法是把中间变量与 K、D 一并输出到副图,与内置 KDJ 指标逐根对照。三条线都重合,说明计算口径一致;只有 J 不重合,说明 J 的组合方式与内置不同;中间变量不重合而 K、D 重合,说明平滑部分的写法与内置一致,但取样窗口定义的细节有差别。
- 新建副图公式,参数取与内置指标相同的值。
- 输出中间变量、K、D 三条线,与内置 KDJ 挂到同一副图。
- 逐根对照三条线的数值,确认重合范围。
- 把交叉条件单独输出一次,确认命中位置的分布符合预期。
对照的意义在于把差异定位到具体的计算环节。三条线都重合而交叉位置不符合预期,说明问题在条件写法上,与计算无关;三条线不重合,改条件不会让它们对上,需要先把计算口径统一。
核对之后把结果记下来:内置指标的参数取值、自编公式的参数取值、以及三条线重合的范围。这份记录在换周期、换品种之后仍然有效,只需要在新的图表上重做一次对照,不必重新推一遍计算过程。
六、边界
需要说明的是,KDJ 的三条输出与交叉位置都只是公式算出来的结果。参数不同、周期不同,同一段行情上的交叉位置就不同,输出的位置本身不携带可比较的基准。把参数与周期一并记录下来,输出才有参照。用法上可以对照 量价形态与信号拆解 一栏里其他条件的拆解方式。
写到这里可以收一句:通达信KDJ金叉公式里可以核对的只有两件事——三条输出是否与内置一致,以及交叉条件命中的位置是否符合预期。前者改口径,后者改条件,两条路不交叉。
文中计算公式、默认参数与函数用法以通达信金融终端为参照;不同版本与券商定制版对默认参数取值、平滑函数的加权方式以及 J 值的定义可能存在差异,请以你所用版本指标参数表与公式编辑器内函数说明的记载为准。
