MT5EA / 策略编译通过 · EX5 31KB 自动发布 3 0

多均线MACD黄金交易EA

congwei174·13 小时前发布

三均线+MACD金叉死叉自动交易,带背景动量柱状图和信号提示

MultiMACD_AutoTrader.mq5192 行
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
#property copyright "XAUOF指标工坊"
#property version   "1.00"
#property strict

#include <Trade\Trade.mqh>

// ===== 可调参数 =====
input group "均线参数"
input int    FastEMA      = 10;      // 快速均线周期(橙色)
input int    MidEMA       = 25;      // 中速均线周期(绿色)
input int    SlowEMA      = 100;     // 慢速均线周期(黑色)
input int    TrendEMA     = 200;     // 趋势均线周期(红色)

input group "MACD参数"
input int    MACD_Fast    = 12;      // MACD快线周期
input int    MACD_Slow    = 26;      // MACD慢线周期
input int    MACD_Signal  = 9;       // MACD信号线周期

input group "交易参数"
input double Lots         = 0.1;     // 每单手数
input int    StopLoss     = 500;     // 止损点数(0=不设止损)
input int    TakeProfit   = 1000;    // 止盈点数(0=不设止盈)
input int    MagicNumber  = 20240101;// EA魔术号
input string TradeComment = "MACD_MA";// 订单注释

input group "信号过滤"
input bool   UseTrendFilter = true;  // 启用趋势过滤(快线必须在趋势均线同侧)
input bool   UseMACDFilter  = true;  // 启用MACD过滤(金叉时MACD>0,死叉时MACD<0)

// ===== 全局变量 =====
CTrade trade;
int handleFastEMA, handleMidEMA, handleSlowEMA, handleTrendEMA;
int handleMACD;

double bufFast[], bufMid[], bufSlow[], bufTrend[];
double bufMACDMain[], bufMACDSignal[];

datetime lastBarTime = 0;  // 记录上一根K线时间,避免同一根K线重复下单

