Summary: EURUSD网格稳定器EA是一款专为EURUSD设计的MQL4智能交易系统,使用受控网格策略,包含动态间距、最大持仓限制和每日亏损保护。




EURUSD网格稳定器EA实现了经典的网格交易策略,针对欧美(EURUSD)稳定、区间震荡的特性进行了优化。EA在当前价格周围以固定间隔挂出买入和卖出限价单。与激进的反向加仓(马丁格尔)系统不同,本EA使用固定手数并限制最大网格层数来控制回撤。基于ATR波动率的动态网格间距能够适应市场环境变化。EA包含基于净值的回撤保护以及整体利润达到设定阈值时平仓所有网格的止盈目标。

推荐加载周期: M30
策略核心逻辑:
1. 网格设置:在距离当前价格一定间隔的位置挂出买入止损和卖出止损单。
2. 动态间距:网格间距 = 基础间距 × (当前ATR / 参考ATR),自适应波动率。
3. 持仓管理:每侧(多/空)最大网格层数限制为MaxGridLevels。
4. 退出策略:当全部持仓总浮动盈利达到TakeProfitTarget(金额)时,平仓整个网格。

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

//--- 输入参数及注释
input double LotSize = 0.01; // 每笔网格订单的固定手数
input int BaseGridDistance = 25; // 基础网格间距(单位:点,25点=2.5个标准点)
input int MaxGridLevels = 5; // 每侧(多/空)最大网格层数
input double TakeProfitTarget = 15.0; // 止盈目标金额(美元,$15)
input bool UseDynamicDistance = true; // 启用基于ATR的动态网格间距
input int ATRPeriod = 14; // ATR周期(动态间距用)
input double ATRReference = 20.0; // 参考ATR值(单位:点,基准值)
input int MaxSpread = 20; // 最大允许点差(单位:点)
input double DailyLossLimit = 8.0; // 每日亏损限额(账户余额百分比)
input int MagicNumber = 202416; // EA魔术号
input bool UseFridayClose = true; // 周五21:00 GMT前平仓

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

//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
dailyStartBalance = AccountBalance();
lastBarTime = 0;
fridayCloseExecuted = false;
referenceATRValue = iATR(Symbol(), PERIOD_M30, ATRPeriod, 1);
if(referenceATRValue <= 0) referenceATRValue = ATRReference * Point;
currentGridDistance = BaseGridDistance;
return(INIT_SUCCEEDED);
}

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

//+------------------------------------------------------------------+
//| 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(MarketInfo(Symbol(), MODE_SPREAD) > MaxSpread)
{
Comment("当前点差过大:", MarketInfo(Symbol(), MODE_SPREAD));
return;
}

// 检查总盈利,达标则平仓整个网格
double totalProfit = GetTotalProfit();
if(totalProfit >= TakeProfitTarget)
{
CloseAllOrders();
Comment("止盈目标达成,网格已平仓");
return;
}

// 动态更新网格间距
if(UseDynamicDistance)
{
double currentATR = iATR(Symbol(), PERIOD_M30, ATRPeriod, 1);
if(currentATR > 0 && referenceATRValue > 0)
{
double atrRatio = currentATR / referenceATRValue;
atrRatio = MathMax(0.5, MathMin(2.0, atrRatio));
currentGridDistance = BaseGridDistance * atrRatio;
}
else
{
currentGridDistance = BaseGridDistance;
}
}
else
{
currentGridDistance = BaseGridDistance;
}

// 管理网格订单:删除旧的,根据当前价格重新挂单
ManageGridOrders();
}

//+------------------------------------------------------------------+
//| 管理网格订单:删除旧单,根据当前价格重新挂单 |
//+------------------------------------------------------------------+
void ManageGridOrders()
{
double currentPrice = Bid;
double point = Point;
double distance = currentGridDistance * point;

// 统计当前买入和卖出订单数量
int buyCount = 0, sellCount = 0;
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 || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP)
buyCount++;
if(OrderType() == OP_SELL || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP)
sellCount++;
}
}
}

// 删除不符合当前网格结构的挂单
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() > 1)
{
bool shouldRemove = false;
if(OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT)
{
double expectedPrice = currentPrice + (buyCount + 1) * distance;
if(MathAbs(OrderOpenPrice() - expectedPrice) > point * 5)
shouldRemove = true;
}
if(OrderType() == OP_SELLSTOP || OrderType() == OP_SELLLIMIT)
{
double expectedPrice = currentPrice - (sellCount + 1) * distance;
if(MathAbs(OrderOpenPrice() - expectedPrice) > point * 5)
shouldRemove = true;
}
if(shouldRemove)
OrderDelete(OrderTicket());
}
}
}

// 挂新的买入止损单(当前价格上方)
for(int level = 1; level <= MaxGridLevels; level++)
{
double buyPrice = currentPrice + (level * distance);
bool exists = false;

for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if((OrderType() == OP_BUYSTOP || OrderType() == OP_BUY) && MathAbs(OrderOpenPrice() - buyPrice) < point * 10)
{
exists = true;
break;
}
}
}
}

if(!exists)
{
double sl = buyPrice - (distance * 1.5);
double tp = buyPrice + (distance * 3.0);
int ticket = OrderSend(Symbol(), OP_BUYSTOP, LotSize, buyPrice, 3, sl, tp, "Grid Buy", MagicNumber, 0, clrNONE);
if(ticket < 0)
Print("买入止损单失败,价格 ", buyPrice, " 错误码:", GetLastError());
}
}

// 挂新的卖出止损单(当前价格下方)
for(int level = 1; level <= MaxGridLevels; level++)
{
double sellPrice = currentPrice - (level * distance);
bool exists = false;

for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if((OrderType() == OP_SELLSTOP || OrderType() == OP_SELL) && MathAbs(OrderOpenPrice() - sellPrice) < point * 10)
{
exists = true;
break;
}
}
}
}

if(!exists)
{
double sl = sellPrice + (distance * 1.5);
double tp = sellPrice - (distance * 3.0);
int ticket = OrderSend(Symbol(), OP_SELLSTOP, LotSize, sellPrice, 3, sl, tp, "Grid Sell", MagicNumber, 0, clrNONE);
if(ticket < 0)
Print("卖出止损单失败,价格 ", sellPrice, " 错误码:", GetLastError());
}
}
}

//+------------------------------------------------------------------+
//| 计算所有持仓的总盈亏 |
//+------------------------------------------------------------------+
double GetTotalProfit()
{
double profit = 0;
for(int i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
profit += OrderProfit() + OrderSwap() + OrderCommission();
}
}
}
return profit;
}

//+------------------------------------------------------------------+
//| 平仓/删除所有属于该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, 3, clrNONE);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrNONE);
else if(OrderType() > 1)
OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
```
参考来源: 原创MQL4代码,仅供学习参考。
免责声明: 网格交易可能产生频繁的小额盈利,但在强趋势行情中可能导致显著回撤。本EA按“原样”提供,不保证盈利。实盘交易前请在模拟账户充分测试。历史表现不代表未来结果。
```