Summary: 黄金曙光EA是一款专为XAUUSD设计的MQL4智能交易系统,融合趋势跟踪、均值回归与突破三种策略,根据市场状态动态切换,适合H1周期稳定运行。




黄金曙光EA是一款专为黄金(XAUUSD)稳定性而设计的多策略交易系统。与单一策略EA在不同市场状态下的失效不同,曙光EA基于当前市场条件在三种经过验证的方法之间动态切换。EA使用波动率状态检测器判断市场处于趋势、盘整还是突破状态,然后应用最合适的策略。所有交易均包含固定止损和止盈,同一时间最多持有一单。系统包含每日净值保护、点差控制、周五平仓机制以及最大回撤限制器。无网格、无马丁、无危险的逆势加仓。

推荐加载周期: H1
策略核心逻辑:
  • 状态检测:计算ATR(20)并与50周期平均ATR比较,将市场分类为趋势(ATR > 1.5倍均值)、盘整(ATR < 0.8倍均值)或突破。

  • 趋势模式:使用EMA(50)和EMA(200)金叉/死叉,配合ADX(14) > 25确认。

  • 盘整模式:使用RSI(14)极值(超卖<30,超买>70)且价格接近布林带边缘。

  • 突破模式:检测价格突破20周期高点或低点,伴随成交量放量确认。

  • 风险控制:固定止损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按“原样”提供,不保证盈利。实盘部署前请在模拟账户充分测试。历史表现不代表未来结果。
    ``