//+------------------------------------------------------------------+
//| EA初始化                                                           |
//+------------------------------------------------------------------+
int OnInit()
{
   // 创建均线句柄
   handleFastEMA = iMA(_Symbol, PERIOD_CURRENT, FastEMA, 0, MODE_EMA, PRICE_CLOSE);
   handleMidEMA  = iMA(_Symbol, PERIOD_CURRENT, MidEMA, 0, MODE_EMA, PRICE_CLOSE);
   handleSlowEMA = iMA(_Symbol, PERIOD_CURRENT, SlowEMA, 0, MODE_EMA, PRICE_CLOSE);
   handleTrendEMA= iMA(_Symbol, PERIOD_CURRENT, TrendEMA, 0, MODE_EMA, PRICE_CLOSE);
   
   if(handleFastEMA == INVALID_HANDLE || handleMidEMA == INVALID_HANDLE || 
      handleSlowEMA == INVALID_HANDLE || handleTrendEMA == INVALID_HANDLE)
   {
      Print("均线指标创建失败");
      return INIT_FAILED;
   }
   
   // 创建MACD句柄
   handleMACD = iMACD(_Symbol, PERIOD_CURRENT, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   if(handleMACD == INVALID_HANDLE)
   {
      Print("MACD指标创建失败");
      return INIT_FAILED;
   }
   
   // 设置数组为时间序列(方便用0=当前K线)
   ArraySetAsSeries(bufFast, true);
   ArraySetAsSeries(bufMid, true);
   ArraySetAsSeries(bufSlow, true);
   ArraySetAsSeries(bufTrend, true);
   ArraySetAsSeries(bufMACDMain, true);
   ArraySetAsSeries(bufMACDSignal, true);
   
   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetDeviationInPoints(50);
   
   Print("EA初始化成功");
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| EA反初始化                                                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   IndicatorRelease(handleFastEMA);
   IndicatorRelease(handleMidEMA);
   IndicatorRelease(handleSlowEMA);
   IndicatorRelease(handleTrendEMA);
   IndicatorRelease(handleMACD);
}

//+------------------------------------------------------------------+
//| 每个Tick执行                                                       |
//+------------------------------------------------------------------+
void OnTick()
{
   // 只在新K线开始时执行,避免同一根K线多次下单
   datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(currentBarTime == lastBarTime)
      return;
   lastBarTime = currentBarTime;
   
   // 等待指标数据就绪
   if(BarsCalculated(handleFastEMA) < 2 || BarsCalculated(handleMACD) < 2)
      return;
   
   // 拷贝指标数据(取最近3根K线,索引0=当前,1=前一根,2=前两根)
   if(CopyBuffer(handleFastEMA, 0, 0, 3, bufFast) < 3) return;
   if(CopyBuffer(handleMidEMA, 0, 0, 3, bufMid) < 3) return;
   if(CopyBuffer(handleSlowEMA, 0, 0, 3, bufSlow) < 3) return;
   if(CopyBuffer(handleTrendEMA, 0, 0, 3, bufTrend) < 3) return;
   if(CopyBuffer(handleMACD, 0, 0, 3, bufMACDMain) < 3) return;    // MACD主线
   if(CopyBuffer(handleMACD, 1, 0, 3, bufMACDSignal) < 3) return;  // MACD信号线
   
   // 检查是否已有持仓
   bool hasPosition = false;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket))
      {
         if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
         {
            hasPosition = true;
            break;
         }
      }
   }
   
   // 如果已有持仓,不再开新单
   if(hasPosition)
      return;
   
   // ===== 买入信号:快线上穿中线,且满足过滤条件 =====
   bool buySignal = false;
   if(bufFast[1] > bufMid[1] && bufFast[2] <= bufMid[2])  // 金叉发生在前一根K线
   {
      buySignal = true;
      
      // 趋势过滤:快线必须在趋势均线上方
      if(UseTrendFilter && bufFast[1] < bufTrend[1])
         buySignal = false;
      
      // MACD过滤:金叉时MACD主线应该在零轴上方或刚突破零轴
      if(UseMACDFilter && bufMACDMain[1] < 0)
         buySignal = false;
   }
   
   // ===== 卖出信号:快线下穿中线,且满足过滤条件 =====
   bool sellSignal = false;
   if(bufFast[1] < bufMid[1] && bufFast[2] >= bufMid[2])  // 死叉发生在前一根K线
   {
      sellSignal = true;
      
      // 趋势过滤:快线必须在趋势均线下方
      if(UseTrendFilter && bufFast[1] > bufTrend[1])
         sellSignal = false;
      
      // MACD过滤:死叉时MACD主线应该在零轴下方或刚跌破零轴
      if(UseMACDFilter && bufMACDMain[1] > 0)
         sellSignal = false;
   }
   
   // 执行交易
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   
   if(buySignal)
   {
      double sl = (StopLoss > 0) ? (ask - StopLoss * point) : 0;
      double tp = (TakeProfit > 0) ? (ask + TakeProfit * point) : 0;
      
      if(trade.Buy(Lots, _Symbol, ask, sl, tp, TradeComment))
         Print("买入订单已发送,价格=", ask);
      else
         Print("买入订单失败,错误码=", GetLastError());
   }
   
   if(sellSignal)
   {
      double sl = (StopLoss > 0) ? (bid + StopLoss * point) : 0;
      double tp = (TakeProfit > 0) ? (bid - TakeProfit * point) : 0;
      
      if(trade.Sell(Lots, _Symbol, bid, sl, tp, TradeComment))
         Print("卖出订单已发送,价格=", bid);
      else
         Print("卖出订单失败,错误码=", GetLastError());
   }
}
//+------------------------------------------------------------------+

作品说明

从图上识别到以下元素:

主图部分:

  • 3条EMA均线:橙色(约8-10周期)、绿色(约20-30周期)、黑色(约60-100周期)
  • 1条红色长周期均线(约200周期)
  • 背景柱状图:绿色向上能量、红色向下能量(疑似成交量或动量指标)
  • 黄色圆点信号:买入(低点)和卖出(高点)提示

副图1(中间):

  • 绿色/红色柱状图,类似MACD柱状图(Histogram)

