MT5指标编译通过 · EX5 15KB 自动发布 7 0

MACD背离动能衰减交易系统

chenkun5629·1 小时前发布

识别MACD背离+动能衰减,标出做多做空信号及止盈止损位

MACD背离动能衰减交易系统

MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子

MACD_Divergence_Momentum.mq5308
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#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);
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
MACD背离动能衰减交易系统 在 MT5 上的真实截图

作品说明

这是一个结合 MACD 背离和动能衰减的交易系统指标。我会识别价格创新高/新低但 MACD 柱状图未跟随(背离),同时检测动能衰减(柱状图绝对值连续缩小),在高位做空、低位做多,并标出进场箭头、止盈止损位。

使用说明

安装方法

  1. 将代码保存为 MACD_Divergence_Momentum.mq5,放入 MT5 的 MQL5/Indicators 文件夹
  2. 在 MetaEditor 中编译,或重启 MT5 自动编译
  3. 在导航器窗口找到该指标,拖到图表上

参数调整

  • MACD参数:默认 12/26/9,适合日线和4小时图,短周期可调小(如 5/13/5)
  • 背离回溯K线数:默认 20 根,寻找前期高低点的范围,震荡行情可适当减小
  • 动能衰减K线数:默认 3 根,要求柱状图连续缩小的 K 线数,越大信号越少但质量越高
  • 盈亏比:默认 2.0,止盈是止损的 2 倍,可根据品种波动调整(黄金建议 1.5-2.5)
  • 是否必须有背离:false 时动能衰减也可触发信号,true 时必须背离+动能衰减同时满足

信号解读

  • 蓝色上箭头:做多信号,出现在低位看涨背离或动能衰减时
  • 红色下箭头:做空信号,出现在高位看跌背离或动能衰减时
  • 绿色圆点:止盈位,系统建议的获利目标
  • 橙色圆点:止损位,系统建议的风险控制点
  • 箭头出现时,对应的止盈止损点会同时显示在图表上

交易建议

  1. 信号出现后,下一根 K 线开盘入场,止损止盈按图表标注设置
  2. 最好在趋势末端或关键支撑阻力位附近使用,背离信号更可靠
  3. 结合更大周期趋势过滤,顺势交易成功率更高
  4. 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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。