MT5指标编译通过 · EX5 14KB 自动发布 39 0

黄金多周期趋势突破交易指标

congwei174·9 天前发布

M5 双通道趋势+M1 精确突破,MACD 零轴过滤,画箭头提示做多做空

黄金多周期趋势突破交易指标

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

XAUUSD_M1_MultiTF_Breakout.mq5274 行
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
#property copyright "XAUOF 指标工坊"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

// 做多信号箭头(上箭头)
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLime
#property indicator_width1  3
#property indicator_label1  "做多信号"

// 做空信号箭头(下箭头)
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_width2  3
#property indicator_label2  "做空信号"

//--- 可调参数
input int    M5_EMA_Period     = 200;  // M5 图表趋势过滤 EMA 周期
input int    M1_Fast_EMA       = 7;    // M1 图表快速 EMA 周期(突破通道)
input int    M1_Slow_EMA       = 63;   // M1 图表慢速 EMA 周期(趋势过滤)
input int    MACD_Fast         = 12;   // MACD 快线周期
input int    MACD_Slow         = 26;   // MACD 慢线周期
input int    MACD_Signal       = 9;    // MACD 信号线周期
input int    Arrow_Gap         = 20;   // 箭头与 K 线的间距(点数)

//--- 指标缓冲区
double UpArrow[];    // 做多箭头
double DnArrow[];    // 做空箭头

//--- 指标句柄(全局变量)
int handle_M5_EMA_High;   // M5 图表基于 High 的 200 EMA
int handle_M5_EMA_Low;    // M5 图表基于 Low 的 200 EMA
int handle_M1_EMA_Fast_High;  // M1 图表快速 EMA 基于 High
int handle_M1_EMA_Fast_Low;   // M1 图表快速 EMA 基于 Low
int handle_M1_EMA_Slow;       // M1 图表慢速 EMA 基于 Close
int handle_MACD;              // MACD 指标句柄

//--- 辅助数组(用于存储指标值)
double m5_ema_high[];
double m5_ema_low[];
double m1_ema_fast_high[];
double m1_ema_fast_low[];
double m1_ema_slow[];
double macd_main[];
double macd_signal[];

