这个MACD叠加主图指标的核心思路是将MACD指标的计算结果直接呈现在主图(K线图)上,通过不同颜色的柱状线直观展示多空力量对比。我们先拆解源码中的关键部分:
pascal复制RC:=DYNAINFO(3)*1.1;
DK:="MACD.MACD"(60,130,45)*2;
控盘:=DK;
这里DYNAINFO(3)获取的是当日最低价,RC变量将其放大10%作为参考基准线。MACD指标采用60、130、45作为参数(非常规参数),并将结果放大2倍增强可视化效果。
指标通过四种颜色的柱状线区分不同市场状态:
pascal复制STICKLINE(控盘<0 AND 控盘<REF(控盘,1),控盘+RC,RC,0.05,0),COLORLIBLUE; // 空头强化
STICKLINE(控盘<0 AND 控盘>REF(控盘,1),控盘+RC,RC,0.05,0),COLORWHITE; // 空头减弱
STICKLINE(控盘>REF(控盘,1) AND 控盘>0,控盘+RC,RC,0.05,0),COLORRED; // 多头强化
STICKLINE(控盘<REF(控盘,1) AND 控盘>0,控盘+RC,RC,0.05,0),COLOR00FF00; // 多头减弱
关键点:柱状线从RC基准线开始绘制,向上延伸的高度由控盘值决定。这种设计让MACD指标与价格走势在同一坐标系呈现,便于直观对比。
源码后半部分实现了超跌反弹识别功能:
pascal复制KS:=(C-MA(C,13))/MA(C,13)*(-100);
RKS:=REF(KS,1);
MLS:=RKS/KS>=1.23 AND RKS>=8 AND C/REF(C,1)>=1.02;
当价格偏离13日均线超过8%且当日涨幅达2%时,触发反弹信号。可视化采用洋红色柱体标识:
pascal复制反弹:STICKLINE(MLS=1,H,L,0,1),COLORMAGENTA,LINETHICK1;
STICKLINE(MLS=1,O,C,7,1),COLORMAGENTA,LINETHICK1;
MACD参数调整:
pascal复制INPUT: L(12,5,60), S(26,10,130), M(9,5,45);
DK:="MACD.MACD"(L,S,M)*2;
灵敏度调节:
pascal复制// 调整系数可改变信号灵敏度
INPUT: Factor(2,1,5);
DK:="MACD.MACD"(60,130,45)*Factor;
python复制import talib
import numpy as np
def calculate_macd(close_prices, fast=60, slow=130, signal=45):
macd, signal, hist = talib.MACD(close_prices,
fastperiod=fast,
slowperiod=slow,
signalperiod=signal)
return hist * 2 # 对应源码中的DK变量
def detect_rebound(close_prices):
ma13 = talib.MA(close_prices, timeperiod=13)
ks = (close_prices[-1] - ma13[-1]) / ma13[-1] * -100
rks = (close_prices[-2] - ma13[-2]) / ma13[-2] * -100
return rks/ks >= 1.23 and rks >=8 and close_prices[-1]/close_prices[-2]>=1.02
java复制// 使用TA4J库实现MACD计算
Indicator<Num> macd = new MACDIndicator(closePriceIndicator, 60, 130, 45);
Num dk = macd.getValue(0).multipliedBy(2);
// 超跌反弹检测
Decimal ks = currentClose.subtract(ma13).dividedBy(ma13).multipliedBy(-100);
Decimal rks = previousClose.subtract(previousMA13).dividedBy(previousMA13).multipliedBy(-100);
boolean reboundSignal = rks.dividedBy(ks).isGreaterThanOrEqual(1.23)
&& rks.isGreaterThanOrEqual(8)
&& currentClose.dividedBy(previousClose).isGreaterThanOrEqual(1.02);
使用ECharts实现类似效果的核心配置:
javascript复制option = {
series: [{
type: 'candlestick',
data: klineData,
itemStyle: {
color: '#ef232a',
color0: '#14b143',
borderColor: '#ef232a',
borderColor0: '#14b143'
}
},{
type: 'bar',
data: macdData.map(item => {
let color;
if(item.value < 0 && item.value < item.previous) color = '#3398DB';
else if(item.value < 0 && item.value > item.previous) color = '#FFFFFF';
else if(item.value > 0 && item.value > item.previous) color = '#EF232A';
else color = '#00FF00';
return {value: item.value, itemStyle: {color}};
}),
barWidth: '60%'
}]
};
趋势确认技巧:
信号过滤方法:
pascal复制// 增加成交量确认条件
有效买入:=控盘>REF(控盘,1) AND 控盘>0 AND V>MA(V,20);
STICKLINE(有效买入,控盘+RC,RC,0.08,0),COLORRED;
多周期验证:
指标不显示问题:
信号闪烁问题:
pascal复制// 增加信号确认机制
稳定信号:=BARSLAST(控盘>REF(控盘,1))>=3;
DRAWICON(稳定信号 AND 控盘>0,LOW*0.98,1);
参数优化建议:
计算效率提升:
pascal复制// 使用快速计算模式
SETCALCMODE(1);
RC:DYNAINFO(3)*1.1;
内存管理技巧:
SETNBARS(1000);SHOWINDICATOR(0);多品种适配:
pascal复制// 自动适配不同品种的波动率
INPUT: Scale(1,0.1,10);
DK:="MACD.MACD"(60,130,45)*2*Scale;
量化交易信号:
python复制def generate_signal(df):
df['macd'] = talib.MACD(df.close, 60,130,45)[2]*2
df['signal'] = np.where((df.macd > df.macd.shift(1)) & (df.macd > 0), 1,
np.where((df.macd < df.macd.shift(1)) & (df.macd < 0), -1, 0))
return df
多指标协同:
pascal复制// 结合RSI过滤假信号
安全买入:=控盘>REF(控盘,1) AND 控盘>0 AND RSI(14)<70;
DRAWICON(安全买入,LOW,1);
跨市场应用: