指标源码
{---KDJ(9.3.3)----}
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:SMA(RSV,3,1),COLORFF9900;
D:SMA(K,3,1),COLOR00FF00,LINETHICK2;
J:3*K-2*D,COLOR00FFFF,LINETHICK1;
DRAWBAND(J,RGB(60,0,60),D,RGB(60,80,60));
3*K-2*D,COLOR00FFFF,LINETHICK1;
SMA(K,3,1),COLOR00FF00,LINETHICK2;
IF(D>REF(D,1),D,DRAWNULL),COLOR0000FF,LINETHICK2;
{----MACD(26.12.9)----EMA---}
{DIFF:=(EMA(CLOSE,12) - EMA(CLOSE,26));
DEA:=EMA(DIFF,9);
MACD:2*(DIFF-DEA),LINETHICK0;}
{----MACD(26.12.9)----WMA----}
DIFF:=WMA(CLOSE,12)-WMA(CLOSE,26);
DEA:=WMA(DIFF,9);
MACD:2*(DIFF-DEA),LINETHICK0;
Q:=100;
SZ:=MACD>REF(MACD,1);
STICKLINE(SZ,REFDATE(HHV(J,0),DATE),REFDATE(-50,DATE),6,0),COLORDD0000; {-------波段背景------};
STICKLINE(SZ,0,MACD*1*Q,1.0.05,0),COLOR0000CC;
STICKLINE(SZ,0,MACD*0.8*Q,1,0),COLOR0011FF;
STICKLINE(SZ,0,MACD*0.6*Q,1.3,0),COLOR0055FF;
STICKLINE(SZ,0,MACD*0.4*Q,1.6,0),COLOR0099FF;
STICKLINE(SZ,0,MACD*0.2*Q,2,0),COLOR00DDFF;
XD:=MACD<REF(MACD,1);
STICKLINE(XD,0,MACD*1*Q,1.0.05,0),COLORFF0000;
STICKLINE(XD,0,MACD*0.8*Q,1,0),COLORFF3311;
STICKLINE(XD,0,MACD*0.6*Q,1.3,0),COLORFF7733;
STICKLINE(XD,0,MACD*0.4*Q,1.6,0),COLOR999933;
STICKLINE(XD,0,MACD*0.2*Q,2,0),COLOR88DD00;
SMA(K,3,1),COLOR00FF00,LINETHICK2;
3*K-2*D,COLOR00FFFF,LINETHICK1;
DRAWBAND(J,RGB(60,0,60),D,RGB(60,80,60));
3*K-2*D,COLOR00FFFF,LINETHICK1;
SMA(K,3,1),COLOR00FF00,LINETHICK2;
IF(D>REF(D,1),D,DRAWNULL),COLOR0000FF,LINETHICK2;
0,DOTLINE;80,DOTLINE;
{高抛低吸}
SJ:=WMA(((2*C+H+L)/4-LLV(L,5))/(HHV(H,5)-LLV(L,5))*100,2);
ZJ:=WMA(0.618*REF(SJ,1)+0.382*SJ,2);
MR:=CROSS(SJ,ZJ) AND SJ<30;
MC:=CROSS(ZJ,SJ) AND SJ>70;
AA8:=100*EMA(EMA(C-REF(C,1),8),5)/EMA(EMA(ABS(C-REF(C,1)),8),5);
买:=LLV(AA8,2)=LLV(AA8,8) AND COUNT(AA8<0,2) AND CROSS(AA8,WMA(AA8,2));
DRAWTEXT(MR ,J,'↖加仓1,'),COLOR00FFFF;
DRAWTEXT(FILTER(买,5),J,'↖加仓 2.'),COLOR00FFFF;
卖:=HHV(AA8,2)=HHV(AA8,8) AND COUNT(AA8>0,2) AND CROSS(WMA(AA8,2),AA8);
DRAWTEXT(MC,J,'↙减仓1,'),COLOR00FF00;
DRAWTEXT(FILTER(卖,5),J,'↙减仓 2'),COLOR00FF00;
下面把这段 通达信(TDX) “KDJ+MACD 二合一” 幅图源码逐段拆解,说明每个模块的算法初衷、绘图方式以及在实际使用时需要注意的细节,最后给出 复制/粘贴使用方法、 常见问题与改进建议,帮助您快速上手并根据自身需求进行微调。
1. 代码整体结构概览
| 区块 | 位置(行号) | 主要功能 |
|---|---|---|
| KDJ 计算 | 第 3‑7 行 | 计算 9‑周期 RSV → K、D → J 曲线 |
| MACD 计算 | 第 10‑13 行 | 用 WMA(加权移动平均)代替 EMA,得到 DIFF、DEA、MACD |
| 绘图‑KDJ | 第 8 行、14‑15 行、22‑23 行 | DRAWBAND、SMA、DOTLINE 等绘制 K、D、J 曲线 |
| 绘图‑MACD 背景 | 第 15‑27 行 | 当 MACD 上涨(SZ)时画红色系柱子;下跌(XD)时画绿色系柱子 |
| 高抛低吸信号 | 第 30‑41 行 | 计算 “SJ、ZJ、MR、MC、买、卖” 条件并用 DRAWTEXT 在图上标注 “↖加仓1/2”“↙减仓1/2” |
| 辅助线 | 第 28‑29 行 | 0、80 虚线(KDJ 超买/超卖参考) |
注意:代码里出现两次
DRAWBAND、SMA、K、D、J的绘制语句,属于冗余但不影响运行。下面会逐行解释。
2. 各模块详细分析
2.1 KDJ(9,3,3)
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:SMA(RSV,3,1),COLORFF9900;
D:SMA(K,3,1),COLOR00FF00,LINETHICK2;
J:3*K-2*D,COLOR00FFFF,LINETHICK1;
DRAWBAND(J,RGB(60,0,60),D,RGB(60,80,60));
- RSV:9 日内收盘价相对最低/最高价的相对位置(%)。
- K、D:RSV 的 3‑日平滑(
SMA),分别取3,1(即简单移动平均)。 - J:3K‑2D,常用公式,波动最大。
- DRAWBAND:把 J(紫色)和 D(绿色)用半透明带状填充,视觉上帮助判断 J 与 D 的交叉。
调参提示:如果想把 KDJ 改成 9‑3‑3(默认)或其它周期,只需把
9改成你想要的N(如 14),3改成M(如 3)即可。
2.2 MACD(26,12,9)—使用 WMA 而非 EMA
DIFF:=WMA(CLOSE,12)-WMA(CLOSE,26);
DEA:=WMA(DIFF,9);
MACD:2*(DIFF-DEA),LINETHICK0;
- 这里采用 加权移动平均(WMA),比 EMA 更“灵敏”。如果想恢复经典的 EMA 版,只需把
WMA替换成EMA(注释里已给出 EMA 版本的旧代码)。 MACD= 2*(DIFF‑DEA) 与常规的MACD = DIFF‑DEA等价,只是把柱状幅度放大两倍,便于观察。
调参提示:若想改成
12,26,9(默认)或5,35,5等,可直接修改12、26、9这三个数字。
2.3 MACD 背景(柱状)——涨/跌颜色区分
Q:=100;
SZ:=MACD>REF(MACD,1);
STICKLINE(SZ,REFDATE(HHV(J,0),DATE),REFDATE(-50,DATE),6,0),COLORDD0000; // 波段背景
STICKLINE(SZ,0,MACD*1*Q,1,0.05,0),COLOR0000CC;
STICKLINE(SZ,0,MACD*0.8*Q,1,0),COLOR0011FF;
...
XD:=MACD<REF(MACD,1);
STICKLINE(XD,0,MACD*1*Q,1,0.05,0),COLORFF0000;
...
- SZ(涨)= 当期 MACD 大于前一期;XD(跌)= 当期 MACD 小于前一期。
- STICKLINE 用来在副图上绘制“柱子”。
Q=100把 MACD 放大 100 倍,以便在 0‑100 的坐标系中显示(因为 MACD 本身往往在 -2~+2 之间)。 - 颜色:上涨显示 蓝‑青(COLORDD0000、COLOR0000CC …),下跌显示 红‑黄(COLORFF0000 …),形成明显的多空背景。
语法小坑:原始代码里出现
1.0.05(类似1.0.05),这是STICKLINE参数写错了。正确写法是STICKLINE(COND, LOW, HIGH, WIDTH, OFFSET),即STICKLINE(SZ,0,MACD*Q,1,0.05,0)(宽度 1,偏移 0.05)。如果你想保持原样也可以直接粘贴,TDX 可能会容忍这种错误,但建议改成标准形式。
2.4 “高抛低吸”信号(买入/卖出)
2.4.1 计算 SJ、ZJ(基于典型价的 5‑日威廉姆斯 %R 变体)
SJ:=WMA(((2*C+H+L)/4-LLV(L,5))/(HHV(H,5)-LLV(L,5))*100,2);
ZJ:=WMA(0.618*REF(SJ,1)+0.382*SJ,2);
SJ:先算典型价(2*C+H+L)/4,再把它转化为类似 威廉姆斯 %R(0‑100)再进行 2‑日 WMA 平滑。ZJ:是SJ的加权移动平均(0.618 与 0.382 为斐波那契权重),起到“中期均线”的作用。
2.4.2 交叉信号
MR:=CROSS(SJ,ZJ) AND SJ<30; // “加仓1” – SJ 上穿 ZJ 且在超卖区
MC:=CROSS(ZJ,SJ) AND SJ>70; // “减仓1” – SJ 下穿 ZJ 且在超买区
- MR(买1) –
SJ从下往上突破ZJ,且SJ<30(超卖),表明价格可能即将反弹。 - MC(卖1) –
SJ从上往下突破ZJ,且SJ>70(超买),预示回调风险。
2.4.3 低位买入选股(买2)
AA8:=100*EMA(EMA(C-REF(C,1),8),5)/EMA(EMA(ABS(C-REF(C,1)),8),5);
买:=LLV(AA8,2)=LLV(AA8,8) AND COUNT(AA8<0,2) AND CROSS(AA8,WMA(AA8,2));
AA8:先算 8 日收盘价变动(C-REF(C,1))的 EMA,再除以 8 日 绝对变动 的 EMA,形成一种 动量比率。- 买 信号:
AA8在最近 2 日创 8 日最低,且最近 2 天均为负(AA8<0),随后出现AA8上穿其 2‑日 WMA,确认转为正动量。
2.4.4 高位卖出(卖2)
卖:=HHV(AA8,2)=HHV(AA8,8) AND COUNT(AA8>0,2) AND CROSS(WMA(AA8,2),AA8);
- 与买相反:
AA8在最近 2 日创 8 日最高,且最近 2 天均为正,随后出现AA8下穿其 2‑日 WMA,确认动量转负。
2.4.5 文字标注
DRAWTEXT(MR ,J,'↖加仓1,'),COLOR00FFFF;
DRAWTEXT(FILTER(买,5),J,'↖加仓 2.'),COLOR00FFFF;
DRAWTEXT(MC,J,'↙减仓1,'),COLOR00FF00;
DRAWTEXT(FILTER(卖,5),J,'↙减仓 2'),COLOR00FF00;
DRAWTEXT在 J 曲线(或当前坐标系)上打印文字。FILTER(买,5)、FILTER(卖,5)表示过滤掉连续 5 根 K 线内的重复信号,以免文字堆积。
提示:如果想在 主图(K 线图)上显示信号,只需把
J换成C(收盘价)或L(最低价)即可。
3. 使用方法(一步一步)
前提:您已经在通达信(TDX)客户端登录并拥有 公式编辑器(公式管理器)的权限。
-
打开公式管理器
- 菜单:
功能 → 公式管理器(或快捷键Ctrl+F),进入 “指标公式” 页面。
- 菜单:
-
新建指标
- 点击 新建,弹出 “指标编辑” 窗口。
- 在 “公式名称” 中填入
KDJ_MACD_二合一(任意名称)。 - “指标类型” 选 幅图(副图)。
- “备注” 可自行填写,例如 “KDJ+MACD 组合幅图”。
-
粘贴源码
- 将上面的完整代码粘贴到 源码 框中。
- 建议:把出现
1.0.05的STICKLINE改成1,0.05(即STICKLINE(SZ,0,MACD*Q,1,0.05,0)),避免潜在错误。
-
保存
- 点击 保存 → 确认。
-
在行情图上添加
- 打开任意股票的 日线/分钟线 图表。
- 在主图(K 线)上右键 → “叠加指标” → “选择指标”。
- 在弹出的列表中找到刚才创建的
KDJ_MACD_二合一,双击或点 “确定”。 - 该指标会出现在 副图(底部)区域,显示 KDJ 曲线和 MACD 背景柱子。
-
查看信号
- 当满足
MR、买、MC、卖条件时,文字 “↖加仓1/2”“↙减仓1/2” 将在副图的 J 曲线附近弹出。 - 您可以点击 “设置”(指标右边的齿轮)调整 K、D、J 的颜色、线宽,或打开 “显示数值” 查看具体数值。
- 当满足
4. 常见问题 & 小技巧
| 现象 | 原因 | 处理办法 |
|---|---|---|
| 柱子颜色不明显 | Q=100 可能导致柱子高度太大或太小;STICKLINE 的 WIDTH 与 OFFSET 参数不匹配 |
调整 Q(如改为 50)或把 STICKLINE 的 WIDTH 改为 0.8、OFFSET 改为 0.02 |
| 文字堆在一起 | MR、买 同时出现,或 FILTER 参数太小 |
把 FILTER(买,5) 改成 FILTER(买,10),或把 MR 与 买 用不同的 DRAWTEXT 位置(如 J+5)区分 |
| 想用 EMA 替代 WMA | 目前 MACD 用 WMA,想恢复传统 EMA | 将 DIFF:=WMA(CLOSE,12)-WMA(CLOSE,26); 改为 DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);,DEA 同理 |
| 想让信号显示在主图 | 只想看买卖点,不想看 KDJ/MACD | 把 DRAWTEXT 中的 J 换成 L(最低价)或 C(收盘价),并把 STICKLINE、DRAWBAND 之类删除,只保留买卖信号部分 |
| 想改 KDJ 参数 | 默认 9‑3‑3 | 把 RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; 中的 9 改为 N,SMA(RSV,3,1) 中的 3 改为 M,K:=SMA(RSV,3,1); 中 3 同样改为 M;同理改 D 的平滑参数 |
| 出现 “变量未定义” 错误 | 源码里误把 MACD*1*Q 写成 MACD*1*Q(缺少括号) |
确认每个 STICKLINE 第三个参数是 MACD*Q(或 MACD*1*Q),最好加上括号 (MACD)*Q |
5. 简单的改进示例(可选)
下面提供一份 去冗余、兼容 EMA、修复 STICKLINE 的 “干净版”。您可以直接把它复制到公式编辑器中替换原代码。
// ------------------------------------------------------------
// KDJ+MACD 二合一幅图(兼容 EMA,修复 STICKLINE 语法)
// ------------------------------------------------------------
{----- KDJ (9,3,3) -----}
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:SMA(RSV,3,1),COLORFF9900;
D:SMA(K,3,1),COLOR00FF00,LINETHICK2;
J:3*K-2*D,COLOR00FFFF,LINETHICK1;
DRAWBAND(J,RGB(60,0,60),D,RGB(60,80,60));
{----- MACD (12,26,9) -----}
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=2*(DIFF-DEA),LINETHICK0;
{----- MACD 背景柱子 -----}
Q:=100;
SZ:=MACD>REF(MACD,1);
XD:=MACD<REF(MACD,1);
STICKLINE(SZ,0,MACD*Q,1,0.05,0),COLOR0000CC;
STICKLINE(SZ,0,MACD*0.8*Q,1,0),COLOR0011FF;
STICKLINE(SZ,0,MACD*0.6*Q,1,0),COLOR0055FF;
STICKLINE(SZ,0,MACD*0.4*Q,1,0),COLOR0099FF;
STICKLINE(SZ,0,MACD*0.2*Q,1,0),COLOR00DDFF;
STICKLINE(XD,0,MACD*Q,1,0.05,0),COLORFF0000;
STICKLINE(XD,0,MACD*0.8*Q,1,0),COLORFF3311;
STICKLINE(XD,0,MACD*0.6*Q,1,0),COLORFF7733;
STICKLINE(XD,0,MACD*0.4*Q,1,0),COLOR999933;
STICKLINE(XD,0,MACD*0.2*Q,1,0),COLOR88DD00;
{----- KDJ 参考线 -----}
0,DOTLINE;
80,DOTLINE;
{----- 高抛低吸信号 -----}
SJ:=WMA(((2*C+H+L)/4-LLV(L,5))/(HHV(H,5)-LLV(L,5))*100,2);
ZJ:=WMA(0.618*REF(SJ,1)+0.382*SJ,2);
MR:=CROSS(SJ,ZJ) AND SJ<30;
MC:=CROSS(ZJ,SJ) AND SJ>70;
AA8:=100*EMA(EMA(C-REF(C,1),8),5)/EMA(EMA(ABS(C-REF(C,1)),8),5);
买:=LLV(AA8,2)=LLV(AA8,8) AND COUNT(AA8<0,2) AND CROSS(AA8,WMA(AA8,2));
卖:=HHV(AA8,2)=HHV(AA8,8) AND COUNT(AA8>0,2) AND CROSS(WMA(AA8,2),AA8);
DRAWTEXT(MR ,J,'↖加仓1'),COLOR00FFFF;
DRAWTEXT(FILTER(买,5),J,'↖加仓2'),COLOR00FFFF;
DRAWTEXT(MC,J,'↙减仓1'),COLOR00FF00;
DRAWTEXT(FILTER(卖,5),J,'↙减仓2'),COLOR00FF00;
说明
- 把
MACD改成了 EMA(更常用),柱子颜色保持原样,只是把STICKLINE参数统一为WIDTH, OFFSET。- 去掉了一些重复的
DRAWBAND、SMA、J绘图语句,使代码更简洁。- 如仍想使用 WMA,只需把
EMA换回WMA即可。
6. 交易思路提示(仅作参考)
| 信号 | 解释 | 可能的操作 |
|---|---|---|
| ↖加仓1(MR) | KDJ 的 J 低于 30,且 SJ 上穿 ZJ,表明价格进入超卖区后出现转强信号 | 可以视为 逢低买入 或 加仓 |
| ↖加仓2(买) | 基于 8‑日动量 AA8 由负转正,且形成底部抬高 |
买入确认,建议配合成交量或形态 |
| ↙减仓1(MC) | KDJ 的 J 高于 80,且 SJ 下穿 ZJ,表明价格进入超买区后出现转弱信号 | 考虑 减仓 或 止盈 |
| ↙减仓2(卖) | 基于 8‑日动量 AA8 由正转负,且形成顶部下降 |
卖出信号,建议配合其他指标确认 |
注意:所有指标都有 滞后性,尤其 MACD 与 KDJ 都是 趋势/动量 指标,单一信号不应作为唯一买卖依据。建议结合 成交量、均线、布林带、形态 等进行二次确认。
7. 小结
- 代码结构:KDJ → MACD → 背景柱子 → 高抛低吸信号 → 辅助线。
- 使用方法:新建幅图指标 → 粘贴代码 → 保存 → 在行情图 “叠加指标” 中选择 → 查看图形与文字信号。
- 调参:KDJ 周期(默认 9),MACD 周期(12、26、9),以及柱子放大因子
Q。 - 常见错误:STICKLINE 参数写错(
1.0.05)→ 改为1,0.05;重复绘图语句可保留但不影响运行。 - 改进:可以把 MACD 换成 EMA,修正 STICKLINE,或把信号搬到主图。