//+------------------------------------------------------------------+
//| 自定义指标初始化函数                                              |
//+------------------------------------------------------------------+
int OnInit()
{
   //--- 绑定指标缓冲区
   SetIndexBuffer(0, UpArrow, INDICATOR_DATA);
   SetIndexBuffer(1, DnArrow, INDICATOR_DATA);
   
   //--- 设置箭头样式
   PlotIndexSetInteger(0, PLOT_ARROW, 233);  // 上箭头
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_ARROW, 234);  // 下箭头
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   
   //--- 创建 M5 图表的 EMA 句柄(基于 High 和 Low)
   handle_M5_EMA_High = iMA(_Symbol, PERIOD_M5, M5_EMA_Period, 0, MODE_EMA, PRICE_HIGH);
   if(handle_M5_EMA_High == INVALID_HANDLE)
   {
      Print("创建 M5 EMA(High) 句柄失败");
      return INIT_FAILED;
   }
   
   handle_M5_EMA_Low = iMA(_Symbol, PERIOD_M5, M5_EMA_Period, 0, MODE_EMA, PRICE_LOW);
   if(handle_M5_EMA_Low == INVALID_HANDLE)
   {
      Print("创建 M5 EMA(Low) 句柄失败");
      return INIT_FAILED;
   }
   
   //--- 创建 M1 图表的 EMA 句柄
   handle_M1_EMA_Fast_High = iMA(_Symbol, PERIOD_M1, M1_Fast_EMA, 0, MODE_EMA, PRICE_HIGH);
   if(handle_M1_EMA_Fast_High == INVALID_HANDLE)
   {
      Print("创建 M1 快速 EMA(High) 句柄失败");
      return INIT_FAILED;
   }
   
   handle_M1_EMA_Fast_Low = iMA(_Symbol, PERIOD_M1, M1_Fast_EMA, 0, MODE_EMA, PRICE_LOW);
   if(handle_M1_EMA_Fast_Low == INVALID_HANDLE)
   {
      Print("创建 M1 快速 EMA(Low) 句柄失败");
      return INIT_FAILED;
   }
   
   handle_M1_EMA_Slow = iMA(_Symbol, PERIOD_M1, M1_Slow_EMA, 0, MODE_EMA, PRICE_CLOSE);
   if(handle_M1_EMA_Slow == INVALID_HANDLE)
   {
      Print("创建 M1 慢速 EMA 句柄失败");
      return INIT_FAILED;
   }
   
   //--- 创建 MACD 句柄
   handle_MACD = iMACD(_Symbol, PERIOD_M1, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   if(handle_MACD == INVALID_HANDLE)
   {
      Print("创建 MACD 句柄失败");
      return INIT_FAILED;
   }
   
   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[])
{
   //--- 检查数据是否足够
   if(rates_total < M5_EMA_Period + M1_Slow_EMA)
      return 0;
   
   //--- 检查指标是否计算完成
   if(BarsCalculated(handle_M5_EMA_High) < rates_total) return 0;
   if(BarsCalculated(handle_M5_EMA_Low) < rates_total) return 0;
   if(BarsCalculated(handle_M1_EMA_Fast_High) < rates_total) return 0;
   if(BarsCalculated(handle_M1_EMA_Fast_Low) < rates_total) return 0;
   if(BarsCalculated(handle_M1_EMA_Slow) < rates_total) return 0;
   if(BarsCalculated(handle_MACD) < rates_total) return 0;
   
   //--- 调整数组大小
   ArrayResize(m5_ema_high, rates_total);
   ArrayResize(m5_ema_low, rates_total);
   ArrayResize(m1_ema_fast_high, rates_total);
   ArrayResize(m1_ema_fast_low, rates_total);
   ArrayResize(m1_ema_slow, rates_total);
   ArrayResize(macd_main, rates_total);
   ArrayResize(macd_signal, rates_total);
   
   //--- 拷贝指标数据
   if(CopyBuffer(handle_M5_EMA_High, 0, 0, rates_total, m5_ema_high) < rates_total) return 0;
   if(CopyBuffer(handle_M5_EMA_Low, 0, 0, rates_total, m5_ema_low) < rates_total) return 0;
   if(CopyBuffer(handle_M1_EMA_Fast_High, 0, 0, rates_total, m1_ema_fast_high) < rates_total) return 0;
   if(CopyBuffer(handle_M1_EMA_Fast_Low, 0, 0, rates_total, m1_ema_fast_low) < rates_total) return 0;
   if(CopyBuffer(handle_M1_EMA_Slow, 0, 0, rates_total, m1_ema_slow) < rates_total) return 0;
   if(CopyBuffer(handle_MACD, 0, 0, rates_total, macd_main) < rates_total) return 0;
   if(CopyBuffer(handle_MACD, 1, 0, rates_total, macd_signal) < rates_total) return 0;
   
   //--- 确定起始位置
   int start = (prev_calculated > 0) ? prev_calculated - 1 : M5_EMA_Period + M1_Slow_EMA;
   
   //--- 首次计算时初始化箭头缓冲区
   if(prev_calculated == 0)
   {
      ArrayInitialize(UpArrow, EMPTY_VALUE);
      ArrayInitialize(DnArrow, EMPTY_VALUE);
   }
   
   //--- 主循环:逐根 K 线计算信号
   for(int i = start; i < rates_total && !IsStopped(); i++)
   {
      //--- 默认无信号
      UpArrow[i] = EMPTY_VALUE;
      DnArrow[i] = EMPTY_VALUE;
      
      //--- 需要前一根 K 线数据,索引 0 位置无法判断
      if(i < 1) continue;
      
      //--- 获取当前 M1 K 线对应的 M5 K 线时间
      datetime m1_time = time[i];
      int m5_bar = iBarShift(_Symbol, PERIOD_M5, m1_time);
      if(m5_bar < 0) continue;  // M5 数据不足
      
      //--- 读取 M5 趋势通道值(当前 M1 K 线对应的 M5 K 线)
      double m5_high_ema = m5_ema_high[i];
      double m5_low_ema = m5_ema_low[i];
      
      //--- 判断 M5 大趋势方向
      bool m5_uptrend = (close[i] > m5_high_ema);   // 收盘价在 M5 上轨上方,多头趋势
      bool m5_downtrend = (close[i] < m5_low_ema);  // 收盘价在 M5 下轨下方,空头趋势
      
      //--- 读取 M1 快速 EMA 通道和慢速 EMA
      double m1_fast_high = m1_ema_fast_high[i];
      double m1_fast_low = m1_ema_fast_low[i];
      double m1_slow = m1_ema_slow[i];
      
      //--- 读取 MACD 数值
      double macd_curr = macd_main[i];
      double macd_prev = macd_main[i-1];
      double signal_curr = macd_signal[i];
      double signal_prev = macd_signal[i-1];
      
      //--- 做多信号条件:
      // 1. M5 大趋势为多头(收盘价 > M5 上轨)
      // 2. M1 收盘价突破 M1 快速 EMA 上轨(前一根在下方或等于,当前在上方)
      // 3. M1 收盘价在慢速 EMA 上方(趋势过滤)
      // 4. MACD 主线在零轴上方
      // 5. MACD 金叉(主线从下方穿越信号线)
      bool long_signal = false;
      if(m5_uptrend)
      {
         bool breakout_up = (close[i-1] <= m1_fast_high && close[i] > m1_fast_high);
         bool above_slow = (close[i] > m1_slow);
         bool macd_above_zero = (macd_curr > 0);
         bool macd_golden_cross = (macd_prev <= signal_prev && macd_curr > signal_curr);
         
         if(breakout_up && above_slow && macd_above_zero && macd_golden_cross)
         {
            long_signal = true;
         }
      }
      
      //--- 做空信号条件:
      // 1. M5 大趋势为空头(收盘价 < M5 下轨)
      // 2. M1 收盘价突破 M1 快速 EMA 下轨(前一根在上方或等于,当前在下方)
      // 3. M1 收盘价在慢速 EMA 下方(趋势过滤)
      // 4. MACD 主线在零轴下方
      // 5. MACD 死叉(主线从上方穿越信号线)
      bool short_signal = false;
      if(m5_downtrend)
      {
         bool breakout_down = (close[i-1] >= m1_fast_low && close[i] < m1_fast_low);
         bool below_slow = (close[i] < m1_slow);
         bool macd_below_zero = (macd_curr < 0);
         bool macd_death_cross = (macd_prev >= signal_prev && macd_curr < signal_curr);
         
         if(breakout_down && below_slow && macd_below_zero && macd_death_cross)
         {
            short_signal = true;
         }
      }
      
      //--- 画箭头
      if(long_signal)
      {
         UpArrow[i] = low[i] - Arrow_Gap * _Point;
      }
      
      if(short_signal)
      {
         DnArrow[i] = high[i] + Arrow_Gap * _Point;
      }
   }
   
   return rates_total;
}

