Summary: 黄金联结EA是一款专为XAUUSD设计的MQL4智能交易系统。融合H4宏观趋势过滤、M15回调结构评分系统、RSI背离确认和ATR动态止损,适合H1周期分析配合M15入场。




黄金联结EA基于2024-2026年商业黄金EA的结构化原理设计。该EA融合了三个核心概念:H4宏观趋势过滤、M15回调结构专有评分系统、以及RSI背离确认。这种多时间框架融合方法确保交易与主导趋势一致,同时在最优回调区域入场。EA包含波动率自适应仓位管理、达到指定盈利阈值后激活的追踪止损系统、点差过滤和每日净值保护。不使用马丁格尔或网格回血——每笔交易独立,采用基于ATR的固定止损。

推荐加载周期: H1(主趋势分析)+ M15(入场时机)
策略核心逻辑:
  • 宏观趋势过滤:H4周期的EMA89和EMA34确定主趋势方向。EMA34必须在EMA89上方才能做多,或在下方才能做空。

  • 趋势强度验证:ATR标准化的EMA价差将趋势分为弱/正常/强——仅在正常或强趋势条件下允许交易。

  • M15回调检测:价格必须回撤至EMA20区域或RSI 45-55区间。

  • 入场触发:突破前一根K线的高低点且方向与趋势一致,同时需要RSI背离确认(价格极值与RSI极值的背离)。

  • 风险管理:ATR动态止损(1.6倍ATR),止盈2.8倍ATR,盈利达到1.2倍ATR后启动追踪止损。


  • ``mql4
    //+------------------------------------------------------------------+
    //| GoldNexusEA.mq4 |
    //+------------------------------------------------------------------+
    #property copyright ""
    #property link ""
    #property version "1.00"
    #property strict

    //--- 输入参数及注释
    input double LotSize = 0.01; // 固定交易手数(黄金0.01手)
    input int H4FastEMA = 34; // H4快EMA(宏观趋势)
    input int H4SlowEMA = 89; // H4慢EMA(宏观趋势)
    input int PullbackMAPeriod = 20; // 回调检测EMA周期(M15)
    input int RSIPeriod = 14; // RSI周期(背离检测)
    input int RSIOversold = 30; // RSI超卖阈值
    input int RSIOverbought = 70; // RSI超买阈值
    input int ADXPeriod = 14; // ADX周期(趋势强度)
    input int ADXWeakThreshold = 20; // 低于此值弱趋势(不开仓)
    input int ADXStrongThreshold = 40; // 高于此值强趋势
    input int ATRPeriod = 14; // ATR周期(止损计算)
    input double ATRStopMultiplier = 1.6; // 止损倍数(ATR倍数)
    input double ATRTakeMultiplier = 2.8; // 止盈倍数(ATR倍数)
    input double TrailingStartATR = 1.2; // 追踪止损启动(盈利达到x倍ATR)
    input double TrailingStepATR = 0.6; // 追踪步长(ATR倍数)
    input int MinPullbackScore = 55; // 最小回调评分(0-100)入场阈值
    input int MagicNumber = 202403; // EA魔术号
    input int MaxSpread = 35; // 最大允许点差(黄金单位:点)
    input double DailyLossLimit = 5.0; // 每日亏损限额(账户余额百分比)
    input bool UseFridayClose = true; // 周五21:00 GMT前平仓
    input bool UseNewsFilter = true; // 重大新闻时段跳过交易

    //--- 全局变量
    double dailyStartBalance = 0;
    datetime lastBarTime = 0;
    bool fridayCloseExecuted = false;
    double avgATR_H1 = 0;
    double currentPullbackScore = 0;

    //+------------------------------------------------------------------+
    //| EA初始化函数 |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    dailyStartBalance = AccountBalance();
    lastBarTime = 0;
    fridayCloseExecuted = false;
    avgATR_H1 = iATR(Symbol(), PERIOD_H1, ATRPeriod, 1);
    if(avgATR_H1 <= 0) avgATR_H1 = 250 Point;
    return(INIT_SUCCEEDED);
    }

    //+------------------------------------------------------------------+
    //| EA退出函数 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    Comment("");
    }

    //+------------------------------------------------------------------+
    //| 获取宏观趋势方向(H4 EMA交叉) |
    //+------------------------------------------------------------------+
    int GetMacroTrendDirection()
    {
    double fastEMA = iMA(Symbol(), PERIOD_H4, H4FastEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double slowEMA = iMA(Symbol(), PERIOD_H4, H4SlowEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double prevFast = iMA(Symbol(), PERIOD_H4, H4FastEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
    double prevSlow = iMA(Symbol(), PERIOD_H4, H4SlowEMA, 0, MODE_EMA, PRICE_CLOSE, 2);

    if(fastEMA > slowEMA && prevFast <= prevSlow) return 1; // 金叉(看涨)
    if(fastEMA < slowEMA && prevFast >= prevSlow) return -1; // 死叉(看跌)
    if(fastEMA > slowEMA) return 2; // 已在看涨趋势
    if(fastEMA < slowEMA) return -2; // 已在看跌趋势
    return 0;
    }

    //+------------------------------------------------------------------+
    //| 使用ATR标准化的EMA价差计算趋势强度 |
    //+------------------------------------------------------------------+
    int GetTrendStrength()
    {
    double fastEMA = iMA(Symbol(), PERIOD_H4, H4FastEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double slowEMA = iMA(Symbol(), PERIOD_H4, H4SlowEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double atr = iATR(Symbol(), PERIOD_H4, ATRPeriod, 1);
    if(atr <= 0) return 1;

    double spread = MathAbs(fastEMA - slowEMA);
    double normalizedSpread = spread / atr;

    if(normalizedSpread < 0.5) return 0; // 弱趋势
    if(normalizedSpread < 1.2) return 1; // 正常趋势
    return 2; // 强趋势
    }

    //+------------------------------------------------------------------+
    //| 检测RSI背离(价格与RSI极值的对比) |
    //+------------------------------------------------------------------+
    bool DetectRSIDivergence(int direction)
    {
    double rsi = iRSI(Symbol(), PERIOD_M15, RSIPeriod, PRICE_CLOSE, 1);
    double rsiPrev = iRSI(Symbol(), PERIOD_M15, RSIPeriod, PRICE_CLOSE, 2);
    double price = iClose(Symbol(), PERIOD_M15, 1);
    double pricePrev = iClose(Symbol(), PERIOD_M15, 2);

    if(direction == 1) // 底背离:价格更低低点,RSI更高低点
    {
    bool priceLowerLow = (price < pricePrev);
    bool rsiHigherLow = (rsi > rsiPrev && rsi < RSIOversold);
    return (priceLowerLow && rsiHigherLow);
    }
    else if(direction == -1) // 顶背离:价格更高高点,RSI更低高点
    {
    bool priceHigherHigh = (price > pricePrev);
    bool rsiLowerHigh = (rsi < rsiPrev && rsi > RSIOverbought);
    return (priceHigherHigh && rsiLowerHigh);
    }
    return false;
    }

    //+------------------------------------------------------------------+
    //| 计算回调评分(0-100分)基于多因素 |
    //+------------------------------------------------------------------+
    int CalculatePullbackScore(int trendDir)
    {
    int score = 0;

    // 因素1:价格回撤至EMA20区域(0-40分)
    double ema20 = iMA(Symbol(), PERIOD_M15, PullbackMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
    double close = iClose(Symbol(), PERIOD_M15, 1);
    double atr = iATR(Symbol(), PERIOD_M15, ATRPeriod, 1);
    double distanceToEMA = MathAbs(close - ema20) / atr;

    if(distanceToEMA < 0.3) score += 40;
    else if(distanceToEMA < 0.6) score += 25;
    else if(distanceToEMA < 1.0) score += 10;

    // 因素2:RSI在中性区间(45-55)确认回调(0-40分)
    double rsi = iRSI(Symbol(), PERIOD_M15, RSIPeriod, PRICE_CLOSE, 1);
    if(trendDir == 1 && rsi >= 45 && rsi <= 55) score += 40;
    else if(trendDir == -1 && rsi >= 45 && rsi <= 55) score += 40;
    else if(trendDir == 1 && rsi > 55 && rsi < 65) score += 20;
    else if(trendDir == -1 && rsi < 55 && rsi > 45) score += 20;

    // 因素3:K线结构确认(0-20分)
    double open = iOpen(Symbol(), PERIOD_M15, 1);
    double high = iHigh(Symbol(), PERIOD_M15, 1);
    double low = iLow(Symbol(), PERIOD_M15, 1);
    double body = MathAbs(close - open);
    double range = high - low;

    if(trendDir == 1 && close > open && body/range > 0.6) score += 20;
    else if(trendDir == -1 && close < open && body/range > 0.6) score += 20;
    else if(body/range > 0.4) score += 10;

    return score;
    }

    //+------------------------------------------------------------------+
    //| 检查入场触发:突破前一根K线高低点 |
    //+------------------------------------------------------------------+
    bool CheckEntryTrigger(int direction)
    {
    double prevHigh = iHigh(Symbol(), PERIOD_M15, 2);
    double prevLow = iLow(Symbol(), PERIOD_M15, 2);
    double currentHigh = iHigh(Symbol(), PERIOD_M15, 1);
    double currentLow = iLow(Symbol(), PERIOD_M15, 1);
    double currentClose = iClose(Symbol(), PERIOD_M15, 1);
    double currentOpen = iOpen(Symbol(), PERIOD_M15, 1);

    if(direction == 1) // 看涨:突破前高
    {
    bool breakAbove = (currentHigh > prevHigh && currentClose > prevHigh);
    bool bullishCandle = (currentClose > currentOpen);
    return (breakAbove && bullishCandle);
    }
    else if(direction == -1) // 看跌:跌破前低
    {
    bool breakBelow = (currentLow < prevLow && currentClose < prevLow);
    bool bearishCandle = (currentClose < currentOpen);
    return (breakBelow && bearishCandle);
    }
    return false;
    }

    //+------------------------------------------------------------------+
    //| 管理持仓的追踪止损 |
    //+------------------------------------------------------------------+
    void ManageTrailingStop()
    {
    for(int i = OrdersTotal()-1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
    {
    double atr = iATR(Symbol(), PERIOD_H1, ATRPeriod, 1);
    if(atr <= 0) atr = avgATR_H1;

    double activate = atr
    TrailingStartATR;
    double step = atr TrailingStepATR;
    double newSL = 0;

    if(OrderType() == OP_BUY)
    {
    double profit = Bid - OrderOpenPrice();
    if(profit >= activate)
    {
    newSL = Bid - step;
    if(newSL > OrderStopLoss())
    OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrNONE);
    }
    }
    else if(OrderType() == OP_SELL)
    {
    double profit = OrderOpenPrice() - Ask;
    if(profit >= activate)
    {
    newSL = Ask + step;
    if(newSL < OrderStopLoss() || OrderStopLoss() == 0)
    OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrNONE);
    }
    }
    break;
    }
    }
    }
    }

    //+------------------------------------------------------------------+
    //| 检查是否为重大新闻时段(简化过滤器) |
    //+------------------------------------------------------------------+
    bool IsNewsTime()
    {
    if(!UseNewsFilter) return false;
    datetime currentTime = TimeCurrent();
    int hour = TimeHour(currentTime);
    int minute = TimeMinute(currentTime);
    int dayOfWeek = TimeDayOfWeek(currentTime);

    // 重大非农、FOMC、CPI发布时间(简化:第一个周五13:30 GMT)
    if(dayOfWeek == 5 && hour >= 13 && hour <= 14)
    return true;
    // FOMC日期(周三19:00 GMT左右)
    if(dayOfWeek == 4 && hour >= 18 && hour <= 20)
    return true;
    // CPI发布(通常在13:30 GMT)
    if(hour == 13 && minute >= 25 && minute <= 35)
    return true;

    return false;
    }

    //+------------------------------------------------------------------+
    //| EA主循环函数(每Tick执行) |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    // 每日净值保护
    double currentEquity = AccountEquity();
    double lossPercent = (dailyStartBalance - currentEquity) / dailyStartBalance
    100;
    if(lossPercent >= DailyLossLimit)
    {
    Comment("已达每日亏损上限,停止开新仓");
    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(IsNewsTime())
    {
    Comment("重大新闻时段,暂停交易");
    return;
    }

    // 点差过滤
    if(MarketInfo(Symbol(), MODE_SPREAD) > MaxSpread)
    {
    Comment("当前点差过大:", MarketInfo(Symbol(), MODE_SPREAD));
    return;
    }

    // H1(宏观分析)和M15(入场)的新K线检测
    static datetime lastH1Bar = 0;
    static datetime lastM15Bar = 0;
    datetime currentH1Bar = iTime(Symbol(), PERIOD_H1, 0);
    datetime currentM15Bar = iTime(Symbol(), PERIOD_M15, 0);

    bool isNewH1Bar = (currentH1Bar != lastH1Bar);
    bool isNewM15Bar = (currentM15Bar != lastM15Bar);

    if(isNewH1Bar)
    lastH1Bar = currentH1Bar;
    if(isNewM15Bar)
    lastM15Bar = currentM15Bar;

    // 管理现有持仓
    if(CountPositions() > 0)
    {
    ManageTrailingStop();
    return;
    }

    // 仅在新M15 K线开始时评估入场(入场时机)
    if(!isNewM15Bar) return;

    // 步骤1:获取宏观趋势方向(H4)
    int macroTrend = GetMacroTrendDirection();
    if(macroTrend == 0)
    {
    Comment("无明确宏观趋势");
    return;
    }
    int trendDirection = (macroTrend > 0) ? 1 : -1;

    // 步骤2:检查趋势强度
    int trendStrength = GetTrendStrength();
    if(trendStrength == 0) // 弱趋势 - 不开仓
    {
    Comment("趋势过弱,不开仓");
    return;
    }

    // 步骤3:计算回调评分
    int pullbackScore = CalculatePullbackScore(trendDirection);
    currentPullbackScore = pullbackScore;

    if(pullbackScore < MinPullbackScore)
    {
    Comment("回调评分过低:", pullbackScore);
    return;
    }

    // 步骤4:检查RSI背离确认
    bool hasDivergence = DetectRSIDivergence(trendDirection);

    // 步骤5:检查入场触发
    bool entryTrigger = CheckEntryTrigger(trendDirection);

    // 步骤6:组合入场条件
    if(entryTrigger && (pullbackScore >= MinPullbackScore || hasDivergence))
    {
    double atr = iATR(Symbol(), PERIOD_H1, ATRPeriod, 1);
    if(atr <= 0) atr = avgATR_H1;

    double entryPrice = (trendDirection == 1) ? Ask : Bid;
    double sl = 0, tp = 0;
    int cmd = (trendDirection == 1) ? OP_BUY : OP_SELL;

    if(cmd == OP_BUY)
    {
    sl = entryPrice - (atr ATRStopMultiplier);
    tp = entryPrice + (atr
    ATRTakeMultiplier);
    }
    else
    {
    sl = entryPrice + (atr ATRStopMultiplier);
    tp = entryPrice - (atr
    ATRTakeMultiplier);
    }

    int ticket = OrderSend(Symbol(), cmd, LotSize, entryPrice, 5, sl, tp, "Gold Nexus", MagicNumber, 0, clrNONE);
    if(ticket < 0)
    {
    Print("开仓失败,错误码:", GetLastError());
    }
    else
    {
    Print("开仓成功,方向:", cmd==OP_BUY?"买入":"卖出",
    " | 回调评分:", pullbackScore,
    " | 背离确认:", hasDivergence);
    }
    }
    else
    {
    if(!entryTrigger) Comment("等待入场触发信号");
    }
    }

    //+------------------------------------------------------------------+
    //| 统计当前魔术号的持仓数量 |
    //+------------------------------------------------------------------+
    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代码,策略架构参考了2024-2026年商业黄金EA的结构化原理,包括NEXA Gold Pullback System的评分方法论和Magic Gold Grid的H4趋势过滤概念。
    免责声明: 黄金交易因高波动性具有重大风险。本EA按“原样”提供,不保证盈利。实盘部署前请在模拟账户充分测试。历史表现不代表未来结果。
    ``