Summary: 比特币波动之盾EA是一款专为BTCUSD设计的低风险MQL4智能交易系统。使用ATR波动率带、ADX趋势强度过滤和动态追踪止损,适合H4周期应对比特币高波动。




比特币波动之盾EA专门为比特币(BTCUSD)设计,以应对其极端波动和难以预测的价格行为。该EA结合了基于ATR的波动率带和ADX趋势强度过滤,避免在震荡和低波动区域交易。独特的动态仓位管理在高波动时期自动减小手数。每笔交易受到追踪止损机制保护,随着价格有利移动而锁定利润。EA还包含每周回撤限制和亏损后的冷却计时器。

推荐加载周期: H4
策略核心逻辑:
1. 波动率状态:ATR(14)计算当前波动率;若ATR超过ATR最大阈值,跳过交易。
2. 趋势强度:ADX(14) > 25确保趋势市场存在,震荡市不开仓。
3. 入场信号:价格触及ATR波动带下轨(MA20 - ATR×倍数)时做多,或上轨时做空,且ADX确认方向。
4. 风险控制:动态追踪止损初始为5倍ATR,追踪步长2倍ATR。最多持有一单,每周亏损上限8%。

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

//--- 输入参数及注释
input double BaseLotSize = 0.01; // 基础手数(0.01 BTC)
input int ATRPeriod = 14; // ATR波动率指标周期
input double ATRMaxMultiplier = 2.5; // ATR最大倍数(超过avgATR倍数则跳过交易)
input double BandMultiplier = 1.8; // ATR波动带倍数(计算入场边界)
input int ADXPeriod = 14; // ADX趋势强度周期
input int ADXMinThreshold = 25; // 最小ADX阈值(低于此值不交易)
input int MAPeriod = 20; // 均线周期(波动带中心)
input int TrailingStart = 5; // 追踪止损启动倍数(ATR倍数)
input int TrailingStep = 2; // 追踪步长倍数(ATR倍数)
input int MagicNumber = 202413; // EA魔术号(区分不同EA)
input int MaxSpread = 150; // 最大允许点差(比特币点差较宽)
input double WeeklyLossLimit = 8.0; // 每周亏损限额(账户余额百分比)
input int CooldownMinutes = 60; // 亏损后冷却时间(分钟)
input bool UseCloseOnSunday = true; // 周日22点前平仓(规避周末风险)

//--- 全局变量
double weeklyStartBalance = 0;
datetime lastBarTime = 0;
bool isSundayCloseExecuted = false;
datetime lastLossTime = 0;
double avgATR = 0;
double currentTrailingSL = 0;

//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
weeklyStartBalance = AccountBalance();
lastBarTime = 0;
isSundayCloseExecuted = false;
lastLossTime = 0;
avgATR = iATR(Symbol(), PERIOD_H4, ATRPeriod, 1);
if(avgATR <= 0) avgATR = 500;
return(INIT_SUCCEEDED);
}

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

