MACD背离动能衰减交易系统
识别MACD背离+动能衰减,标出做多做空信号及止盈止损位
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots 6
// 做多信号(蓝色上箭头)
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrBlue
#property indicator_width1 3
#property indicator_label1 "做多信号"
// 做空信号(红色下箭头)
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_width2 3
#property indicator_label2 "做空信号"
// 多单止盈(绿色圆点)
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrLime
#property indicator_width3 2
#property indicator_label3 "多单止盈"
// 多单止损(橙色圆点)
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrOrange
#property indicator_width4 2
#property indicator_label4 "多单止损"
// 空单止盈(绿色圆点)
#property indicator_type5 DRAW_ARROW
#property indicator_color5 clrLime
#property indicator_width5 2
#property indicator_label5 "空单止盈"
// 空单止损(橙色圆点)
#property indicator_type6 DRAW_ARROW
#property indicator_color6 clrOrange
#property indicator_width6 2
#property indicator_label6 "空单止损"
//--- 输入参数
input int MACD_Fast = 12; // MACD快线周期
input int MACD_Slow = 26; // MACD慢线周期
input int MACD_Signal = 9; // MACD信号线周期
input int Lookback = 20; // 背离回溯K线数(寻找前期高低点)
input int MomentumBars = 3; // 动能衰减判断K线数(柱状图连续缩小)
input double RiskReward = 2.0; // 盈亏比(止盈是止损的倍数)
input int ArrowDistance = 50; // 箭头与K线的距离(点数)
input bool OnlyDivergence = false; // 是否必须有背离(false=动能衰减也可触发)
//--- 指标缓冲区
double BuySignal[]; // 做多箭头
double SellSignal[]; // 做空箭头
double BuyTP[]; // 多单止盈
double BuySL[]; // 多单止损
double SellTP[]; // 空单止盈
double SellSL[]; // 空单止损
//--- 全局变量
int macdHandle; // MACD指标句柄
double macdMain[]; // MACD主线
double macdSignal[]; // MACD信号线
double macdHist[]; // MACD柱状图
//+------------------------------------------------------------------+
//| 初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 创建MACD指标句柄
macdHandle = iMACD(_Symbol, PERIOD_CURRENT, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
if(macdHandle == INVALID_HANDLE)
{
Print("创建MACD指标失败");
return INIT_FAILED;
}
// 绑定指标缓冲区
SetIndexBuffer(0, BuySignal, INDICATOR_DATA);
SetIndexBuffer(1, SellSignal, INDICATOR_DATA);
SetIndexBuffer(2, BuyTP, INDICATOR_DATA);
SetIndexBuffer(3, BuySL, INDICATOR_DATA);
SetIndexBuffer(4, SellTP, INDICATOR_DATA);
SetIndexBuffer(5, SellSL, INDICATOR_DATA);
// 设置箭头样式
PlotIndexSetInteger(0, PLOT_ARROW, 233); // 上箭头
PlotIndexSetInteger(1, PLOT_ARROW, 234); // 下箭头
PlotIndexSetInteger(2, PLOT_ARROW, 159); // 圆点
PlotIndexSetInteger(3, PLOT_ARROW, 159); // 圆点
PlotIndexSetInteger(4, PLOT_ARROW, 159); // 圆点
PlotIndexSetInteger(5, PLOT_ARROW, 159); // 圆点
// 设置空值
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(5, PLOT_EMPTY_VALUE, EMPTY_VALUE);
// 设置数组为动态
ArraySetAsSeries(macdMain, false);
ArraySetAsSeries(macdSignal, false);
ArraySetAsSeries(macdHist, false);
IndicatorSetString(INDICATOR_SHORTNAME, "MACD背离动能");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 计算函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// 检查MACD数据是否准备好
if(BarsCalculated(macdHandle) < rates_total)
return 0;
// 调整数组大小
ArrayResize(macdMain, rates_total);
ArrayResize(macdSignal, rates_total);
ArrayResize(macdHist, rates_total);
// 拷贝MACD数据
if(CopyBuffer(macdHandle, 0, 0, rates_total, macdMain) < rates_total)
return 0;
if(CopyBuffer(macdHandle, 1, 0, rates_total, macdSignal) < rates_total)
return 0;
// 计算柱状图
for(int i = 0; i < rates_total; i++)
macdHist[i] = macdMain[i] - macdSignal[i];
// 确定开始位置
int start = (prev_calculated > 0) ? prev_calculated - 1 : Lookback + MomentumBars;
// 初始化缓冲区
if(prev_calculated == 0)
{
ArrayInitialize(BuySignal, EMPTY_VALUE);
ArrayInitialize(SellSignal, EMPTY_VALUE);
ArrayInitialize(BuyTP, EMPTY_VALUE);
ArrayInitialize(BuySL, EMPTY_VALUE);
ArrayInitialize(SellTP, EMPTY_VALUE);
ArrayInitialize(SellSL, EMPTY_VALUE);
}
// 主循环
for(int i = start; i < rates_total && !IsStopped(); i++)
{
// 默认清空信号
BuySignal[i] = EMPTY_VALUE;
SellSignal[i] = EMPTY_VALUE;
BuyTP[i] = EMPTY_VALUE;
BuySL[i] = EMPTY_VALUE;
SellTP[i] = EMPTY_VALUE;
SellSL[i] = EMPTY_VALUE;
// 需要足够历史数据
if(i < Lookback + MomentumBars)
continue;
// 检查动能衰减(柱状图绝对值连续缩小)
bool momentumDecay = true;
for(int j = 1; j < MomentumBars && i - j >= 0; j++)
{
if(MathAbs(macdHist[i - j + 1]) <= MathAbs(macdHist[i - j]))
{
momentumDecay = false;
break;
}
}
if(!momentumDecay && !OnlyDivergence)
continue;
// 检查看涨背离(价格新低,MACD柱状图不创新低)
bool bullishDiv = false;
if(macdHist[i] < 0) // 当前在零轴下方
{
// 寻找回溯期内的价格最低点和MACD柱最低点
int priceLowBar = i;
int macdLowBar = i;
double priceLowest = low[i];
double macdLowest = macdHist[i];
for(int j = 1; j <= Lookback && i - j >= 0; j++)
{
if(low[i - j] < priceLowest)
{
priceLowest = low[i - j];
priceLowBar = i - j;
}
if(macdHist[i - j] < macdLowest)
{
macdLowest = macdHist[i - j];
macdLowBar = i - j;
}
}
// 背离条件:价格创新低,但MACD柱未创新低(或当前更高)
if(low[i] <= priceLowest && macdHist[i] > macdLowest)
bullishDiv = true;
}
// 检查看跌背离(价格新高,MACD柱状图不创新高)
bool bearishDiv = false;
if(macdHist[i] > 0) // 当前在零轴上方
{
// 寻找回溯期内的价格最高点和MACD柱最高点
int priceHighBar = i;
int macdHighBar = i;
double priceHighest = high[i];
double macdHighest = macdHist[i];
for(int j = 1; j <= Lookback && i - j >= 0; j++)
{
if(high[i - j] > priceHighest)
{
priceHighest = high[i - j];
priceHighBar = i - j;
}
if(macdHist[i - j] > macdHighest)
{
macdHighest = macdHist[i - j];
macdHighBar = i - j;
}
}
// 背离条件:价格创新高,但MACD柱未创新高(或当前更低)
if(high[i] >= priceHighest && macdHist[i] < macdHighest)
bearishDiv = true;
}
double arrowGap = ArrowDistance * _Point;
// 做多信号:看涨背离 + 动能衰减
if((bullishDiv || !OnlyDivergence) && momentumDecay && macdHist[i] < 0)
{
BuySignal[i] = low[i] - arrowGap;
// 计算止损止盈
double entryPrice = close[i];
double stopLoss = low[i] - 5 * _Point; // 止损设在近期低点下方
for(int j = 1; j <= 5 && i - j >= 0; j++)
{
if(low[i - j] < stopLoss)
stopLoss = low[i - j] - 5 * _Point;
}
double riskPips = entryPrice - stopLoss;
if(riskPips > 0)
{
double takeProfit = entryPrice + riskPips * RiskReward;
BuySL[i] = stopLoss;
BuyTP[i] = takeProfit;
}
}
// 做空信号:看跌背离 + 动能衰减
if((bearishDiv || !OnlyDivergence) && momentumDecay && macdHist[i] > 0)
{
SellSignal[i] = high[i] + arrowGap;
// 计算止损止盈
double entryPrice = close[i];
double stopLoss = high[i] + 5 * _Point; // 止损设在近期高点上方
for(int j = 1; j <= 5 && i - j >= 0; j++)
{
if(high[i - j] > stopLoss)
stopLoss = high[i - j] + 5 * _Point;
}
double riskPips = stopLoss - entryPrice;
if(riskPips > 0)
{
double takeProfit = entryPrice - riskPips * RiskReward;
SellSL[i] = stopLoss;
SellTP[i] = takeProfit;
}
}
}
return rates_total;
}
//+------------------------------------------------------------------+
//| 清理函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(macdHandle != INVALID_HANDLE)
IndicatorRelease(macdHandle);
}作品说明
这是一个结合 MACD 背离和动能衰减的交易系统指标。我会识别价格创新高/新低但 MACD 柱状图未跟随(背离),同时检测动能衰减(柱状图绝对值连续缩小),在高位做空、低位做多,并标出进场箭头、止盈止损位。
使用说明
安装方法
- 将代码保存为
MACD_Divergence_Momentum.mq5,放入 MT5 的MQL5/Indicators文件夹 - 在 MetaEditor 中编译,或重启 MT5 自动编译
- 在导航器窗口找到该指标,拖到图表上
参数调整
- MACD参数:默认 12/26/9,适合日线和4小时图,短周期可调小(如 5/13/5)
- 背离回溯K线数:默认 20 根,寻找前期高低点的范围,震荡行情可适当减小
- 动能衰减K线数:默认 3 根,要求柱状图连续缩小的 K 线数,越大信号越少但质量越高
- 盈亏比:默认 2.0,止盈是止损的 2 倍,可根据品种波动调整(黄金建议 1.5-2.5)
- 是否必须有背离:false 时动能衰减也可触发信号,true 时必须背离+动能衰减同时满足
信号解读
- 蓝色上箭头:做多信号,出现在低位看涨背离或动能衰减时
- 红色下箭头:做空信号,出现在高位看跌背离或动能衰减时
- 绿色圆点:止盈位,系统建议的获利目标
- 橙色圆点:止损位,系统建议的风险控制点
- 箭头出现时,对应的止盈止损点会同时显示在图表上
交易建议
- 信号出现后,下一根 K 线开盘入场,止损止盈按图表标注设置
- 最好在趋势末端或关键支撑阻力位附近使用,背离信号更可靠
- 结合更大周期趋势过滤,顺势交易成功率更高
- MACD 在零轴上方做空、零轴下方做多,确保在趋势极端位置
注意事项
- 该指标不会自动下单,只提供视觉信号和止盈止损参考
- 背离信号较少,如想增加信号频率可关闭"是否必须有背离"选项
- 止损位基于近期高低点,极端行情可能被快速触发,建议人工复核
- 黄金等贵金属建议在 H4 或 H1 周期使用,M15 以下噪音较多
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个结合 MACD 背离和动能衰减的 MT5 图表指标。它在价格创新高/新低但 MACD 柱状图未跟随时(背离),同时检测柱状图绝对值连续缩小(动能衰减),标出做多做空箭头和对应的止盈止损位。不会自动下单,只提供视觉信号。
逻辑原理
指标用标准 MACD(12/26/9)计算柱状图(主线减信号线),然后在每根 K 线检查两个条件:
背离识别:回溯指定 K 线数(默认 20 根),找前期高低点。看涨背离是价格创新低但 MACD 柱未创新低(当前柱比历史最低柱更高),看跌背离是价格创新高但 MACD 柱未创新高。代码要求当前 MACD 柱在零轴下方才检查看涨背离,在零轴上方才检查看跌背离。
动能衰减:检查最近 N 根 K 线(默认 3 根)的柱状图绝对值是否连续缩小,即 |柱2| < |柱1| < |当前柱|。满足条件说明多空力量在减弱。
信号触发:默认背离和动能衰减同时满足才出信号。如果关闭"是否必须有背离"参数,单独的动能衰减也能触发。做多信号要求 MACD 柱在零轴下方,做空信号要求在零轴上方。
止损止盈计算:进场价取当前收盘价。止损设在信号 K 线及前 5 根的最低点下方(做多)或最高点上方(做空),外推 5 个点。止盈按盈亏比(默认 2.0)计算,即止盈距离 = 止损距离 × 盈亏比。
参数说明
- MACD_Fast(12):MACD 快线周期,日线和 H4 用默认值,短周期如 M15 可改小到 5
- MACD_Slow(26):MACD 慢线周期,通常保持快慢线比例在 2:1 左右
- MACD_Signal(9):信号线周期,不建议改动
- Lookback(20):背离回溯 K 线数,找前期高低点的范围。震荡行情减小到 10-15,趋势行情可加大到 30
- MomentumBars(3):判断动能衰减的 K 线数,要求柱状图连续缩小。设为 2 信号更频繁但误报多,设为 4-5 信号少但质量高
- RiskReward(2.0):盈亏比,止盈是止损的倍数。黄金波动大建议 1.5-2.5,外汇对可用 2-3
- ArrowDistance(50):箭头与 K 线的距离(点数),纯显示效果,不影响逻辑
- OnlyDivergence(false):是否必须有背离。false 时动能衰减也可单独触发信号,true 时必须背离+动能同时满足
怎么用
将代码保存为 .mq5 文件放入 MT5 的 MQL5/Indicators 文件夹,重启 MT5 或在 MetaEditor 编译。在导航器找到该指标拖到任意图表,建议挂在 H4 或 H1 周期。
蓝色上箭头是做多信号,出现在低位;红色下箭头是做空信号,出现在高位。箭头出现时,对应的绿色圆点(止盈位)和橙色圆点(止损位)会同时标在图表上。下一根 K 线开盘入场,按图表标注设置止损止盈挂单或手动管理。
适用场景
适合震荡行情末端和趋势衰竭位置,例如价格在区间上下沿反复测试、或趋势推进多次但力度递减。MACD 在零轴上方出现看跌背离+动能衰减,说明上涨乏力;在零轴下方出现看涨背离+动能衰减,说明下跌乏力。
黄金(XAUUSD)、欧美(EURUSD)等主流品种在 H4 和 H1 表现较好,日内周期如 M15 噪音多、假信号频繁。最好在关键支撑阻力位附近使用,或结合更大周期趋势过滤(大周期向上只做多信号,向下只做空信号)。
不适合单边强趋势行情。背离在趋势中段常常失败,价格创新高后继续创新高是常态。也不适合极低波动的盘整期,动能衰减会频繁触发但没有实际方向。
风险提示
滞后性:MACD 和背离都是滞后指标,信号出现时价格可能已经走了一段,入场点不一定是最优位置。
假背离:短周期图上背离信号多但成功率低,尤其是单独的动能衰减(关闭背离要求时)。建议在更大周期确认方向,或只在关键位置操作。
止损过大:止损基于前 5 根 K 线极值,如果前期波动剧烈,止损距离会很大,导致盈亏比计算的止盈位过远。极端行情下止损可能被快速触发。
不会自动平仓:指标只标注建议的止盈止损位,不会自动管理订单。需要手动设置挂单或盯盘。
参数敏感:回溯期和动能衰减 K 线数对信号数量影响大。过小的参数会产生大量噪音信号,过大的参数可能错过机会。需要根据品种和周期回测优化。
常见问题
- 这个指标会重绘吗
- 不会。信号一旦出现就固定在该 K 线,不会因为后续价格变化而消失或移动。
- 可以用在黄金以外的品种吗
- 可以。代码没有品种限制,欧美、镑美、原油等主流品种都能用,但需根据各品种波动特点调整盈亏比和回溯期参数。
- 默认参数适合什么周期
- 默认 MACD 参数(12/26/9)和回溯期(20)适合 H4 和 H1 周期。日线可保持默认,M15 以下建议把 MACD 快慢线改小(如 5/13/5)、回溯期减到 10-15。
- 关闭背离要求后信号会变多吗
- 会。OnlyDivergence 设为 false 时,单独的动能衰减(柱状图连续缩小)也会触发信号,数量明显增加但假信号也更多,建议只在震荡行情使用。
- 止盈止损位是建议还是自动执行
- 仅供参考。指标只在图表上标出建议的止盈止损价格,不会自动下单或管理仓位,需要手动设置挂单或盯盘操作。
MACD Divergence Momentum Decay Trading System for MT5
This indicator detects MACD histogram divergence and momentum decay (consecutive shrinking bars). It plots buy/sell arrows at potential reversal points along with calculated TP/SL levels. Suitable for range-bound markets and trend exhaustion trades.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。