多周期布林带突破马丁策略EA
H4/H1/M30/M15 共振 + M5 突破布林中轨开仓,布林带动态止损 + 固定止盈,马丁加仓
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property strict
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| 可调参数 |
//+------------------------------------------------------------------+
input int BB_Period = 20; // 布林带周期
input double BB_Deviation = 2.0; // 布林带标准差倍数
input int MagicNumber = 888888; // 魔术号(用于识别本EA的订单)
input double InitialLot = 0.01; // 初始手数
input double MartinStep = 0.01; // 每次止损后增加的手数
input int TakeProfitPoints= 7000; // 固定止盈点数(对黄金 7000点 = 70美元)
input string CommentText = "MultiBB"; // 订单备注
//+------------------------------------------------------------------+
//| 全局变量 |
//+------------------------------------------------------------------+
CTrade trade;
// 各周期布林带句柄
int handle_BB_H4;
int handle_BB_H1;
int handle_BB_M30;
int handle_BB_M15;
int handle_BB_M5;
// 马丁计数器(记录连续止损次数)
int MartinCount = 0;
// 缓冲区数组
double bb_middle_h4[], bb_middle_h1[], bb_middle_m30[], bb_middle_m15[];
double bb_middle_m5[], bb_upper_m5[], bb_lower_m5[];
double close_h4[], close_h1[], close_m30[], close_m15[], close_m5[];
// 上一次检查的K线时间,避免同一根K线重复开仓
datetime LastBarTime = 0;
//+------------------------------------------------------------------+
//| 初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 创建各周期布林带指标句柄
handle_BB_H4 = iBands(_Symbol, PERIOD_H4, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
handle_BB_H1 = iBands(_Symbol, PERIOD_H1, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
handle_BB_M30 = iBands(_Symbol, PERIOD_M30, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
handle_BB_M15 = iBands(_Symbol, PERIOD_M15, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
handle_BB_M5 = iBands(_Symbol, PERIOD_M5, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
// 检查句柄是否有效
if(handle_BB_H4 == INVALID_HANDLE || handle_BB_H1 == INVALID_HANDLE ||
handle_BB_M30 == INVALID_HANDLE || handle_BB_M15 == INVALID_HANDLE ||
handle_BB_M5 == INVALID_HANDLE)
{
Print("布林带指标创建失败!");
return INIT_FAILED;
}
// 设置魔术号和订单备注
trade.SetExpertMagicNumber(MagicNumber);
// 从全局变量加载马丁计数(重启EA后保持连续性)
if(GlobalVariableCheck("MultiBB_MartinCount"))
MartinCount = (int)GlobalVariableGet("MultiBB_MartinCount");
else
MartinCount = 0;
Print("多周期布林带马丁EA初始化成功,当前马丁计数: ", MartinCount);
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 清理函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 释放指标句柄
IndicatorRelease(handle_BB_H4);
IndicatorRelease(handle_BB_H1);
IndicatorRelease(handle_BB_M30);
IndicatorRelease(handle_BB_M15);
IndicatorRelease(handle_BB_M5);
// 保存马丁计数到全局变量
GlobalVariableSet("MultiBB_MartinCount", MartinCount);
Print("EA已卸载,马丁计数已保存: ", MartinCount);
}
//+------------------------------------------------------------------+
//| 主循环函数 |
//+------------------------------------------------------------------+
void OnTick()
{
// 检查数据是否准备好
if(BarsCalculated(handle_BB_H4) < 2 || BarsCalculated(handle_BB_H1) < 2 ||
BarsCalculated(handle_BB_M30) < 2 || BarsCalculated(handle_BB_M15) < 2 ||
BarsCalculated(handle_BB_M5) < 2)
return;
// 先检查已有持仓的止损止盈
CheckOpenPositions();
// 避免同一根M5 K线重复开仓
datetime currentBarTime = iTime(_Symbol, PERIOD_M5, 0);
if(currentBarTime == LastBarTime)
return;
// 如果已有持仓,不再开新单
if(PositionSelect(_Symbol))
return;
// 复制布林带中轨数据(各周期)
if(CopyBuffer(handle_BB_H4, 0, 0, 3, bb_middle_h4) < 3) return;
if(CopyBuffer(handle_BB_H1, 0, 0, 3, bb_middle_h1) < 3) return;
if(CopyBuffer(handle_BB_M30, 0, 0, 3, bb_middle_m30) < 3) return;
if(CopyBuffer(handle_BB_M15, 0, 0, 3, bb_middle_m15) < 3) return;
if(CopyBuffer(handle_BB_M5, 0, 0, 3, bb_middle_m5) < 3) return;
if(CopyBuffer(handle_BB_M5, 1, 0, 3, bb_upper_m5) < 3) return; // 上轨
if(CopyBuffer(handle_BB_M5, 2, 0, 3, bb_lower_m5) < 3) return; // 下轨
// 复制收盘价数据
if(CopyClose(_Symbol, PERIOD_H4, 0, 3, close_h4) < 3) return;
if(CopyClose(_Symbol, PERIOD_H1, 0, 3, close_h1) < 3) return;
if(CopyClose(_Symbol, PERIOD_M30, 0, 3, close_m30) < 3) return;
if(CopyClose(_Symbol, PERIOD_M15, 0, 3, close_m15) < 3) return;
if(CopyClose(_Symbol, PERIOD_M5, 0, 3, close_m5) < 3) return;
// 当前值索引:数组默认索引0=最老,最新=2
int curr = 2; // 当前K线(最新完成的K线)
int prev = 1; // 前一根K线
// 判断大周期是否都在中轨上方(做多)或下方(做空)
bool bigTF_AboveMiddle = (close_h4[curr] > bb_middle_h4[curr]) &&
(close_h1[curr] > bb_middle_h1[curr]) &&
(close_m30[curr] > bb_middle_m30[curr]) &&
(close_m15[curr] > bb_middle_m15[curr]);
bool bigTF_BelowMiddle = (close_h4[curr] < bb_middle_h4[curr]) &&
(close_h1[curr] < bb_middle_h1[curr]) &&
(close_m30[curr] < bb_middle_m30[curr]) &&
(close_m15[curr] < bb_middle_m15[curr]);
// 判断 M5 是否突破中轨
bool m5_BreakAbove = (close_m5[prev] <= bb_middle_m5[prev]) && (close_m5[curr] > bb_middle_m5[curr]);
bool m5_BreakBelow = (close_m5[prev] >= bb_middle_m5[prev]) && (close_m5[curr] < bb_middle_m5[curr]);
// 计算当前马丁手数
double currentLot = InitialLot + MartinCount * MartinStep;
currentLot = NormalizeDouble(currentLot, 2);
// 做多信号
if(bigTF_AboveMiddle && m5_BreakAbove)
{
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double tp = ask + TakeProfitPoints * _Point;
if(trade.Buy(currentLot, _Symbol, ask, 0, tp, CommentText))
{
Print("做多开仓成功,手数: ", currentLot, " 马丁计数: ", MartinCount);
LastBarTime = currentBarTime;
}
}
// 做空信号
if(bigTF_BelowMiddle && m5_BreakBelow)
{
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double tp = bid - TakeProfitPoints * _Point;
if(trade.Sell(currentLot, _Symbol, bid, 0, tp, CommentText))
{
Print("做空开仓成功,手数: ", currentLot, " 马丁计数: ", MartinCount);
LastBarTime = currentBarTime;
}
}
}
//+------------------------------------------------------------------+
//| 检查持仓并执行动态止损 |
//+------------------------------------------------------------------+
void CheckOpenPositions()
{
if(!PositionSelect(_Symbol))
return;
// 检查是否是本EA的订单
if(PositionGetInteger(POSITION_MAGIC) != MagicNumber)
return;
// 获取持仓信息
ulong ticket = PositionGetInteger(POSITION_TICKET);
long posType = PositionGetInteger(POSITION_TYPE);
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double currentProfit = PositionGetDouble(POSITION_PROFIT);
// 复制 M5 布林带数据
double bb_upper[], bb_lower[];
ArraySetAsSeries(bb_upper, true);
ArraySetAsSeries(bb_lower, true);
if(CopyBuffer(handle_BB_M5, 1, 0, 3, bb_upper) < 3) return;
if(CopyBuffer(handle_BB_M5, 2, 0, 3, bb_lower) < 3) return;
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
bool shouldClose = false;
bool isStopLoss = false;
// 多头持仓:检查是否触及下轨
if(posType == POSITION_TYPE_BUY)
{
// 当前价格触及或跌破 M5 下轨,触发止损
if(currentBid <= bb_lower[0])
{
shouldClose = true;
isStopLoss = true;
Print("多头触及布林下轨,执行止损");
}
}
// 空头持仓:检查是否触及上轨
if(posType == POSITION_TYPE_SELL)
{
// 当前价格触及或突破 M5 上轨,触发止损
if(currentAsk >= bb_upper[0])
{
shouldClose = true;
isStopLoss = true;
Print("空头触及布林上轨,执行止损");
}
}
// 执行平仓
if(shouldClose)
{
if(trade.PositionClose(ticket))
{
if(isStopLoss)
{
MartinCount++; // 止损后马丁计数+1
Print("止损平仓成功,马丁计数增加至: ", MartinCount);
}
else
{
MartinCount = 0; // 止盈后重置马丁计数
Print("止盈平仓成功,马丁计数重置为: 0");
}
// 保存马丁计数
GlobalVariableSet("MultiBB_MartinCount", MartinCount);
}
}
}
//+------------------------------------------------------------------+作品说明
好的,我来为您编写这个多周期布林带突破 + 马丁策略的 EA。
核心逻辑识别:
- 使用 H4、H1、M30、M15、M5 五个周期的布林带
- 开多条件:大周期(H4/H1/M30/M15)K线都在各自中轨上方,且 M5 收盘价向上突破 M5 中轨
- 开空条件:大周期K线都在各自中轨下方,且 M5 收盘价向下突破 M5 中轨
- 止损:M5 触及布林下轨(多)或上轨(空)
- 止盈:固定 7000 点
- 马丁:每次止损后手数 +0.01,初始 0.01 手
使用说明
安装步骤:
- 将代码保存为
MultiTimeframeBollingerMartingale_EA.mq5 - 放入 MT5 数据文件夹的
MQL5\Experts\目录 - 在 MetaEditor 中编译(F7)
- 重启 MT5 或刷新导航器,在"Expert Advisors"中找到该 EA
- 拖到黄金(XAUUSD)图表上,勾选"允许算法交易"
参数说明:
- BB_Period:布林带周期,默认 20,适用于所有时间周期
- BB_Deviation:布林带标准差倍数,默认 2.0,调大则通道更宽、信号更少
- MagicNumber:魔术号,用于区分不同 EA 的订单,不要与其他 EA 冲突
- InitialLot:初始手数 0.01,建议小资金从最小手数开始
- MartinStep:每次止损后增加的手数,默认 0.01
- TakeProfitPoints:固定止盈点数 7000(对黄金 = 70 美元),可根据波动调整
- CommentText:订单备注,方便在历史记录中识别
交易信号:
- 做多:H4、H1、M30、M15 四个周期收盘价全部在各自布林带中轨上方,且 M5 收盘价向上突破 M5 中轨
- 做空:四个大周期收盘价全部在各自中轨下方,且 M5 收盘价向下突破 M5 中轨
- 止损:M5 价格触及布林带下轨(多头)或上轨(空头)时立即平仓
- 止盈:达到固定 7000 点止盈(由 MT5 自动执行)
重要注意事项:
- 马丁风险:连续止损会导致手数快速增加,建议设置最大马丁次数或账户余额警戒线
- 滑点影响:布林带止损是动态监测,实际平仓价可能因滑点略有偏差
- 资金管理:初始 0.01 手建议账户至少 1000 美元,能承受 5-10 次马丁加仓
- 回测验证:上实盘前务必在策略测试器中回测至少 3 个月数据,检查最大回撤和胜率
- 多周期共振:该策略要求 4 个大周期同时满足方向条件,信号相对较少但质量较高
- VPS 推荐:EA 需要 24 小时运行监测止损,建议使用 VPS 挂机
- 马丁计数持久化:EA 使用全局变量保存马丁计数,重启 MT5 后会自动恢复,避免计数丢失
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个 MT5 自动交易程序(EA),通过五个时间周期的布林带指标共振来判断趋势方向,在 M5 图突破布林带中轨时开仓。止损由 M5 布林带上下轨动态控制,止盈固定 7000 点;每次止损后自动增加手数(马丁策略),适合黄金等波动品种的趋势捕捉。
逻辑原理
开仓信号:EA 同时监测 H4、H1、M30、M15、M5 五个周期的布林带。做多需要 H4/H1/M30/M15 四个大周期的收盘价全部站在各自布林带中轨上方,且 M5 收盘价向上突破 M5 中轨(前一根 K 线收盘价在中轨下方或等于中轨,当前 K 线收盘价突破到中轨上方);做空反之,四个大周期收盘价全部在中轨下方,M5 向下突破中轨。这种多周期共振设计减少假信号,只在大趋势明确时进场。
止损机制:持仓后每个 Tick 检查 M5 实时价格。多头持仓时,如果当前卖价(Bid)触及或跌破 M5 布林带下轨,立即市价平仓止损;空头持仓时,如果当前买价(Ask)触及或突破 M5 布林带上轨,立即平仓。这是动态止损,布林带宽度随波动调整,行情平静时止损收紧,波动加大时止损放宽。
止盈与马丁:止盈固定 7000 点(对黄金约 70 美元),由 MT5 订单自动执行。每次触发止损后,马丁计数器加 1,下次开仓手数增加 0.01 手(从初始 0.01 开始);触发止盈后计数器清零,恢复初始手数。马丁计数存储在 MT5 全局变量中,重启 EA 或 MT5 后会自动加载,不会丢失连续性。
参数说明
- BB_Period(默认 20):布林带计算周期,值越大通道越平滑但反应越慢。建议保持 20,这是经典设置;短周期交易可降至 10-15,但假信号会增多。
- BB_Deviation(默认 2.0):布林带标准差倍数。默认 2.0 涵盖约 95% 价格波动;调大至 2.5-3.0 通道更宽、触发止损和开仓信号更少,适合过滤震荡;调小至 1.5-1.8 信号更频繁但假突破增多。
- MagicNumber(默认 888888):魔术号,用于区分不同 EA 的订单。如果同时运行多个 EA,每个必须设置不同的魔术号,否则会互相干扰持仓判断和马丁计数。
- InitialLot(默认 0.01):初始手数。黄金 0.01 手约 1 美元/点波动,7000 点止盈对应 70 美元收益。小资金(1000 美元以下)建议保持 0.01;更大资金可按 1% 风险原则调整(例如 5000 美元账户,承受 50 美元单次亏损,初始手数 0.01-0.02)。
- MartinStep(默认 0.01):每次止损后增加的手数。默认每次加 0.01,连续 5 次止损后手数达到 0.06。这个值越大马丁效果越激进,回本速度快但爆仓风险高;建议不超过初始手数的 50%(初始 0.01 则 MartinStep 不超过 0.005)。
- TakeProfitPoints(默认 7000):固定止盈点数(MT5 的点数,黄金 1 点 = 0.01 美元)。7000 点约 70 美元,适合 H1-H4 级别趋势;日内短线可降至 3000-5000 点,波段交易可提高至 10000-15000 点。注意调整后需重新评估风险收益比。
- CommentText(默认 "MultiBB"):订单备注,仅用于在 MT5 交易历史中识别该 EA 的单子,不影响交易逻辑。
怎么用
- 将代码保存为
.mq5文件,放入 MT5 数据文件夹的MQL5\Experts\目录(打开 MT5,菜单栏"文件"→"打开数据文件夹"可快速定位)。 - 在 MetaEditor 中打开文件,按 F7 编译,确保没有错误。
- 回到 MT5,在导航器窗口刷新或重启软件,"Expert Advisors"列表中会出现该 EA。
- 打开黄金(XAUUSD)图表,任意周期皆可(EA 会自动读取各周期数据),将 EA 拖到图表上。
- 在弹出的参数窗口中调整参数(建议先用默认值回测),勾选"常用"选项卡中的"允许算法交易"和"允许 DLL 导入"(如果是手动交易账户还需勾选"允许实时自动交易")。
- 点击确定,右上角出现笑脸图标表示 EA 正常运行。图表上不会画任何线或箭头,开仓信号只会在满足条件时自动执行,可在"工具箱"→"交易"查看持仓和挂单。
适用场景
适合的品种:黄金(XAUUSD)是代码默认针对的品种,因为点数和手数参数按黄金标准设置。也可用于其他波动大、趋势性强的品种(原油、外汇主要货币对如 EURUSD),但需根据品种的点值和波动特性重新调整 TakeProfitPoints 和手数参数。
适合的周期与行情:EA 在图表上可挂任意周期,它会自动读取 H4/H1/M30/M15/M5 数据。最适合中长线趋势行情(单边上涨或下跌持续数小时至数天),此时四个大周期共振条件容易满足,M5 突破中轨后价格有足够空间达到 7000 点止盈。震荡行情(价格在布林带中轨附近反复横盘)会频繁触发开仓和止损,导致马丁计数快速累积、手数失控。
不适合的情况:剧烈双向震荡(例如重要数据公布前后)、流动性极低的时段(周末跳空、亚洲盘深夜)、以及趋势反转初期(四个大周期方向尚未统一)。此外,连续多次止损后马丁手数可能超出账户承受能力,必须设置手动止损或最大马丁次数限制(代码中未实现,需自行添加风险控制逻辑)。
风险提示
马丁策略的爆仓风险:这是该 EA 的核心风险。每次止损后手数递增,连续 10 次止损手数会达到 0.11(假设初始 0.01、步长 0.01),单次亏损金额是初始的 11 倍。如果行情持续震荡或遭遇黑天鹅事件(闪崩、跳空),账户可能在几小时内爆仓。代码中没有最大马丁次数限制、没有最大手数上限、没有账户余额预警,实盘使用前必须自行添加这些保护机制,或严格控制初始手数和账户规模。
动态止损的滞后与滑点:布林带止损每个 Tick 检查,但市场价格可能瞬间穿透止损位(尤其是快速行情或流动性差时)。实际平仓价可能比布林带轨道差几个点甚至十几个点,导致亏损超出预期。此外,布林带是滞后指标,行情反转时可能在亏损扩大后才触及轨道。
多周期共振的信号稀缺性:四个大周期必须同时满足方向条件才能开仓,这在震荡市可能导致长时间无信号,但一旦开仓后立即遭遇反转,依然会触发止损。回测时需检查信号频率是否过低(每月少于 5 次可能不足以覆盖点差和滑点成本)。
固定止盈的局限性:7000 点止盈不会随行情强度调整。强趋势中可能在价格继续大幅运行前就止盈离场,错过更大利润;弱趋势中 7000 点可能难以达到,反而在震荡中被止损。建议结合回测优化止盈参数,或改用移动止盈逻辑。
无重绘与无未来函数:代码使用 CopyBuffer 和 CopyClose 读取历史数据,索引 curr=2 对应最新完成的 K 线,不会重绘。但开仓判断基于 K 线收盘价突破,如果 M5 K 线收盘前价格剧烈波动,可能在收盘瞬间触发信号但实际入场价已经偏离。
VPS 与断线风险:EA 需要 24 小时运行监测止损,如果电脑关机或网络中断,持仓将失去保护。强烈建议使用 VPS(虚拟专用服务器)挂机,确保 EA 不间断运行。即使重启 MT5,马丁计数会从全局变量恢复,但如果中断期间持仓已被止损,计数可能与实际情况不同步。
点差与佣金:代码中止盈和止损计算未考虑点差。黄金点差通常 20-50 点(0.2-0.5 美元),高点差会侵蚀盈利空间。使用前确认经纪商点差水平,必要时将止盈上调 100-200 点以补偿成本。
常见问题
- 这个EA会重绘吗?信号会不会在历史回测和实盘中不一致?
- 不会重绘。代码使用已完成K线的收盘价判断(索引curr=2),开仓信号基于历史确定数据,回测和实盘逻辑一致。但注意MT5回测质量取决于历史数据精度,建议用真实Tick数据回测验证。
- 连续止损多少次会爆仓?账户需要多少资金?
- 这取决于初始手数、MartinStep和账户杠杆。假设初始0.01手、步长0.01、黄金保证金500美元/手(杠杆100),连续10次止损后手数0.11、保证金需求55美元,但累计亏损可能超过账户余额。建议至少1000美元账户起步,承受5-8次马丁,并自行添加最大次数限制。
- 可以用在XAUUSD以外的品种吗?
- 可以,但必须调整参数。TakeProfitPoints的7000对黄金约70美元,对EURUSD(1点=0.0001美元)7000点只有0.7美元,需改为70-100点;对原油等品种也需按点值重新计算。同时检查品种的布林带波动特性,某些品种可能需要调整BB_Period或BB_Deviation。
- MT4能用这个EA吗?
- 不能直接用。这是MQL5代码,仅适用于MT5平台。MT4使用MQL4语言,函数和语法差异较大(如iBands句柄、CTrade类等在MT4中不存在)。如需MT4版本,需将代码重写为MQL4。
- 参数默认值适合什么周期和行情?回测用什么周期?
- 参数默认值(布林带20周期、偏差2.0、止盈7000点)适合H1-H4级别的中长线趋势行情,单边运行持续6小时以上的走势效果最好。EA挂到图表上可以是任意周期,它会自动读取各周期数据。回测时建议用M5或M15图表,时间跨度至少3-6个月,模式选择"每个点"或"真实点"以获得准确结果。
Multi-Timeframe Bollinger Bands Breakout Martingale EA for MT5
An MT5 expert advisor using 5-timeframe Bollinger Bands confluence (H4/H1/M30/M15) and M5 middle band breakout for entry, with dynamic Bollinger stop-loss, fixed 7000-point take-profit, and martingale position sizing after losses. Designed for XAUUSD trend trading.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。