//+------------------------------------------------------------------+
//| EA主循环函数(每Tick执行) |
//+------------------------------------------------------------------+
void OnTick()
{
// 每周净值保护:亏损超限则停止交易
double currentEquity = AccountEquity();
double lossPercent = (weeklyStartBalance - currentEquity) / weeklyStartBalance * 100;
if(lossPercent >= WeeklyLossLimit)
{
Comment("已达每周亏损上限,停止开新仓");
return;
}

// 周日收盘前平仓(规避周末跳空风险)
if(UseCloseOnSunday && !isSundayCloseExecuted)
{
datetime currentTime = TimeCurrent();
if(TimeDayOfWeek(currentTime) == 0 && TimeHour(currentTime) >= 22)
{
CloseAllOrders();
isSundayCloseExecuted = true;
return;
}
if(TimeDayOfWeek(currentTime) != 0)
isSundayCloseExecuted = false;
}

// 亏损后冷却期
if(lastLossTime > 0 && TimeCurrent() - lastLossTime < CooldownMinutes * 60)
{
Comment("亏损后冷却期未结束");
return;
}

// 点差过滤(比特币点差较大)
if(MarketInfo(Symbol(), MODE_SPREAD) > MaxSpread)
{
Comment("比特币当前点差过大,暂停交易");
return;
}

// 仅在新K线开始时检测入场(H4周期)
if(Time[0] == lastBarTime)
return;
lastBarTime = Time[0];

// 检查是否已有持仓
if(CountPositions() > 0)
{
// 管理已有持仓的追踪止损
ManageTrailingStop();
return;
}

// 获取ATR并更新平均值
double atr = iATR(Symbol(), PERIOD_H4, ATRPeriod, 1);
double atrThreshold = avgATR * ATRMaxMultiplier;
if(atr > atrThreshold && atrThreshold > 0)
{
Comment("波动率过高,暂停交易。ATR: ", atr);
return;
}
avgATR = (avgATR * 0.95) + (atr * 0.05);

// ADX趋势强度过滤
double adx = iADX(Symbol(), PERIOD_H4, ADXPeriod, PRICE_CLOSE, MODE_MAIN, 1);
if(adx < ADXMinThreshold)
{
Comment("无明显趋势,ADX: ", adx);
return;
}

// 均线作为波动带中心
double ma = iMA(Symbol(), PERIOD_H4, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double close1 = iClose(Symbol(), PERIOD_H4, 1);

double lowerBand = ma - (atr * BandMultiplier);
double upperBand = ma + (atr * BandMultiplier);

int cmd = -1;
double sl = 0, tp = 0;
double dynamicLot = BaseLotSize;

// 高波动时减小手数
if(atr > avgATR)
dynamicLot = BaseLotSize * (avgATR / atr);
if(dynamicLot < 0.01) dynamicLot = 0.01;

// ADX方向指标
double diPlus = iADX(Symbol(), PERIOD_H4, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI, 1);
double diMinus = iADX(Symbol(), PERIOD_H4, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, 1);

// 买入信号:价格触及下轨,且ADX确认上升趋势(DI+ > DI-)
if(close1 <= lowerBand && diPlus > diMinus)
{
cmd = OP_BUY;
sl = SymbolInfoDouble(Symbol(), SYMBOL_BID) - (atr * TrailingStart);
tp = SymbolInfoDouble(Symbol(), SYMBOL_BID) + (atr * TrailingStart * 2);
}
// 卖出信号:价格触及上轨,且ADX确认下降趋势(DI- > DI+)
else if(close1 >= upperBand && diMinus > diPlus)
{
cmd = OP_SELL;
sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK) + (atr * TrailingStart);
tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK) - (atr * TrailingStart * 2);
}

if(cmd != -1)
{
int ticket = OrderSend(Symbol(), cmd, dynamicLot, (cmd==OP_BUY?Ask:Bid), 3, sl, tp, "BTC Volatility EA", MagicNumber, 0, clrNONE);
if(ticket < 0)
{
Print("开仓失败,错误码:", GetLastError());
}
}
}

//+------------------------------------------------------------------+
//| 管理持仓的追踪止损 |
//+------------------------------------------------------------------+
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_H4, ATRPeriod, 1);
if(atr <= 0) atr = avgATR;

double newSL = 0;
if(OrderType() == OP_BUY)
{
newSL = Bid - (atr * TrailingStep);
if(newSL > OrderStopLoss())
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrNONE))
Print("买入追踪止损更新 #", OrderTicket());
}
}
else if(OrderType() == OP_SELL)
{
newSL = Ask + (atr * TrailingStep);
if(newSL < OrderStopLoss() || OrderStopLoss() == 0)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrNONE))
Print("卖出追踪止损更新 #", OrderTicket());
}
}
break;
}
}
}
}

//+------------------------------------------------------------------+
//| 统计当前魔术号的持仓数量 |
//+------------------------------------------------------------------+
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, 3, clrNONE);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrNONE);
}
}
}
}

//+------------------------------------------------------------------+
//| 记录亏损时间(可从外部调用,本版本在平仓时需手动扩展) |
//+------------------------------------------------------------------+
void RecordLoss()
{
lastLossTime = TimeCurrent();
}
//+------------------------------------------------------------------+
```
参考来源: 原创MQL4代码,仅供学习参考。
免责声明: 比特币交易因极端波动具有极高风险。本EA按“原样”提供,不保证盈利。实盘交易前请在模拟账户充分测试。历史表现不代表未来结果。
```