Summary: 黄金曙光EA是一款专为XAUUSD设计的MQL4智能交易系统,融合趋势跟踪、均值回归与突破三种策略,根据市场状态动态切换,适合H1周期稳定运行。
黄金曙光EA是一款专为黄金(XAUUSD)稳定性而设计的多策略交易系统。与单一策略EA在不同市场状态下的失效不同,曙光EA基于当前市场条件在三种经过验证的方法之间动态切换。EA使用波动率状态检测器判断市场处于趋势、盘整还是突破状态,然后应用最合适的策略。所有交易均包含固定止损和止盈,同一时间最多持有一单。系统包含每日净值保护、点差控制、周五平仓机制以及最大回撤限制器。无网格、无马丁、无危险的逆势加仓。
推荐加载周期: H1
策略核心逻辑:
1. 状态检测:计算ATR(20)并与50周期平均ATR比较,将市场分类为趋势(ATR > 1.5倍均值)、盘整(ATR < 0.8倍均值)或突破。
2. 趋势模式:使用EMA(50)和EMA(200)金叉/死叉,配合ADX(14) > 25确认。
3. 盘整模式:使用RSI(14)极值(超卖<30,超买>70)且价格接近布林带边缘。
4. 突破模式:检测价格突破20周期高点或低点,伴随成交量放量确认。
5. 风险控制:固定止损300点,止盈600点。每日亏损上限5%,最大点差35点,最大回撤15%。
```mql4
//+------------------------------------------------------------------+
//| GoldAuroraEA.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property version "1.00"
#property strict
//--- 输入参数及注释
input double LotSize = 0.01; // 固定交易手数(黄金0.01手)
input int FastEMAPeriod = 50; // 趋势模式快EMA周期
input int SlowEMAPeriod = 200; // 趋势模式慢EMA周期
input int ADXPeriod = 14; // ADX周期(趋势强度)
input int ADXThreshold = 25; // 趋势模式最小ADX阈值
input int RSIPeriod = 14; // 盘整模式RSI周期
input int RSIOversold = 30; // RSI超卖水平(低于此值买入)
input int RSIOverbought = 70; // RSI超买水平(高于此值卖出)
input int BBPeriod = 20; // 布林带周期
input double BBDeviation = 2.0; // 布林带标准差倍数
input int BreakoutPeriod = 20; // 突破检测回溯周期
input double TrendingATRMultiplier = 1.5; // 趋势状态ATR倍数阈值
input double RangingATRMultiplier = 0.8; // 盘整状态ATR倍数阈值
input int StopLossPoints = 300; // 固定止损点数
input int TakeProfitPoints = 600; // 固定止盈点数
input int MagicNumber = 202421; // EA魔术号
input int MaxSpread = 35; // 最大允许点差(黄金单位:点)
input double DailyLossLimit = 5.0; // 每日亏损限额(账户余额百分比)
input double MaxDrawdownPercent = 15.0; // 最大权益回撤限制
input bool UseFridayClose = true; // 周五21:00 GMT前平仓
//--- 全局变量
double dailyStartBalance = 0;
double peakEquity = 0;
datetime lastBarTime = 0;
bool fridayCloseExecuted = false;
bool drawdownStop = false;
double avgATR = 0;
//--- 市场状态枚举
enum MarketRegime {
REGIME_TRENDING = 1, // 趋势状态
REGIME_RANGING = 2, // 盘整状态
REGIME_BREAKOUT = 3, // 突破状态
REGIME_NEUTRAL = 0 // 中性状态
};
//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
dailyStartBalance = AccountBalance();
peakEquity = AccountEquity();
lastBarTime = 0;
fridayCloseExecuted = false;
drawdownStop = false;
avgATR = iATR(Symbol(), PERIOD_H1, 20, 1);
if(avgATR <= 0) avgATR = 250 * Point;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| EA退出函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| 检测当前市场状态 |
//+------------------------------------------------------------------+
MarketRegime DetectRegime()
{
double currentATR = iATR(Symbol(), PERIOD_H1, 20, 1);
double avgATRLong = iATR(Symbol(), PERIOD_H1, 50, 1);
if(avgATRLong <= 0) avgATRLong = currentATR;
double ratio = currentATR / avgATRLong;
// 趋势状态:波动率高于平均水平
if(ratio > TrendingATRMultiplier)
{
double adx = iADX(Symbol(), PERIOD_H1, ADXPeriod, PRICE_CLOSE, MODE_MAIN, 1);
if(adx >= ADXThreshold)
return REGIME_TRENDING;
}
// 盘整状态:波动率低于平均水平
if(ratio < RangingATRMultiplier)
{
return REGIME_RANGING;
}
// 检查潜在突破
int highestIdx = iHighest(Symbol(), PERIOD_H1, MODE_HIGH, BreakoutPeriod, 1);
int lowestIdx = iLowest(Symbol(), PERIOD_H1, MODE_LOW, BreakoutPeriod, 1);
double highBound = iHigh(Symbol(), PERIOD_H1, highestIdx);
double lowBound = iLow(Symbol(), PERIOD_H1, lowestIdx);
double close1 = iClose(Symbol(), PERIOD_H1, 1);
double range = highBound - lowBound;
if(range > 0 && currentATR > avgATRLong * 1.2)
{
if(close1 > highBound || close1 < lowBound)
return REGIME_BREAKOUT;
}
return REGIME_NEUTRAL;
}
//+------------------------------------------------------------------+
//| 趋势策略 - EMA交叉配合ADX确认 |
//+------------------------------------------------------------------+
bool GetTrendingSignal(int &cmd, double &sl, double &tp)
{
double fastEMA = iMA(Symbol(), PERIOD_H1, FastEMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double slowEMA = iMA(Symbol(), PERIOD_H1, SlowEMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double fastEMAPrev = iMA(Symbol(), PERIOD_H1, FastEMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 2);
double slowEMAPrev = iMA(Symbol(), PERIOD_H1, SlowEMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 2);
double adx = iADX(Symbol(), PERIOD_H1, ADXPeriod, PRICE_CLOSE, MODE_MAIN, 1);
double diPlus = iADX(Symbol(), PERIOD_H1, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI, 1);
double diMinus = iADX(Symbol(), PERIOD_H1, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, 1);
if(adx < ADXThreshold) return false;
// 金叉:快EMA上穿慢EMA
if(fastEMAPrev <= slowEMAPrev && fastEMA > slowEMA && diPlus > diMinus)
{
cmd = OP_BUY;
sl = SymbolInfoDouble(Symbol(), SYMBOL_BID) - StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_BID) + TakeProfitPoints * Point;
return true;
}
// 死叉:快EMA下穿慢EMA
else if(fastEMAPrev >= slowEMAPrev && fastEMA < slowEMA && diMinus > diPlus)
{
cmd = OP_SELL;
sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK) + StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK) - TakeProfitPoints * Point;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 盘整策略 - RSI极值配合布林带确认 |
//+------------------------------------------------------------------+
bool GetRangingSignal(int &cmd, double &sl, double &tp)
{
double rsi = iRSI(Symbol(), PERIOD_H1, RSIPeriod, PRICE_CLOSE, 1);
double bbUpper = iBands(Symbol(), PERIOD_H1, BBPeriod, BBDeviation, 0, PRICE_CLOSE, MODE_UPPER, 1);
double bbLower = iBands(Symbol(), PERIOD_H1, BBPeriod, BBDeviation, 0, PRICE_CLOSE, MODE_LOWER, 1);
double close1 = iClose(Symbol(), PERIOD_H1, 1);
// 超卖条件:RSI低于阈值且价格接近下轨
if(rsi <= RSIOversold && close1 <= bbLower + (bbLower * 0.002))
{
cmd = OP_BUY;
sl = SymbolInfoDouble(Symbol(), SYMBOL_BID) - StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_BID) + TakeProfitPoints * Point;
return true;
}
// 超买条件:RSI高于阈值且价格接近上轨
else if(rsi >= RSIOverbought && close1 >= bbUpper - (bbUpper * 0.002))
{
cmd = OP_SELL;
sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK) + StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK) - TakeProfitPoints * Point;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 突破策略 - 区间突破配合动量确认 |
//+------------------------------------------------------------------+
bool GetBreakoutSignal(int &cmd, double &sl, double &tp)
{
int highestIdx = iHighest(Symbol(), PERIOD_H1, MODE_HIGH, BreakoutPeriod, 2);
int lowestIdx = iLowest(Symbol(), PERIOD_H1, MODE_LOW, BreakoutPeriod, 2);
double highBound = iHigh(Symbol(), PERIOD_H1, highestIdx);
double lowBound = iLow(Symbol(), PERIOD_H1, lowestIdx);
double close1 = iClose(Symbol(), PERIOD_H1, 1);
double open1 = iOpen(Symbol(), PERIOD_H1, 1);
double volume1 = iVolume(Symbol(), PERIOD_H1, 1);
double avgVolume = iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, VOLUME, 1);
// 向上突破:收盘价高于区间高点,阳线,成交量放大
if(close1 > highBound && close1 > open1 && volume1 > avgVolume * 1.2)
{
cmd = OP_BUY;
sl = SymbolInfoDouble(Symbol(), SYMBOL_BID) - StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_BID) + TakeProfitPoints * Point;
return true;
}
// 向下突破:收盘价低于区间低点,阴线,成交量放大
else if(close1 < lowBound && close1 < open1 && volume1 > avgVolume * 1.2)
{
cmd = OP_SELL;
sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK) + StopLossPoints * Point;
tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK) - TakeProfitPoints * Point;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| 权益保护 - 跟踪回撤并限制 |
//+------------------------------------------------------------------+
bool CheckEquityProtection()
{
double currentEquity = AccountEquity();
if(currentEquity > peakEquity)
peakEquity = currentEquity;
double drawdownPercent = (peakEquity - currentEquity) / peakEquity * 100;
if(drawdownPercent >= MaxDrawdownPercent)
{
if(!drawdownStop)
{
CloseAllOrders();
drawdownStop = true;
Comment("已达最大回撤限制,EA停止");
}
return false;
}
// 每日亏损限额检查
double dailyLossPercent = (dailyStartBalance - currentEquity) / dailyStartBalance * 100;
if(dailyLossPercent >= DailyLossLimit)
{
Comment("已达每日亏损上限,停止开新仓");
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| EA主循环函数(每Tick执行) |
//+------------------------------------------------------------------+
void OnTick()
{
// 权益保护
if(!CheckEquityProtection())
return;
// 周五收盘前平仓(规避周末跳空)
if(UseFridayClose && !fridayCloseExecuted)
{
datetime currentTime = TimeCurrent();
if(TimeDayOfWeek(currentTime) == 5 && TimeHour(currentTime) >= 21)
{
CloseAllOrders();
fridayCloseExecuted = true;
return;
}
if(TimeDayOfWeek(currentTime) != 5)
fridayCloseExecuted = false;
}
// 点差过滤
if(MarketInfo(Symbol(), MODE_SPREAD) > MaxSpread)
{
Comment("当前点差过大:", MarketInfo(Symbol(), MODE_SPREAD));
return;
}
// 仅在新K线开始时检测入场(H1)
if(Time[0] == lastBarTime)
return;
lastBarTime = Time[0];
// 更新平均ATR
double atr = iATR(Symbol(), PERIOD_H1, 20, 1);
if(atr > 0) avgATR = (avgATR * 0.95) + (atr * 0.05);
// 检查现有持仓
if(CountPositions() > 0)
return;
// 检测市场状态
MarketRegime regime = DetectRegime();
bool signalGenerated = false;
int cmd = -1;
double sl = 0, tp = 0;
switch(regime)
{
case REGIME_TRENDING:
signalGenerated = GetTrendingSignal(cmd, sl, tp);
if(signalGenerated)
Comment("信号:趋势模式");
break;
case REGIME_RANGING:
signalGenerated = GetRangingSignal(cmd, sl, tp);
if(signalGenerated)
Comment("信号:盘整模式");
break;
case REGIME_BREAKOUT:
signalGenerated = GetBreakoutSignal(cmd, sl, tp);
if(signalGenerated)
Comment("信号:突破模式");
break;
default:
Comment("市场状态:中性 - 暂停交易");
break;
}
if(signalGenerated && cmd != -1)
{
double price = (cmd == OP_BUY) ? Ask : Bid;
int ticket = OrderSend(Symbol(), cmd, LotSize, price, 5, sl, tp, "Gold Aurora", MagicNumber, 0, clrNONE);
if(ticket < 0)
Print("开仓失败,错误码:", GetLastError());
else
Print("开仓成功,策略模式:", regime);
}
}
//+------------------------------------------------------------------+
//| 统计当前魔术号的持仓数量 |
//+------------------------------------------------------------------+
int CountPositions()
{
int count = 0;
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
count++;
}
}
return count;
}
//+------------------------------------------------------------------+
//| 平仓当前品种下所有属于该EA的订单 |
//+------------------------------------------------------------------+
void CloseAllOrders()
{
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 5, clrNONE);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 5, clrNONE);
}
}
}
}
//+------------------------------------------------------------------+
```
参考来源: 原创MQL4代码,策略融合了2025-2026年黄金市场分析中的多策略思想。
免责声明: 黄金交易因高波动性具有重大风险。本EA按“原样”提供,不保证盈利。实盘部署前请在模拟账户充分测试。历史表现不代表未来结果。
```