//+------------------------------------------------------------------+
//| 指标析构函数                                                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   //--- 释放指标句柄
   if(handle_M5_EMA_High != INVALID_HANDLE)
      IndicatorRelease(handle_M5_EMA_High);
   if(handle_M5_EMA_Low != INVALID_HANDLE)
      IndicatorRelease(handle_M5_EMA_Low);
   if(handle_M1_EMA_Fast_High != INVALID_HANDLE)
      IndicatorRelease(handle_M1_EMA_Fast_High);
   if(handle_M1_EMA_Fast_Low != INVALID_HANDLE)
      IndicatorRelease(handle_M1_EMA_Fast_Low);
   if(handle_M1_EMA_Slow != INVALID_HANDLE)
      IndicatorRelease(handle_M1_EMA_Slow);
   if(handle_MACD != INVALID_HANDLE)
      IndicatorRelease(handle_MACD);
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
黄金多周期趋势突破交易指标 在 MT5 上的真实截图

作品说明

根据描述,这是一个结合多时间周期趋势确认和精确入场点捕捉的黄金交易指标。核心逻辑是:M5 图表的 200 周期 EMA 双通道(基于最高价和最低价)判断大趋势方向,然后在 M1 图表上通过 7 周期 EMA 通道突破、63 周期 EMA 过滤以及 MACD 的零轴和金叉/死叉状态来确认入场信号,做多信号画上箭头,做空信号画下箭头。