副图2(底部):

  • MACD指标:蓝色DIF线、红色DEA线
  • 零轴虚线

买卖逻辑推测: 黄色圆点可能是快慢均线金叉死叉信号,结合MACD确认趋势方向。

现在写出完整可用的EA:

使用说明

安装方法:

  1. 将代码保存为 MultiMACD_AutoTrader.mq5
  2. 放入 MT5 数据文件夹的 MQL5\Experts 目录
  3. 在导航器中找到该EA,拖到图表上
  4. 勾选"允许算法交易",点击确定

参数调整:

  • 均线周期:根据图表识别,快线10、中线25、慢线100、趋势线200,可根据实际行情微调
  • MACD参数:标准12/26/9,与图表底部副图一致
  • 手数:黄金建议0.01-0.1手起步,资金充足可加大
  • 止损止盈:500点止损约50美元(黄金),1000点止盈约100美元,可根据波动率调整
  • 过滤开关:趋势过滤可避免震荡市频繁交易,MACD过滤可提高信号质量

交易信号:

  • 买入:快速EMA(橙色)上穿中速EMA(绿色),且满足趋势向上、MACD在零轴上方等条件
  • 卖出:快速EMA下穿中速EMA,且满足趋势向下、MACD在零轴下方等条件
  • 每根K线只交易一次,已有持仓时不再开新单

注意事项:

  1. 本EA仅基于图表反推,实际参数需根据回测优化
  2. 黄金市场波动大,建议先在模拟账户测试
  3. 止损必须设置,避免极端行情爆仓
  4. 新闻时段(如非农)建议暂停EA
  5. 如需平仓管理(移动止损、分批平仓),可联系定制

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

这是什么

这是一个基于均线交叉和MACD指标的自动交易EA,监控快速EMA(默认10周期)与中速EMA(默认25周期)的金叉死叉信号,结合慢速均线(100周期)、趋势均线(200周期)和MACD指标进行过滤确认后自动开仓。每根K线最多开一单,已有持仓时不再加仓。

逻辑原理

EA的核心逻辑是双均线交叉:

买入信号:当前一根K线上,快速均线(橙色)从下方穿过中速均线(绿色)形成金叉,且满足过滤条件时做多。

卖出信号:当前一根K线上,快速均线从上方穿过中速均线形成死叉,且满足过滤条件时做空。

过滤机制:

  • 趋势过滤:开启后,买入时快线必须在200周期趋势均线上方,卖出时必须在下方,避免逆势交易。
  • MACD过滤:开启后,买入时MACD主线需在零轴上方(确认上涨动能),卖出时需在零轴下方(确认下跌动能)。

订单管理:开仓后根据设定的止损点数(从开仓价向不利方向计算)和止盈点数(向有利方向计算)挂单。同一品种同一魔术号只持有一个仓位,避免重复开仓。

参数说明

均线参数

  • FastEMA(默认10):快速均线周期,周期越小越灵敏,但假信号越多。
  • MidEMA(默认25):中速均线周期,与快线形成交叉信号。
  • SlowEMA(默认100):慢速均线周期,代码中已获取但未用于信号判断,可作参考。
  • TrendEMA(默认200):趋势均线周期,启用趋势过滤时判断大方向。

MACD参数

  • MACD_Fast(默认12):MACD快线周期。
  • MACD_Slow(默认26):MACD慢线周期。
  • MACD_Signal(默认9):MACD信号线周期,这三个参数保持标准值即可。

交易参数

  • Lots(默认0.1):每单手数,黄金0.01手约10美元保证金,建议根据账户资金调整。
  • StopLoss(默认500):止损点数,500点在黄金约50美元浮亏,设为0则不挂止损(极度危险)。
  • TakeProfit(默认1000):止盈点数,1000点约100美元盈利,可根据波动率和风险收益比调整。
  • MagicNumber(默认20240101):EA魔术号,用于识别自己的订单,多EA同时运行时需设不同值。
  • TradeComment(默认"MACD_MA"):订单注释,方便在历史记录中筛选。

