MT5EA / 策略编译通过 · EX5 44KB 自动发布 50 5

多周期多指标共振自动交易 EA

congwei174·8 天前发布

M1/M5/M15 均线共振 + RSI 强弱 + MACD 趋势,四重过滤开仓

多周期多指标共振自动交易 EA

效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准

Multi_TF_Multi_Indicator_EA.mq5355 行
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
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
#property copyright   "XAUOF 指标工坊"
#property version     "1.00"
#property strict

#include <Trade\Trade.mqh>

//--- 输入参数
input group "========== 均线参数 =========="
input int      Fast_Period = 7;           // 快速均线周期(EMA 7)
input int      Slow_Period = 63;          // 慢速均线周期(EMA 63)

input group "========== 多周期设置 =========="
input bool     Use_M1 = true;             // 启用 1 分钟周期
input bool     Use_M5 = true;             // 启用 5 分钟周期
input bool     Use_M15 = true;            // 启用 15 分钟周期
input int      Min_Timeframes = 2;        // 最少共振周期数(1~3)
input bool     Require_Cross = false;     // 要求至少一个周期出现均线交叉

input group "========== RSI 参数 =========="
input int      RSI_Period = 14;           // RSI 周期
input double   RSI_Level = 50.0;          // RSI 强弱分界线
input ENUM_TIMEFRAMES RSI_Timeframe = PERIOD_M5;  // RSI 使用的周期

input group "========== MACD 参数 =========="
input int      MACD_Fast = 12;            // MACD 快线周期
input int      MACD_Slow = 26;            // MACD 慢线周期
input int      MACD_Signal = 9;           // MACD 信号线周期
input ENUM_TIMEFRAMES MACD_Timeframe = PERIOD_M5; // MACD 使用的周期

input group "========== 交易参数 =========="
input double   Lot_Size = 0.1;            // 固定手数
input int      Stop_Loss = 300;           // 止损点数(0=不设止损)
input int      Take_Profit = 600;         // 止盈点数(0=不设止盈)
input bool     Close_On_Opposite = true;  // 反向信号平仓
input ulong    Magic_Number = 777777;     // 魔术号
input string   Trade_Comment = "多周期共振"; // 订单备注

//--- 全局变量
CTrade         trade;

// M1 均线句柄
int            handleM1_Fast, handleM1_Slow;
double         m1_fast[], m1_slow[];

// M5 均线句柄
int            handleM5_Fast, handleM5_Slow;
double         m5_fast[], m5_slow[];

// M15 均线句柄
int            handleM15_Fast, handleM15_Slow;
double         m15_fast[], m15_slow[];

// RSI 句柄
int            handleRSI;
double         rsiBuffer[];

// MACD 句柄
int            handleMACD;
double         macdMain[], macdSignal[];

datetime       lastBarTime = 0;

