MT5指标编译通过 · EX5 35KB 自动发布 13 0

黄金固定止盈止损EA

taiyu1983·3 天前发布

双均线交叉自动交易,固定止盈止损点数,适合黄金日内波段

黄金固定止盈止损EA

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

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

#include <Trade\Trade.mqh>

// ========== 可调参数 ==========
input int      FastMA_Period = 10;         // 快速均线周期
input int      SlowMA_Period = 30;         // 慢速均线周期
input ENUM_MA_METHOD MA_Method = MODE_EMA; // 均线类型
input ENUM_APPLIED_PRICE MA_Price = PRICE_CLOSE; // 均线应用价格

input double   LotSize = 0.1;              // 每单手数
input int      TakeProfit = 500;           // 止盈点数(黄金1点=0.1美元)
input int      StopLoss = 300;             // 止损点数
input int      Slippage = 50;              // 允许滑点
input ulong    MagicNumber = 888888;       // EA魔术号码
input string   TradeComment = "GoldEA";    // 订单注释

input bool     OneTradeOnly = true;        // 同时只持有一单
input bool     AllowBuy = true;            // 允许做多
input bool     AllowSell = true;           // 允许做空

// ========== 全局变量 ==========
CTrade trade;
int fastHandle, slowHandle;
double fastMA[], slowMA[];
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| 初始化函数                                                          |
//+------------------------------------------------------------------+
int OnInit()
{
   // 设置交易参数
   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetDeviationInPoints(Slippage);
   trade.SetTypeFilling(ORDER_FILLING_FOK);
   if(!trade.SetTypeFillingBySymbol(_Symbol))
      trade.SetTypeFilling(ORDER_FILLING_RETURN);
   
   // 创建均线句柄
   fastHandle = iMA(_Symbol, PERIOD_CURRENT, FastMA_Period, 0, MA_Method, MA_Price);
   slowHandle = iMA(_Symbol, PERIOD_CURRENT, SlowMA_Period, 0, MA_Method, MA_Price);
   
   if(fastHandle == INVALID_HANDLE || slowHandle == INVALID_HANDLE)
   {
      Print("均线指标创建失败,错误代码:", GetLastError());
      return INIT_FAILED;
   }
   
   // 设置数组为时间序列(最新K线=索引0)
   ArraySetAsSeries(fastMA, true);
   ArraySetAsSeries(slowMA, true);
   
   Print("黄金固定止盈止损EA已启动 | 快线周期:", FastMA_Period, " 慢线周期:", SlowMA_Period);
   Print("止盈:", TakeProfit, "点 | 止损:", StopLoss, "点 | 手数:", LotSize);
   
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 清理函数                                                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   if(fastHandle != INVALID_HANDLE) IndicatorRelease(fastHandle);
   if(slowHandle != INVALID_HANDLE) IndicatorRelease(slowHandle);
   Print("EA已停止,原因代码:", reason);
}

//+------------------------------------------------------------------+
//| 每个Tick执行                                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   // 只在新K线产生时检查信号(避免同一根K线重复开仓)
   datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(currentBarTime == lastBarTime)
      return;
   lastBarTime = currentBarTime;
   
   // 等待指标计算完成
   if(BarsCalculated(fastHandle) < SlowMA_Period || BarsCalculated(slowHandle) < SlowMA_Period)
      return;
   
   // 复制均线数据(最近3根K线足够判断交叉)
   if(CopyBuffer(fastHandle, 0, 0, 3, fastMA) < 3 || CopyBuffer(slowHandle, 0, 0, 3, slowMA) < 3)
   {
      Print("均线数据复制失败");
      return;
   }
   
   // 检查是否已有持仓
   bool hasPosition = false;
   ENUM_POSITION_TYPE posType = POSITION_TYPE_BUY;
   if(OneTradeOnly)
   {
      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;
               posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               break;
            }
         }
      }
   }
   
   // 当前K线[0]和前一根K线[1]的均线值
   double fast0 = fastMA[0], fast1 = fastMA[1];
   double slow0 = slowMA[0], slow1 = slowMA[1];
   
   // 金叉信号:快线从下方上穿慢线
   bool buySignal = (fast0 > slow0 && fast1 <= slow1);
   // 死叉信号:快线从上方下穿慢线
   bool sellSignal = (fast0 < slow0 && fast1 >= slow1);
   
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   
   // 计算止盈止损价格
   double tp_buy = (TakeProfit > 0) ? ask + TakeProfit * point : 0;
   double sl_buy = (StopLoss > 0) ? ask - StopLoss * point : 0;
   double tp_sell = (TakeProfit > 0) ? bid - TakeProfit * point : 0;
   double sl_sell = (StopLoss > 0) ? bid + StopLoss * point : 0;
   
   // 处理买入信号
   if(buySignal && AllowBuy)
   {
      if(hasPosition && posType == POSITION_TYPE_SELL)
      {
         // 如果持有空单,先平仓
         CloseAllPositions();
         Sleep(500); // 等待平仓完成
      }
      
      if(!hasPosition || !OneTradeOnly)
      {
         if(trade.Buy(LotSize, _Symbol, 0, sl_buy, tp_buy, TradeComment))
         {
            Print("买入成功 | 价格:", ask, " | 止损:", sl_buy, " | 止盈:", tp_buy);
         }
         else
         {
            Print("买入失败,错误代码:", GetLastError(), " | ", trade.ResultRetcodeDescription());
         }
      }
   }
   
   // 处理卖出信号
   if(sellSignal && AllowSell)
   {
      if(hasPosition && posType == POSITION_TYPE_BUY)
      {
         // 如果持有多单,先平仓
         CloseAllPositions();
         Sleep(500);
      }
      
      if(!hasPosition || !OneTradeOnly)
      {
         if(trade.Sell(LotSize, _Symbol, 0, sl_sell, tp_sell, TradeComment))
         {
            Print("卖出成功 | 价格:", bid, " | 止损:", sl_sell, " | 止盈:", tp_sell);
         }
         else
         {
            Print("卖出失败,错误代码:", GetLastError(), " | ", trade.ResultRetcodeDescription());
         }
      }
   }
}