使用说明

  1. 安装步骤:
  • 将代码保存为 XAUUSD_M1_MultiTF_Breakout.mq5
  • 放入 MT5 的 MQL5\Indicators 目录
  • 在 MetaEditor 中编译(F7)
  • 在 MT5 导航器窗口的"指标"中找到该指标,拖到 XAUUSD M1 图表上
  1. 参数说明:
  • M5_EMA_Period:M5 图表趋势过滤 EMA 周期,默认 200,用于判断大趋势
  • M1_Fast_EMA:M1 快速 EMA 周期,默认 7,形成突破通道
  • M1_Slow_EMA:M1 慢速 EMA 周期,默认 63,用于趋势方向过滤
  • MACD 参数:标准 MACD(12,26,9),用于确认动量和金叉/死叉
  • Arrow_Gap:箭头距离 K 线的间距,可根据图表缩放调整
  1. 信号识别:
  • 绿色上箭头:做多信号,满足 M5 多头趋势 + M1 向上突破 + 慢线过滤 + MACD 零轴上方金叉
  • 红色下箭头:做空信号,满足 M5 空头趋势 + M1 向下突破 + 慢线过滤 + MACD 零轴下方死叉
  1. 注意事项:
  • 本指标专为黄金 M1 图表设计,其他品种或周期需调整参数
  • 信号条件较为严格(多重过滤),可能出现信号较少但质量较高的情况
  • 建议结合止损止盈规则使用,指标仅提示入场点,不包含出场逻辑
  • 历史回测时注意 M5 数据加载完整性,确保多时间周期计算准确
  • 实盘使用前务必在模拟账户充分测试

AI 解读根据源码逐行分析写成,供参考,以实际运行为准

这是什么

这是一个专为黄金 M1 图表设计的多周期趋势突破指标。它用 M5 图表的 200 周期 EMA 双通道判断大趋势方向,然后在 M1 图表上通过 7 周期 EMA 通道突破、63 周期 EMA 过滤以及 MACD 的零轴和金叉死叉状态来确认入场信号,满足条件时在图表上画绿色上箭头(做多)或红色下箭头(做空)。

逻辑原理

指标同时读取 M5 和 M1 两个时间周期的数据。M5 级别用 200 周期 EMA 分别计算最高价和最低价,形成一个趋势通道:当前 M1 收盘价在 M5 上轨上方判定为多头趋势,在下轨下方判定为空头趋势。

M1 级别用 7 周期 EMA 分别计算最高价和最低价形成快速突破通道,用 63 周期 EMA 计算收盘价作为趋势过滤线,同时调用标准 MACD(12,26,9) 指标。

做多信号需要同时满足五个条件:M5 多头趋势、M1 收盘价向上突破 7 周期 EMA 上轨(前一根在轨下或等于,当前在轨上)、M1 收盘价在 63 周期 EMA 上方、MACD 主线在零轴上方、MACD 主线从下方穿越信号线(金叉)。

做空信号需要同时满足五个条件:M5 空头趋势、M1 收盘价向下突破 7 周期 EMA 下轨(前一根在轨上或等于,当前在轨下)、M1 收盘价在 63 周期 EMA 下方、MACD 主线在零轴下方、MACD 主线从上方穿越信号线(死叉)。