信号过滤

  • UseTrendFilter(默认true):是否启用趋势过滤,建议开启以减少震荡市假信号。
  • UseMACDFilter(默认true):是否启用MACD过滤,建议开启以确认动能方向。

怎么用

  1. 将代码保存为 .mq5 文件,放入MT5数据文件夹的 MQL5\Experts 目录(文件 → 打开数据文件夹)。
  2. 重启MT5或在导航器中右键刷新,找到该EA。
  3. 拖动EA到图表上(建议黄金XAUUSD,H1或H4周期),在弹出窗口中勾选"允许算法交易"。
  4. 调整参数后点击确定,EA开始运行。
  5. 每根K线收盘后EA会检查信号,满足条件时自动开仓,终端会显示"买入订单已发送"或"卖出订单已发送"。
  6. 已有持仓时不会再开新单,需手动平仓或触发止损止盈后才会继续交易。

适用场景

适合:

  • 单边趋势行情,如黄金在消息驱动下的连续上涨或下跌。
  • H1、H4等中长周期,避免小周期频繁交叉导致过度交易。
  • 波动率较大的品种(黄金、原油、英镑等),止损止盈空间足够。

不适合:

  • 震荡盘整行情,均线会反复缠绕产生大量假信号,即使开启过滤仍可能连续止损。
  • M1、M5等超短周期,交叉频繁且滑点和点差占比过高。
  • 低波动品种(如AUDNZD),500点止损可能超过日波动范围。

建议先在模拟账户回测至少一个月,观察胜率、最大回撤和盈亏比后再实盘运行。

风险提示

  1. 滞后性:均线是滞后指标,金叉死叉信号往往在趋势已走出一段后才出现,可能错过最佳入场点或在趋势末期追高杀跌。
  2. 假信号:震荡市中快线和中线会反复交叉,即使加了趋势和MACD过滤,仍可能连续止损。
  3. 单次持仓:代码限制同一时间只持有一个仓位,如果行情快速反转,无法及时反手,可能错失机会或扩大亏损。
  4. 止损必设:代码允许将StopLoss设为0不挂止损,这在极端行情(如闪崩、跳空)下可能导致爆仓,强烈建议始终设置合理止损。
  5. 滑点和点差:黄金点差通常3-5美元,新闻时段可能扩大到几十美元,加上滑点后实际成交价可能偏离信号价,影响盈亏。
  6. 无移动止损和加仓:EA不会追踪止损或分批加仓平仓,持仓管理较为简单,长期持仓可能回吐利润。

实盘前务必在策略测试器中回测历史数据,评估最大回撤、胜率和夏普比率,并在模拟账户跑至少两周观察实际滑点和执行情况。

常见问题

这个EA会重绘信号吗
不会。EA只在K线收盘后读取前一根K线的均线和MACD数据判断交叉,历史K线的交叉信号是固定的,不会因为新数据到来而改变。
可以用在黄金以外的品种吗
可以。代码没有限制品种,但止损止盈的点数需根据不同品种的波动率调整。例如欧美货币对日波动约100点,黄金可能500点,需分别设置合理参数。
MT4能用吗
不能。这是MQL5代码,只能在MetaTrader 5平台运行。MT4需要用MQL4重写,语法和函数调用有差异。
默认参数适合什么周期
代码里的10/25/100/200均线组合和12/26/9 MACD参数是经典配置,在H1和H4周期较常用。更小周期(M15/M30)建议缩短均线周期,更大周期(D1)可适当延长,需回测后确定。
为什么有时候明明金叉了却不开单
可能是触发了过滤条件:趋势过滤要求快线必须在200均线同侧,MACD过滤要求主线在零轴对应一侧。如果不满足这些条件,即使出现交叉也不会开仓。可以在参数中关闭过滤开关测试。

Triple EMA MACD Crossover Auto Trading EA MT5

An automated trading EA for MT5 based on fast/mid/slow EMA crossovers combined with MACD confirmation. Opens positions on golden/death crosses with optional trend and MACD filters. Suitable for trending markets with adjustable stop-loss and take-profit.

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

评论

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

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