//+------------------------------------------------------------------+
//| 初始化函数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   trade.SetExpertMagicNumber(Magic_Number);
   trade.SetDeviationInPoints(20);
   
   // 创建 M1 均线句柄
   if(Use_M1)
   {
      handleM1_Fast = iMA(_Symbol, PERIOD_M1, Fast_Period, 0, MODE_EMA, PRICE_CLOSE);
      handleM1_Slow = iMA(_Symbol, PERIOD_M1, Slow_Period, 0, MODE_EMA, PRICE_CLOSE);
      if(handleM1_Fast == INVALID_HANDLE || handleM1_Slow == INVALID_HANDLE)
      {
         Print("创建 M1 均线句柄失败");
         return INIT_FAILED;
      }
      ArraySetAsSeries(m1_fast, true);
      ArraySetAsSeries(m1_slow, true);
   }
   
   // 创建 M5 均线句柄
   if(Use_M5)
   {
      handleM5_Fast = iMA(_Symbol, PERIOD_M5, Fast_Period, 0, MODE_EMA, PRICE_CLOSE);
      handleM5_Slow = iMA(_Symbol, PERIOD_M5, Slow_Period, 0, MODE_EMA, PRICE_CLOSE);
      if(handleM5_Fast == INVALID_HANDLE || handleM5_Slow == INVALID_HANDLE)
      {
         Print("创建 M5 均线句柄失败");
         return INIT_FAILED;
      }
      ArraySetAsSeries(m5_fast, true);
      ArraySetAsSeries(m5_slow, true);
   }
   
   // 创建 M15 均线句柄
   if(Use_M15)
   {
      handleM15_Fast = iMA(_Symbol, PERIOD_M15, Fast_Period, 0, MODE_EMA, PRICE_CLOSE);
      handleM15_Slow = iMA(_Symbol, PERIOD_M15, Slow_Period, 0, MODE_EMA, PRICE_CLOSE);
      if(handleM15_Fast == INVALID_HANDLE || handleM15_Slow == INVALID_HANDLE)
      {
         Print("创建 M15 均线句柄失败");
         return INIT_FAILED;
      }
      ArraySetAsSeries(m15_fast, true);
      ArraySetAsSeries(m15_slow, true);
   }
   
   // 创建 RSI 句柄
   handleRSI = iRSI(_Symbol, RSI_Timeframe, RSI_Period, PRICE_CLOSE);
   if(handleRSI == INVALID_HANDLE)
   {
      Print("创建 RSI 句柄失败");
      return INIT_FAILED;
   }
   ArraySetAsSeries(rsiBuffer, true);
   
   // 创建 MACD 句柄
   handleMACD = iMACD(_Symbol, MACD_Timeframe, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   if(handleMACD == INVALID_HANDLE)
   {
      Print("创建 MACD 句柄失败");
      return INIT_FAILED;
   }
   ArraySetAsSeries(macdMain, true);
   ArraySetAsSeries(macdSignal, true);
   
   Print("========== 多周期多指标共振 EA 初始化成功 ==========");
   Print("均线参数:快线 EMA", Fast_Period, "  慢线 EMA", Slow_Period);
   Print("监控周期:M1=", Use_M1, "  M5=", Use_M5, "  M15=", Use_M15);
   Print("最少共振周期数:", Min_Timeframes, "  要求交叉:", Require_Cross);
   Print("RSI 周期:", RSI_Period, "  分界线:", RSI_Level, "  周期:", EnumToString(RSI_Timeframe));
   Print("MACD 参数:", MACD_Fast, "/", MACD_Slow, "/", MACD_Signal, "  周期:", EnumToString(MACD_Timeframe));
   Print("手数:", Lot_Size, "  止损:", Stop_Loss, "  止盈:", Take_Profit);
   
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 清理函数                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   if(Use_M1)
   {
      if(handleM1_Fast != INVALID_HANDLE) IndicatorRelease(handleM1_Fast);
      if(handleM1_Slow != INVALID_HANDLE) IndicatorRelease(handleM1_Slow);
   }
   if(Use_M5)
   {
      if(handleM5_Fast != INVALID_HANDLE) IndicatorRelease(handleM5_Fast);
      if(handleM5_Slow != INVALID_HANDLE) IndicatorRelease(handleM5_Slow);
   }
   if(Use_M15)
   {
      if(handleM15_Fast != INVALID_HANDLE) IndicatorRelease(handleM15_Fast);
      if(handleM15_Slow != INVALID_HANDLE) IndicatorRelease(handleM15_Slow);
   }
   if(handleRSI != INVALID_HANDLE) IndicatorRelease(handleRSI);
   if(handleMACD != INVALID_HANDLE) IndicatorRelease(handleMACD);
   
   Print("========== 多周期多指标共振 EA 已停止 ==========");
}