参数说明

  • M5_EMA_Period(默认 200):M5 图表趋势过滤 EMA 周期,值越大趋势越平滑,过大会滞后,过小会频繁切换。
  • M1_Fast_EMA(默认 7):M1 快速 EMA 周期,用于形成突破通道,值越小通道越敏感,信号越多但假突破也增加。
  • M1_Slow_EMA(默认 63):M1 慢速 EMA 周期,用于趋势方向过滤,值越大过滤越严格,信号越少。
  • MACD_Fast(默认 12)、MACD_Slow(默认 26)、MACD_Signal(默认 9):标准 MACD 参数,用于动量确认和金叉死叉判断,不建议修改。
  • Arrow_Gap(默认 20):箭头与 K 线的间距点数,纯粹显示效果,可根据图表缩放调整。

怎么用

将代码保存为 .mq5 文件,放入 MT5 的 MQL5\Indicators 目录,在 MetaEditor 中编译后拖到 XAUUSD 的 M1 图表上。指标会自动调用 M5 数据,无需切换周期。

绿色上箭头出现在 K 线下方表示做多信号,红色下箭头出现在 K 线上方表示做空信号。箭头画在信号 K 线收盘时,历史回测和实盘都不会重绘。指标只提示入场点,不包含止损止盈和出场逻辑,需自行设计资金管理规则。

适用场景

适合黄金(XAUUSD)M1 图表的趋势突破交易,尤其是欧美盘活跃时段。参数默认值针对 M1 周期设计,其他品种或周期需重新测试调整。

由于指标结合了 M5 趋势过滤、M1 双 EMA 通道、慢速 EMA 和 MACD 四重条件,信号条件严格,出现频率较低,适合喜欢高质量信号、不喜欢频繁交易的人。单边趋势行情中表现较好,震荡市信号会更少。

不适合高频剥头皮(信号太少)、高波动的新闻行情(滑点和假突破风险大)、非黄金品种(参数未针对其他品种优化)。

风险提示

多重过滤导致滞后:五个条件同时满足时,价格可能已经走了一段,入场点不一定在突破初期。

信号稀少:严格的过滤条件会让信号数量减少,可能一天只有几次甚至没有,不适合希望频繁交易的人。

M5 数据依赖:指标需要读取 M5 历史数据,首次加载或数据不全时可能无法正常计算,确保 M5 数据完整性。

无出场逻辑:指标只画入场箭头,不提示止损止盈和出场点,必须自行制定资金管理和离场策略,否则即使入场准确也可能亏损。

参数敏感性:默认参数针对黄金 M1 调试,其他品种或周期直接使用可能失效,需要重新回测优化。

无报警功能:代码中没有实现声音提示或推送通知,需要盯盘或自行添加报警代码。

常见问题

这个指标会重绘吗?
不会重绘。所有信号判断都基于已完成的 K 线数据,箭头画在收盘时,历史信号和实盘信号一致。
可以用在黄金以外的品种吗?
代码没有品种限制,但参数默认值是针对黄金 M1 优化的,其他品种(如外汇、原油、指数)直接使用效果可能很差,需要重新测试和调整参数。
MT4 能用吗?
不能。这是 MQL5 代码,只能在 MetaTrader 5 平台使用,MT4 无法运行。
信号太少怎么办?
这是多重过滤的结果。如果想增加信号频率,可以降低 M5_EMA_Period(比如改为 100)或 M1_Slow_EMA(比如改为 30),但信号质量可能下降,需要自行回测验证。
参数默认值适合什么周期?
默认参数专为 M1 图表设计。如果想用在 M5 或更高周期,需要同步调整所有 EMA 周期参数,M5 图表可以尝试 M5_EMA_Period=50、M1_Fast_EMA 改为 M5_Fast_EMA=3、M1_Slow_EMA 改为 M5_Slow_EMA=21,但仍需回测。

XAUUSD Multi-Timeframe EMA Breakout Indicator for MT5

A multi-timeframe indicator combining M5 dual-EMA trend filter with M1 precise breakout signals and MACD confirmation. Displays long/short entry arrows on M1 chart for gold trading with strict multi-condition filtering.

Source code is shown above. Compiled EX5 files are available to VIP members.

评论

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

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