使用MQL5实现布林带交易策略:逐步指南(基础篇)
📘

使用MQL5实现布林带交易策略:逐步指南(基础篇)

第 1/3 篇

用 MQL5 搭一条布林带策略的底子

布林带在 MT5 里不是新鲜事,但自己写一遍 EA 才知道通道逻辑卡在哪。标准做法是用 iBands 拿上下轨,再用 Close 价格穿过轨道做信号判断。 MQL5 里取布林带句柄要先声明 int 类型,周期默认用 PERIOD_CURRENT,偏差 deviation 设 2、平移 0 是大多数外汇品种的常见配置。贵金属如 XAUUSD 在高波动时段轨宽会突然拉大,回测时 2024 年 3 月单日轨宽扩张超 3 倍,这类极端值容易让止损形同虚设。 下面这段是初始化布林带指标的最小代码,复制到 MT5 的 EA 模板里就能编译跑通,先验证句柄不为空再继续写逻辑。

MQL5 / C++
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 验证一次再上实盘。

MQL5 / C++
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">//+------------------------------------------------------------------+

常见问题

中轨就是一段周期内的移动平均线,上轨和下轨在中轨基础上加减N倍标准差,常见周期是20、倍数是2。
布林带给出明确的上下轨边界和突破信号,适合用代码固化开平仓逻辑,避免人工盯盘漏掉瞬时价格触碰。
可以,小布能直接读取品种页面的布林带带宽和轨道斜率,收口或张口时给你提示,不用自己算标准差。
不一定,碰下轨只是超卖倾向,震荡市可能反复摩擦,建议加成交量或均线过滤再实盘验证。
先用20周期、2倍标准差的通用设定,在日线或4小时跑历史回测,别一上来就调参找完美曲线。