//+------------------------------------------------------------------+
//| 主循环函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   // 以 M1 为基准判断新 K 线
   datetime currentBarTime = iTime(_Symbol, PERIOD_M1, 0);
   if(currentBarTime == lastBarTime)
      return;
   lastBarTime = currentBarTime;
   
   // 等待 RSI 和 MACD 数据准备就绪
   if(BarsCalculated(handleRSI) < 2 || BarsCalculated(handleMACD) < 2)
      return;
   
   // 复制 RSI 和 MACD 数据
   if(CopyBuffer(handleRSI, 0, 0, 3, rsiBuffer) < 3) return;
   if(CopyBuffer(handleMACD, 0, 0, 3, macdMain) < 3) return;
   if(CopyBuffer(handleMACD, 1, 0, 3, macdSignal) < 3) return;
   
   // 统计多头、空头、交叉信号的周期数
   int bullCount = 0;
   int bearCount = 0;
   bool hasBullCross = false;
   bool hasBearCross = false;
   
   // 判断各个时间周期的均线排列
   if(Use_M1 && CheckTimeframe(PERIOD_M1, handleM1_Fast, handleM1_Slow, m1_fast, m1_slow,
                                bullCount, bearCount, hasBullCross, hasBearCross) == false)
      return;
   
   if(Use_M5 && CheckTimeframe(PERIOD_M5, handleM5_Fast, handleM5_Slow, m5_fast, m5_slow,
                                bullCount, bearCount, hasBullCross, hasBearCross) == false)
      return;
   
   if(Use_M15 && CheckTimeframe(PERIOD_M15, handleM15_Fast, handleM15_Slow, m15_fast, m15_slow,
                                 bullCount, bearCount, hasBullCross, hasBearCross) == false)
      return;
   
   // 判断开仓信号
   bool buySignal = false;
   bool sellSignal = false;
   
   // 多头信号:多周期均线共振 + RSI > 50 + MACD 主线 > 信号线
   if(bullCount >= Min_Timeframes &&
      rsiBuffer[0] > RSI_Level &&
      macdMain[0] > macdSignal[0])
   {
      // 如果要求交叉信号
      if(Require_Cross)
      {
         if(hasBullCross) buySignal = true;
      }
      else
      {
         buySignal = true;
      }
   }
   
   // 空头信号:多周期均线共振 + RSI < 50 + MACD 主线 < 信号线
   if(bearCount >= Min_Timeframes &&
      rsiBuffer[0] < RSI_Level &&
      macdMain[0] < macdSignal[0])
   {
      // 如果要求交叉信号
      if(Require_Cross)
      {
         if(hasBearCross) sellSignal = true;
      }
      else
      {
         sellSignal = true;
      }
   }
   
   // 检查当前持仓
   bool hasPosition = false;
   int positionType = -1;
   
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(ticket > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol &&
         PositionGetInteger(POSITION_MAGIC) == Magic_Number)
      {
         hasPosition = true;
         positionType = (int)PositionGetInteger(POSITION_TYPE);
         
         // 反向信号平仓
         if(Close_On_Opposite)
         {
            if(positionType == POSITION_TYPE_BUY && sellSignal)
            {
               trade.PositionClose(ticket);
               Print("反向信号触发,平多单,票号:", ticket);
            }
            else if(positionType == POSITION_TYPE_SELL && buySignal)
            {
               trade.PositionClose(ticket);
               Print("反向信号触发,平空单,票号:", ticket);
            }
         }
         break;
      }
   }
   
   // 如果没有持仓,根据信号开仓
   if(!hasPosition)
   {
      double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double sl = 0, tp = 0;
      
      if(buySignal)
      {
         if(Stop_Loss > 0)
            sl = NormalizeDouble(price - Stop_Loss * _Point, _Digits);
         if(Take_Profit > 0)
            tp = NormalizeDouble(price + Take_Profit * _Point, _Digits);
         
         if(trade.Buy(Lot_Size, _Symbol, price, sl, tp, Trade_Comment))
         {
            Print("========== 多周期多指标共振开多单 ==========");
            Print("多头周期数:", bullCount, "  有金叉:", hasBullCross);
            Print("RSI:", NormalizeDouble(rsiBuffer[0], 2), "  MACD主线:", NormalizeDouble(macdMain[0], 5));
            Print("价格:", price, "  止损:", sl, "  止盈:", tp);
         }
         else
         {
            Print("开多单失败,错误代码:", GetLastError());
         }
      }
      else if(sellSignal)
      {
         price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         
         if(Stop_Loss > 0)
            sl = NormalizeDouble(price + Stop_Loss * _Point, _Digits);
         if(Take_Profit > 0)
            tp = NormalizeDouble(price - Take_Profit * _Point, _Digits);
         
         if(trade.Sell(Lot_Size, _Symbol, price, sl, tp, Trade_Comment))
         {
            Print("========== 多周期多指标共振开空单 ==========");
            Print("空头周期数:", bearCount, "  有死叉:", hasBearCross);
            Print("RSI:", NormalizeDouble(rsiBuffer[0], 2), "  MACD主线:", NormalizeDouble(macdMain[0], 5));
            Print("价格:", price, "  止损:", sl, "  止盈:", tp);
         }
         else
         {
            Print("开空单失败,错误代码:", GetLastError());
         }
      }
   }
}