//+------------------------------------------------------------------+
//| 平掉所有本EA的持仓                                                   |
//+------------------------------------------------------------------+
void CloseAllPositions()
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket))
      {
         if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
         {
            trade.PositionClose(ticket);
         }
      }
   }
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
黄金固定止盈止损EA 在 MT5 上的真实截图

作品说明

由于你只提到"固定止盈止损",没有说明入场规则(什么时候买、什么时候卖),我给你实现一个双均线交叉策略的黄金EA:快线上穿慢线做多,下穿做空,每次开仓带固定止盈止损点数,所有参数都可以在图表上调整。

使用说明

  1. 安装:将代码保存为 .mq5 文件,放入 MT5 的 MQL5\Experts 目录,重启MT5或刷新导航器,拖到黄金图表上。
  1. 核心参数:
  • 快慢均线周期:默认10和30,适合15分钟到1小时图;日线可改成20/50。
  • 手数:0.1表示0.1标准手(约10美元一点),根据账户资金调整。
  • 止盈止损点数:黄金1个点=0.1美元,500点=50美元,300点=30美元;波动大时可加大。
  1. 信号逻辑:快线上穿慢线→买入;快线下穿慢线→卖出;勾选"同时只持有一单"会在反向信号时先平仓再反手。
  1. 回测建议:在策略测试器里先用历史数据测试,调整参数到合适的盈亏比和胜率,再上实盘。
  1. 风险控制:EA只负责固定点数止盈止损,不管账户总风险;建议每单风险不超过账户的2%,手数=账户*0.02÷(止损点数*0.1)。
  1. 适用周期:H1(1小时)或H4(4小时)图效果较好,M5/M15太快会频繁交易,D1太慢信号少。
  1. 注意:黄金点差大(通常2-5美元),开仓瞬间就亏点差,止损不要设太小(建议≥200点)。
  1. 实盘前检查:确认经纪商允许EA自动交易(工具→选项→EA交易→勾选"允许算法交易"),图表右上角显示笑脸图标表示EA正常运行。

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

这是什么

这是一个基于双均线交叉的MT5自动交易EA,专为黄金等波动品种设计。快线上穿慢线时自动做多,下穿时自动做空,每笔订单开仓时就设定固定的止盈和止损点数,不需要盯盘手动平仓。

逻辑原理

EA用两条均线判断趋势方向:快线(默认10周期EMA)反应灵敏,慢线(默认30周期EMA)平滑趋势。当快线从下方突破慢线,说明短期动能转强,EA在新K线产生时按市价买入;当快线从上方跌破慢线,说明动能转弱,EA按市价卖出。

每次开仓后,EA立即设定固定点数的止盈止损:默认止盈500点(黄金约50美元),止损300点(约30美元),盈亏比1.67:1。如果勾选"同时只持有一单",出现反向信号时EA会先平掉现有持仓再反手开新单;如果不勾选,会同时持有多空单(不推荐)。

EA只在每根新K线产生时检查一次信号,避免同一根K线重复开仓。

