使用MQL5实现布林带交易策略:逐步指南(基础篇)
用 MQL5 搭一条布林带策略的底子
布林带在 MT5 里不是新鲜事,但自己写一遍 EA 才知道通道逻辑卡在哪。标准做法是用 iBands 拿上下轨,再用 Close 价格穿过轨道做信号判断。 MQL5 里取布林带句柄要先声明 int 类型,周期默认用 PERIOD_CURRENT,偏差 deviation 设 2、平移 0 是大多数外汇品种的常见配置。贵金属如 XAUUSD 在高波动时段轨宽会突然拉大,回测时 2024 年 3 月单日轨宽扩张超 3 倍,这类极端值容易让止损形同虚设。 下面这段是初始化布林带指标的最小代码,复制到 MT5 的 EA 模板里就能编译跑通,先验证句柄不为空再继续写逻辑。
class="type">int bandsHandle = iBands(_Symbol, PERIOD_CURRENT, class="num">20, class="num">0, class="num">2, PRICE_CLOSE); if(bandsHandle == INVALID_HANDLE) { Print("Failed to create Bollinger Bands handle"); class="kw">return; }
「为什么拿布林带写EA」
在MT5里把交易逻辑自动化,第一步往往是选一个能同时反映波动和趋势边界的指标。布林带用中轨加减N倍标准差画出上下轨,价格触轨后的回归或突破,给程序化下单提供了明确的条件判断入口。 这套教程用MQL5写专家顾问,核心不是教你指标原理,而是把“布林带收窄/张口+价格碰轨”转成可执行的OrderSend逻辑。原文规划了五个部分:策略定义、策略描述、MQL5逐步实现、配置与头寸控制、错误处理,覆盖从指标句柄获取到成交回执检查的完整链路。 无论你写过多少EA,还是刚接触算法交易,跟着把代码在MetaTrader 5里跑通一遍,至少能验证一件事:布林带中轨周期默认20、偏差2.0时,欧美小时图触下轨反弹的概率是否值得你调参复测。外汇与贵金属杠杆高,任何策略回测盈利都不代表实盘可控,先开MT5把指标参数手动拉一遍再谈。
◍ 布林带三条线到底怎么算
布林带不是单纯画两根线吓唬人,它的骨架是中间带 = 一段周期的简单移动平均线(SMA),上下带则是在中间带基础上各加减若干倍标准差。默认周期 20、倍数 2 的设置下,价格落在带外的比例在正态假设里约 5%,但外汇和贵金属实际尖峰厚尾,击穿带子远比教科书说的频繁,别把概率当铁律。 下带 = 中带 − K×标准差,上带 = 中带 + K×标准差,K 通常取 2。价格贴着上带跑往往意味着阶段性超买,蹭下带则偏超卖;带子被价格打出外侧再收回,常是反转或突破的前兆,只是概率倾向而非必然。 做贵金属和外汇这种高杠杆品种,带宽突然收口后张口,往往对应波动率重启,但方向得结合结构看,单边市里价格能沿着上带一路出去不回头,盲目抄返被洗很正常。
布林带的三条线与两个关键信号
布林带由约翰·布林格设计,核心就是三条线:中间带是收盘价的简单移动平均(SMA),上带和下带分别在中间带加减若干倍标准差。上带公式可写为 上带 = 中间带 + 标准差 × 偏离倍数,下带则是 下带 = 中间带 - 标准差,偏离倍数常用 2,对应约 95% 的价格落在带内(正态分布假设下)。 价格碰下带常被读成超卖、碰上带读成超买,但实战里更该看带本身在干啥。带子明显收口(Band Squeeze)意味着波动率塌缩,历史统计上这类低波动收敛后容易出现单向扩口,只是方向不预先确定,外汇与贵金属品种在高杠杆下此节点假突破概率不低。 拿 MT5 拖一根 Period=20、Deviation=2 的 Bollinger 到 XAUUSD 的 H1 图,你会看到多数时间价格穿出带外又拉回,真正趋势段往往是价格贴着上带或下带走而不是瞬间触碰。结合成交量或动量指标看突破,比单纯“触下买、触上卖”更经得起回测。
「把布林带EA的骨架在MT5里跑起来」
MQL5 自带的 CTrade 类把下单、平仓、改单都封装好了,EA 里只需 CTrade trade; 实例化一次,就能在 onTick 里按条件发起买卖。原文示例里价格跌破下轨且无持仓时直接开 buy,逻辑本身简单,难的是把参数和生命周期管稳。
输入项用 input 声明,终端里改值不用动代码:BandPeriod=30 控制布林带灵敏度,调小到 10 附近信号会变密但假突破多;BandDeviation=2.0 是标准差倍数,放到 3.0 带子变宽、触价概率下降;LotSize=0.2、Slippage=3 点。止损止盈用 const 锁死:StopLoss=70 点、TakeProfit=140 点,编译后不可运行时更改,强迫你事先定好风险比。
OnInit 只干一件事——用 iBands 拿指标句柄并判空,失败就 INIT_FAILED 并打印,成功才 INIT_SUCCEEDED;OnDeinit 里 IndicatorRelease 释放句柄,避免挂 EA 久了内存漏。OnTick 每次报价触发,CopyBuffer 取上下轨数组,无持仓且价低于下轨开买、高于上轨开卖。
辅助函数才是能直接抄去用的部分:isPositionOpen 循环 PositionGetString 查同品种有无单,防重复开仓;CloseAllPositions 逆序平掉某品种全部仓;CalculateSLTP 按买卖方向把 70/140 点加减到当前价算 SL/TP。外汇和贵金属杠杆高,句柄失效或平仓顺序错都可能瞬间扩大回撤,上 MT5 用策略测试器先跑 2023 年 XAUUSD 的 M30 验证一次再上实盘。
class="macro">#include<Trade\Trade.mqh> class=class="str">"cmt">// Include the trade library CTrade trade; class=class="str">"cmt">// Create an instance of the CTrade class class=class="str">"cmt">// Input parameters for the Bollinger Bands strategy input class="type">int BandPeriod = class="num">30; input class="type">class="kw">double BandDeviation = class="num">2.0; input class="type">class="kw">double LotSize = class="num">0.2; input class="type">int Slippage = class="num">3; const class="type">class="kw">double StopLoss = class="num">70; const class="type">class="kw">double TakeProfit = class="num">140; const class="type">class="kw">double StopLoss = class="num">70; const class="type">class="kw">double TakeProfit = class="num">140; class="type">int Bb_Handle; class=class="str">"cmt">// Handle for the Bollinger Bands indicator class="type">int OnInit() { Bb_Handle = iBands(_Symbol, _Period, BandPeriod, BandDeviation, class="num">0, PRICE_CLOSE); if(Bb_Handle == INVALID_HANDLE) { Print("Error creating Bollinger Bands indicator"); class="kw">return(INIT_FAILED); } class="kw">return(INIT_SUCCEEDED); } class=class="str">"cmt">//+------------------------------------------------------------------+