//+------------------------------------------------------------------+
//| 检查单个时间周期的均线状态                                         |
//+------------------------------------------------------------------+
bool CheckTimeframe(ENUM_TIMEFRAMES period, int handleFast, int handleSlow,
                    double &fastBuf[], double &slowBuf[],
                    int &bullCount, int &bearCount,
                    bool &hasBullCross, bool &hasBearCross)
{
   // 等待指标计算完成
   if(BarsCalculated(handleFast) < 2 || BarsCalculated(handleSlow) < 2)
      return false;
   
   // 复制最近 3 根 K 线的数据
   if(CopyBuffer(handleFast, 0, 0, 3, fastBuf) < 3) return false;
   if(CopyBuffer(handleSlow, 0, 0, 3, slowBuf) < 3) return false;
   
   // 判断当前排列(索引 0 = 最新 K 线)
   bool isBull = (fastBuf[0] > slowBuf[0]);
   bool isBear = (fastBuf[0] < slowBuf[0]);
   
   if(isBull) bullCount++;
   if(isBear) bearCount++;
   
   // 判断是否出现交叉(前一根关系相反)
   if(isBull && fastBuf[1] <= slowBuf[1])
      hasBullCross = true;  // 金叉
   
   if(isBear && fastBuf[1] >= slowBuf[1])
      hasBearCross = true;  // 死叉
   
   return true;
}

作品说明

这是一个多周期均线 + 多指标四重过滤策略,结合了空间(多周期)和强度(RSI/MACD)两个维度的验证:

核心逻辑:

  • 同时监控 1 分钟、5 分钟、15 分钟三个周期的 EMA7/63 排列
  • 至少 N 个周期(可设置)同时多头/空头排列
  • RSI 在 50 上方(多头区)或下方(空头区)
  • MACD 主线与信号线关系确认趋势方向
  • 四重验证通过才开仓,大幅降低假信号

使用说明

一、安装步骤

  1. 将代码保存为 Multi_TF_Multi_Indicator_EA.mq5
  2. 放入 MT5 数据文件夹:文件 → 打开数据文件夹 → MQL5 → Experts
  3. 在 MetaEditor 中编译(F7)
  4. 重启 MT5,在"智能交易系统"中找到该 EA
  5. 拖到任意周期图表上(建议 M1 或 M5 图表)
  6. 勾选"允许自动交易",调整参数后点击确定

二、核心参数调整

均线设置

  • 快速周期:默认 EMA 7
  • 慢速周期:默认 EMA 63
  • 这两个参数会同时应用到 M1、M5、M15 三个周期

多周期共振设置

  • 启用的周期:可单独关闭某个周期
  • 最少共振周期数:
  • 1 = 任意一个周期满足(激进)
  • 2 = 至少两个周期同向(推荐)
  • 3 = 三个周期完全共振(保守)
  • 要求交叉信号:开启后必须至少一个周期出现均线交叉

RSI 设置

  • 周期:默认 14
  • 分界线:默认 50(> 50 多头,< 50 空头)
  • 使用的周期:默认 M5(可改为 M1、M15 等)

MACD 设置

  • 参数:默认 12/26/9(标准设置)
  • 使用的周期:默认 M5(可改为 M1、M15 等)
  • 判断逻辑:主线 > 信号线 = 多头,主线 < 信号线 = 空头