参数说明

  • FastMA_Period (10):快速均线周期,越小越敏感但假信号多,15分钟到1小时图可用8-15,日线图可改成20
  • SlowMA_Period (30):慢速均线周期,决定趋势判断的时间跨度,1小时图可用20-50,日线图可改成50或100
  • MA_Method (MODE_EMA):均线类型,默认指数移动平均,也可改成简单移动平均(MODE_SMA)或加权(MODE_LWMA)
  • MA_Price (PRICE_CLOSE):均线计算用的价格,默认收盘价,一般不用改
  • LotSize (0.1):每单手数,0.1标准手在黄金上每点约10美元盈亏,根据账户资金和风险承受力调整
  • TakeProfit (500):止盈点数,黄金1点=0.1美元,500点=50美元,波动大时可加到800-1000
  • StopLoss (300):止损点数,300点=30美元,建议不小于200点(黄金点差通常20-50点),太小容易被扫
  • Slippage (50):允许滑点范围,50点在黄金上约5美元,行情剧烈时可能成交价偏离
  • MagicNumber (888888):EA的识别编号,同一账户跑多个EA时用来区分,一般不用改
  • TradeComment ("GoldEA"):订单备注,在MT5持仓列表里显示
  • OneTradeOnly (true):勾选时同时只持有一单,反向信号会平仓再反手;不勾选会同时持有多空单
  • AllowBuy (true):是否允许做多,如果只想做空可关闭
  • AllowSell (true):是否允许做空,如果只想做多可关闭

怎么用

把代码保存为 .mq5 文件,放进 MT5 安装目录的 MQL5\Experts 文件夹,重启MT5或在导航器里右键刷新。打开黄金图表,从导航器拖动EA到图上,在弹出的参数窗口调整设置,点确定。

图表右上角显示笑脸图标说明EA在运行。如果是哭脸,检查 工具→选项→EA交易 里是否勾选了"允许算法交易"。

建议先在策略测试器里用历史数据回测,调出合适的参数组合和盈亏曲线,再挂到实盘或模拟盘。

适用场景

适合有明显趋势的品种和周期:黄金、原油、外汇主要货币对在H1(1小时)或H4(4小时)图上效果较好。日内波段交易者可以在M15或M30图用更小的均线周期(比如5和15)。

不适合震荡市和超短周期:横盘时双均线频繁交叉会产生大量假信号,来回止损。M1和M5图噪音大,点差占比高,不推荐。周线和月线信号太少,不适合自动交易。

如果品种点差超过10美元(比如某些小币种或离岸差价合约),固定止损可能吃不消点差成本,需要加大止损或换品种。

风险提示

双均线是滞后指标,信号出现时趋势已经走了一段,容易在转折点顶部接多或底部接空。震荡市里均线反复缠绕,会连续触发假信号导致止损连亏。

固定点数止盈止损不考虑市场波动率变化:平静时300点可能太大,剧烈时500点可能太小。黄金开盘跳空、重要数据公布时滑点可能超过设定值,实际成交价比预期差。

EA没有仓位管理和资金保护,如果手数设太大或连续亏损,账户可能快速回撤。建议每单风险不超过账户的1-2%,手数 = 账户余额 × 0.02 ÷ (止损点数 × 每点价值)。

代码里没有时间过滤(比如避开亚盘或周五收盘)、没有最大回撤保护、没有移动止损,属于最基础的趋势跟踪EA,实盘前务必充分回测和小资金试跑。

常见问题

这个EA在震荡行情会不会频繁亏损?
会。双均线策略在横盘震荡时会产生大量假交叉信号,来回止损。代码里没有震荡过滤机制,建议只在趋势明显的时段使用,或加入ATR波动率过滤。
默认参数适合什么周期?
默认快线10慢线30适合H1(1小时)图,止盈500点止损300点对应黄金日内波段。如果用H4图建议把止盈止损加倍,M15图建议减半,并相应调整均线周期。
可以用在黄金以外的品种吗?
可以,代码没有限制品种。但止盈止损点数和每点价值因品种而异,比如欧美外汇对1点=10美元,原油1点=10美元,需要根据品种重新调整TakeProfit和StopLoss参数。
为什么有时候信号出现了但没开仓?
可能是:1) 账户余额不足开设新仓位;2) 经纪商禁用了EA交易或该品种不允许自动交易;3) OneTradeOnly勾选时已有持仓且是同向单;4) AllowBuy或AllowSell被关闭。检查日志里的错误代码。
EA会自动移动止损或加仓吗?
不会。代码里只有开仓时设定的固定止盈止损,不会根据行情调整。如果需要移动止损(trailing stop)或金字塔加仓,需要自己修改代码添加逻辑。

Gold MA Crossover EA with Fixed TP/SL for MT5

An automated trading EA for MT5 based on dual moving average crossover. It enters long on golden cross and short on death cross, with fixed take-profit (500 points) and stop-loss (300 points). All parameters are adjustable, suitable for intraday swing trading on gold.

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

评论

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

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