Summary: 黄金联结EA是一款专为XAUUSD设计的MQL4智能交易系统。融合H4宏观趋势过滤、M15回调结构评分系统、RSI背离确认和ATR动态止损,适合H1周期分析配合M15入场。
黄金联结EA基于2024-2026年商业黄金EA的结构化原理设计。该EA融合了三个核心概念:H4宏观趋势过滤、M15回调结构专有评分系统、以及RSI背离确认。这种多时间框架融合方法确保交易与主导趋势一致,同时在最优回调区域入场。EA包含波动率自适应仓位管理、达到指定盈利阈值后激活的追踪止损系统、点差过滤和每日净值保护。不使用马丁格尔或网格回血——每笔交易独立,采用基于ATR的固定止损。
推荐加载周期: H1(主趋势分析)+ M15(入场时机)
策略核心逻辑:
1. 宏观趋势过滤:H4周期的EMA89和EMA34确定主趋势方向。EMA34必须在EMA89上方才能做多,或在下方才能做空。
2. 趋势强度验证:ATR标准化的EMA价差将趋势分为弱/正常/强——仅在正常或强趋势条件下允许交易。
3. M15回调检测:价格必须回撤至EMA20区域或RSI 45-55区间。
4. 入场触发:突破前一根K线的高低点且方向与趋势一致,同时需要RSI背离确认(价格极值与RSI极值的背离)。
5. 风险管理: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按“原样”提供,不保证盈利。实盘部署前请在模拟账户充分测试。历史表现不代表未来结果。
```