交易参数

  • 手数:黄金建议 0.1~0.5
  • 止损:黄金 300~500 点
  • 止盈:建议止盈 = 止损 × 2
  • 反向信号平仓:开启后四重验证反转立即平仓

三、策略逻辑

开多条件(必须同时满足四项):

  1. 至少 N 个周期(M1/M5/M15)EMA7 > EMA63
  2. RSI > 50(强势区)
  3. MACD 主线 > 信号线(多头趋势)
  4. 可选:至少一个周期出现金叉

开空条件(必须同时满足四项):

  1. 至少 N 个周期 EMA7 < EMA63
  2. RSI < 50(弱势区)
  3. MACD 主线 < 信号线(空头趋势)
  4. 可选:至少一个周期出现死叉

平仓方式:

  • 触及止盈/止损
  • 四重验证反转(可选)

四、参数组合推荐

黄金 XAUUSD

  • 保守型:最少共振 3 + 要求交叉 + 止损 500 点
  • 平衡型:最少共振 2 + 不要求交叉 + 止损 300 点(推荐)
  • 激进型:最少共振 1 + 不要求交叉 + 止损 200 点

外汇货币对(如 EURUSD)

  • 参数需调整:止损 50~100 点,止盈 100~200 点
  • 可将 EMA 改为 12/26 或 20/50

RSI 和 MACD 周期选择

  • 短线:都用 M1 或 M5
  • 中线:都用 M5 或 M15
  • 混合:RSI 用 M5,MACD 用 M15(更稳健)

五、优势与风险

优势

  1. 四重验证大幅降低假信号
  2. 多周期共振捕捉趋势启动点
  3. RSI 和 MACD 确认趋势强度和方向
  4. 参数灵活,可适配不同品种和风格

风险

  1. 信号较少,可能错过部分行情
  2. 多重验证导致入场稍晚
  3. 震荡行情仍可能出现连续止损
  4. 需要足够历史数据(至少 100 根 M15 K 线)

六、使用建议

  1. 实盘前测试
  • 模拟账户测试 1~2 周
  • 策略测试器回测至少 3~6 个月
  • 观察最大回撤和盈亏比
  1. 适用场景
  • 趋势明显的品种(黄金、原油)
  • 避开重大新闻时段(非农、加息)
  • 震荡行情暂停或调高共振要求
  1. 资金管理
  • 单次风险不超过账户 2%
  • 回撤超过 15% 立即停止检查
  • 可配合固定止损 + 移动止损
  1. 优化方向
  • 可增加 ATR 动态止损
  • 可添加时间过滤(避开亚洲盘)
  • 可加入持仓时间管理(超过 N 根 K 线强制平仓)
  1. 监控要点
  • 定期查看"智能交易"日志
  • 关注开仓时的多头/空头周期数
  • 观察 RSI 和 MACD 数值是否合理

七、注意事项

  1. 服务器断线可能漏掉信号,保持网络稳定
  2. 不同经纪商点差不同,影响止损止盈效果
  3. 历史数据不足时指标计算会失败,需等待数据加载
  4. 每次修改参数后建议先观察几天再加大仓位
  5. 本策略适合趋势品种,不适合窄幅震荡品种

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

这是什么

这是一个多周期多指标四重过滤 EA,同时监控 1 分钟、5 分钟、15 分钟三个周期的均线排列,结合 RSI 强弱区和 MACD 趋势方向,只有四个维度全部验证通过才开仓。用空间(多周期共振)和强度(指标过滤)两个维度筛选信号,目标是在趋势行情中减少假突破和震荡噪音。

逻辑原理

均线共振判断:在 M1、M5、M15 三个周期上分别计算 EMA7(快线)和 EMA63(慢线)。每个周期独立判断快线在慢线上方(多头排列)还是下方(空头排列)。统计有多少个周期满足同一方向,达到设定的最少周期数(比如至少 2 个)才算共振成立。如果开启"要求交叉",还会检查至少一个周期出现了金叉(快线上穿慢线)或死叉(快线下穿慢线)。

