黄金固定止盈止损EA
双均线交叉自动交易,固定止盈止损点数,适合黄金日内波段
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#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);
}
}
}
}作品说明
由于你只提到"固定止盈止损",没有说明入场规则(什么时候买、什么时候卖),我给你实现一个双均线交叉策略的黄金EA:快线上穿慢线做多,下穿做空,每次开仓带固定止盈止损点数,所有参数都可以在图表上调整。
使用说明
- 安装:将代码保存为
.mq5文件,放入 MT5 的MQL5\Experts目录,重启MT5或刷新导航器,拖到黄金图表上。
- 核心参数:
- 快慢均线周期:默认10和30,适合15分钟到1小时图;日线可改成20/50。
- 手数:0.1表示0.1标准手(约10美元一点),根据账户资金调整。
- 止盈止损点数:黄金1个点=0.1美元,500点=50美元,300点=30美元;波动大时可加大。
- 信号逻辑:快线上穿慢线→买入;快线下穿慢线→卖出;勾选"同时只持有一单"会在反向信号时先平仓再反手。
- 回测建议:在策略测试器里先用历史数据测试,调整参数到合适的盈亏比和胜率,再上实盘。
- 风险控制:EA只负责固定点数止盈止损,不管账户总风险;建议每单风险不超过账户的2%,手数=账户*0.02÷(止损点数*0.1)。
- 适用周期:H1(1小时)或H4(4小时)图效果较好,M5/M15太快会频繁交易,D1太慢信号少。
- 注意:黄金点差大(通常2-5美元),开仓瞬间就亏点差,止损不要设太小(建议≥200点)。
- 实盘前检查:确认经纪商允许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.
评论
还没有人评论,来抢个沙发。