RSI 强弱过滤:在指定周期(默认 M5)读取 RSI 值,判断当前是强势区还是弱势区。多头信号要求 RSI > 50,空头信号要求 RSI < 50。这一层过滤排除了均线排列与市场动能不一致的情况。

MACD 趋势过滤:在指定周期(默认 M5)读取 MACD 主线和信号线。多头信号要求主线 > 信号线,空头信号要求主线 < 信号线。这一层再次确认当前趋势方向与均线共振一致。

开仓逻辑:

  • 多单:至少 N 个周期多头排列 + RSI > 50 + MACD 主线 > 信号线(+ 可选:有金叉)
  • 空单:至少 N 个周期空头排列 + RSI < 50 + MACD 主线 < 信号线(+ 可选:有死叉)

平仓逻辑:触及止盈或止损。如果开启"反向信号平仓",当四重验证出现反向信号时立即平仓(多单遇到空头信号平仓,空单遇到多头信号平仓)。

仓位和风控:固定手数开仓,每个订单设置固定点数的止损和止盈。EA 在 M1 周期 K 线更新时检查信号,但均线、RSI、MACD 都从各自设定的周期读取数据。

参数说明

均线参数

  • Fast_Period(默认 7):快速均线周期,用 EMA 算法
  • Slow_Period(默认 63):慢速均线周期,用 EMA 算法

多周期设置

  • Use_M1(默认 true):启用 1 分钟周期的均线判断
  • Use_M5(默认 true):启用 5 分钟周期的均线判断
  • Use_M15(默认 true):启用 15 分钟周期的均线判断
  • Min_Timeframes(默认 2):最少共振周期数,1 = 任意一个满足就开仓(激进),2 = 至少两个同向(平衡),3 = 三个全部同向(保守)
  • Require_Cross(默认 false):是否要求至少一个周期出现均线交叉才开仓,开启后更保守

RSI 参数

  • RSI_Period(默认 14):RSI 计算周期
  • RSI_Level(默认 50.0):强弱分界线,> 50 多头区,< 50 空头区
  • RSI_Timeframe(默认 PERIOD_M5):RSI 从哪个周期读取,可改为 M1、M15 等

MACD 参数

  • MACD_Fast(默认 12):MACD 快线周期
  • MACD_Slow(默认 26):MACD 慢线周期
  • MACD_Signal(默认 9):MACD 信号线周期
  • MACD_Timeframe(默认 PERIOD_M5):MACD 从哪个周期读取

交易参数

  • Lot_Size(默认 0.1):固定手数,黄金建议 0.1~0.5,外汇根据账户调整
  • Stop_Loss(默认 300):止损点数,黄金 300~500 点常见,设为 0 不设止损(不推荐)
  • Take_Profit(默认 600):止盈点数,建议是止损的 2 倍,设为 0 不设止盈
  • Close_On_Opposite(默认 true):反向信号平仓,开启后四重验证反转立即平仓,关闭后只靠止盈止损
  • Magic_Number(默认 777777):魔术号,区分不同 EA 的订单
  • Trade_Comment(默认"多周期共振"):订单备注

怎么用

将代码保存为 .mq5 文件,放到 MT5 数据文件夹的 MQL5\Experts 目录,在 MetaEditor 中编译。重启 MT5 后在导航器的"智能交易系统"中找到这个 EA,拖到任意周期的图表上(建议用 M1 或 M5 图表)。勾选"允许自动交易",调整参数后确定。EA 会在后台同时监控三个周期的均线和指标,在 M1 K 线更新时检查信号。图表上不会画任何东西,开平仓信息在"交易"选项卡和日志里查看。

适用场景

适合品种:黄金(XAUUSD)、原油等波动大的品种,外汇主要货币对(EURUSD、GBPUSD 等)也可以,但需调整止损止盈点数和均线周期。

适合行情:中短期趋势行情,或震荡后的突破行情。多周期共振 + 多指标过滤能在趋势确认后再进场,避免单周期假突破。不适合极端震荡行情,因为多周期很难同时满足,信号会很少。

周期选择:EA 可以挂在任何周期图表上,但它在 M1 K 线更新时检查信号。如果你希望降低检查频率节省资源,可以改代码把 iTime(_Symbol, PERIOD_M1, 0) 改成 M5 或更高周期。

参数组合建议:

  • 保守型:Min_Timeframes = 3,Require_Cross = true,Stop_Loss = 500,信号很少但质量高
  • 平衡型:Min_Timeframes = 2,Require_Cross = false,Stop_Loss = 300(默认推荐)
  • 激进型:Min_Timeframes = 1,Require_Cross = false,Stop_Loss = 200,信号多但可能误判

外汇品种需调整止损止盈(一般 50~100 点),均线周期也可以改成 12/26 或 20/50。

风险提示

信号滞后:均线本身是滞后指标,EMA7/63 在黄金上可能滞后几十点。多周期共振进一步要求多个周期确认,会让入场点更晚。适合抓中段趋势,不适合抢短线反转。

震荡行情信号少:四重过滤大幅降低假信号,但副作用是震荡时可能长时间没有信号。如果市场在多空反复,多周期很难同时满足条件。

止损设置:默认 300 点止损在黄金上是常见值,但不同品种和账户点值不同。外汇品种要改小,指数或原油要根据波动率调整。止损设为 0 会导致扛单风险,不推荐。

参数敏感性:Min_Timeframes 和 Require_Cross 对信号数量影响很大。如果设得太严格(Min_Timeframes = 3 + Require_Cross = true),可能一个月都没几个信号。建议先在策略测试器里回测不同参数组合。

反向平仓逻辑:Close_On_Opposite = true 时,四重验证反转会立即平仓。如果行情剧烈波动导致指标短暂反转,可能过早平仓错过后续利润。保守用户可以关闭这个选项,只靠止盈止损出场。

指标周期选择:RSI 和 MACD 默认从 M5 读取。如果你把它们改成 M1,信号会更敏感但噪音更多;改成 M15 会更稳健但可能错过短期机会。建议根据自己的交易风格测试。

无重绘:代码从已完成 K 线(索引 0)读取数据,不会重绘。但要注意 MT5 的 K 线索引 0 是当前未完成的 K 线,在 K 线内指标值会随价格变化。EA 在 M1 K 线更新时检查,所以实际是在 M1 新 K 线开盘时判断,此时其他周期的 K 线可能还没完成,指标值可能继续变化。

常见问题

这个 EA 会重绘吗?
不会。代码从已完成 K 线读取均线和指标数据,不会事后改变历史信号。但要注意在 K 线内指标值会随价格变化,EA 在 M1 新 K 线时判断,此时其他周期 K 线可能未完成。
最少共振周期数设多少合适?
默认 2 是平衡选择,至少两个周期同向既能过滤假信号又不会太保守。设 1 信号多但质量低,设 3 信号很少但更可靠。建议先用默认值回测,再根据信号频率调整。
可以用在黄金以外的品种吗?
可以。外汇主要货币对、原油、指数都能用,但要调整止损止盈点数(外汇一般 50~100 点)和均线周期(可以改成 12/26 或 20/50)。波动小的品种信号会更少。
为什么长时间没有信号?
四重过滤要求多周期均线排列 + RSI 强弱 + MACD 趋势全部一致,震荡行情很难满足。如果觉得信号太少,可以降低 Min_Timeframes 或关闭 Require_Cross,但会增加假信号风险。
RSI 和 MACD 用哪个周期比较好?
默认都用 M5 是平衡选择。短线交易可以改成 M1,中线可以改成 M15。也可以混合使用(比如 RSI 用 M5,MACD 用 M15)会更稳健但信号更少。需自行测试找到适合自己的组合。

Multi-Timeframe EMA RSI MACD Resonance EA for MT5

This EA monitors EMA7/63 alignment across M1, M5, and M15 simultaneously, combined with RSI strength and MACD trend filters. It only opens positions when at least N timeframes resonate and all four conditions align, significantly reducing false signals.

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

评论

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

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