重塑经典策略(第二部分):布林带突破(基础篇)
📘

重塑经典策略(第二部分):布林带突破(基础篇)

第 1/3 篇

◍ 用布林带突破重构老策略

布林带突破是经典均值回归思路的反向玩法:价格突破上轨视为动能外溢,跌破下轨则视为空头加速。在 MT5 里这套逻辑可以直接用 iBands 抓取通道,再比对收盘价完成信号判定。 原文示例发布于 2025 年 2 月 18 日 13:43,截至统计时获得 1,496 次查看、2 条评论,说明基础突破框架在实盘社群里仍有高频验证需求。外汇与贵金属品种波动跳空频繁,布林带突破在重大数据发布前后可能频繁假突破,属高风险用法。 落地时先把周期设为 H1,带宽参数 20/2 是默认基准;若你做 XAUUSD,可把偏差调到 2.5 观察假信号是否减少。开 MT5 新建 EA,把下面代码粘进 OnTick 就能跑通基础判定。

MQL5 / C++
class="type">class="kw">double upper = iBands(_Symbol, PERIOD_H1, class="num">20, class="num">0, class="num">2, PRICE_CLOSE, MODE_UPPER, class="num">0);
class="type">class="kw">double lower = iBands(_Symbol, PERIOD_H1, class="num">20, class="num">0, class="num">2, PRICE_CLOSE, MODE_LOWER, class="num">0);
class="type">class="kw">double close = iClose(_Symbol, PERIOD_H1, class="num">0);
if(close > upper) { class=class="str">"cmt">/* 突破上轨,动能倾向延续 */ }
if(close < lower) { class=class="str">"cmt">/* 跌破下轨,空头倾向加速 */ }

布林带与AI实证的比对起点

布林带本质上是一条对收盘价做指数平滑的中线(EMA),再上下各推两个标准差画出通道。它既能跟趋势,也能提示反转概率,但通道宽度靠标准差驱动,参数未优化时形态会随波动剧烈变形。 我们训练了两个等价模型,都用线性判别分析(LDA)算法,仅依赖 scikit-learn,并通过时间序列交叉验证比对。一个只判涨跌,另一个学价格在布林带四个分区之间的迁移。 实证里有个反直觉点:直接预测价格方向,比预测四区切换更有效。这个结论仅基于未做参数优化的原始布林带,样本外表现仍受外汇/贵金属高杠杆高风险影响,不能当普适定律。 本文后续会拆两件事:MQL5 里从零写 LDA,以及把指标信号喂给 AI 做成较稳的组合策略。读者可先开 MT5 把布林带周期设默认 20、偏差 2,肉眼核对通道对 EURUSD 日线的包裹密度。

「用布林带四区给模型画围栏」

把“人工智能”当成会自己思考的东西,是交易者最容易踩的坑。它本质是一套优化算法,目标只是在约束内把误差压到最小或把回报推到最大;若不加围栏,一个以“零亏损”为目标的模型很可能直接输出“别下单”这种数学正确但毫无用的结论。 所以我们用布林带给模型定四条硬边界,任一时刻价格只落在其中一块:区域1为完全高于上轨,区域2在中轨与上轨之间,区域3在下轨与中轨之间,区域4为完全低于下轨。模型用原生 MQL5 实现,只干一件事——学这四个区域之间的切换,并预测下一站去哪。 信号逻辑很直白:区域发生转移即触发。比如模型判价格从区域2去区域1,解读为向上动能,EA 发买入;反向则做空。外汇与贵金属波动大、杠杆高,这类区域切换信号在极端行情中失效概率明显抬升,实盘前务必在 MT5 用历史数据跑区域转移频率。 布林带本身是 EMA 加正负两个标准差的通道,传统用法靠“触轨回归中值”吃饭。我们的统计却发现:预测价格突破布林带后延续趋势,比预测区域内折返更难,突破假信号占比偏高。这意味着模型若只赌突破,样本外表现可能塌方。

◍ 从 MT5 终端导出现货数据

打开 MT5 终端,在行情窗格右键调出符号列表,找到目标品种后切入“条形图”窗口。这里能直接挑时间框架——做日线建模就选 D1,做短线统计可选 M15 或 H1。 以 GBPUSD 为例,日线数据量足够覆盖数年波动,样本量一般在 1500~2500 根 BAR,足以跑正态与尾部检验。 点“导出条形图”生成 CSV,后续丢进 Python 做分布拟合。注意外汇保证金为高杠杆品种,导出后回测结论只代表历史概率,实盘仍可能失控。

用箱线图拆出英镑布林带与价格反转区

把 MT5 导出的制表符分隔 csv 读进 pandas 后,先按 30 周期、2 倍标准差算布林带,再用未来 20 根 K 线(look_ahead=20)的收盘价给数据打标签:涨标 1、跌标 0,同时按价格相对上中下轨的位置把「当前状态」切成 1~4 四档。 直接画箱线图看 Price State 分组,会发现一个硬现象:当 GBPUSD 日线跌到 1.1 附近时,0 组(前期跌)里的橙色箱线(后续反转涨)总是出现,价格倾向反弹;而 1 组(前期涨)里蓝色箱线(后续跌)的尾部明显比橙色长,汇率逼近 1.5 时更容易回头向下。外汇和贵金属杠杆高,这种历史边界只是概率倾向,不是必然。 换成布林带四状态做 x 轴,同样用收盘价做 y 轴,箱线尾巴存在不重叠的空白带——这些空白可能就是后续分类模型的潜在边界。比如状态 4(完全跌破下轨)且贴近 1.1,样本里价格几乎都弹回去了。 状态间跳转也能可视化:状态 1 出发的箱线只有三个,说明从最上轨区往后 20 根只可能留在 1、或掉进 2、3,不会直接跳到 4。这种转移结构比单点边界更适合做状态机式盯盘。

MQL5 / C++
class="macro">#Import libraries
class="kw">import pandas as pd
class="kw">import numpy as np
class="kw">import seaborn as sns
class="kw">import pandas_ta as ta
class="macro">#Read in the csv file
csv = pd.read_csv("/home/volatily/market_data/GBPUSD_Daily_20160103_20240131.csv",sep="\t")
class="macro">#define how far into the future we should forecast
look_ahead = class="num">20
class="macro">#Add the Bollinger bands
csv.ta.bbands(length=class="num">30,std=class="num">2,append=True)
class="macro">#Add a column to show the future price
csv["Future Close"] = csv["Close"].shift(-look_ahead)
class="macro">#Add the normal target, predicting changes in the close price
csv["Price Target"] = class="num">0
csv["Price State"] = class="num">0
class="macro">#Label the data our conditions
class="macro">#If price depreciated, our label is class="num">0
csv.loc[csv["Close"] < csv["Close"].shift(look_ahead),"Price State"] = class="num">0
csv.loc[csv["Close"] > csv["Future Close"], "Price Target"] = class="num">0
class="macro">#If price appreciated, our label is class="num">1
csv.loc[csv["Close"] > csv["Close"].shift(look_ahead),"Price State"] = class="num">1
csv.loc[csv["Close"] < csv["Future Close"], "Price Target"] = class="num">1
class="macro">#Label the Bollinger bands
class="macro">#The label to store the current state of the market
csv["Current State"] = -class="num">1
class="macro">#If price is above the upper-band, our label is class="num">1
csv.loc[csv["Close"] > csv["BBU_30_2.class="num">0"], "Current State"] = class="num">1
class="macro">#If price is below the upper-band and still above the mid-band,our label is class="num">2
csv.loc[(csv["Close"] < csv["BBU_30_2.class="num">0"]) & (csv["Close"] > csv["BBM_30_2.class="num">0"]),"Current State"] = class="num">2
class="macro">#If price is below the mid-band and still above the low-band,our label is class="num">3
csv.loc[(csv["Close"] < csv["BBM_30_2.class="num">0"]) & (csv["Close"] > csv["BBL_30_2.class="num">0"]),"Current State"] = class="num">3
class="macro">#Finally, if price is beneath the low-band our label is class="num">4
csv.loc[csv["Close"] < csv["BBL_30_2.class="num">0"], "Current State"] = class="num">4
class="macro">#Now we can add a column to denote the future state the market will be in
csv["State Target"] = csv["Current State"].shift(-look_ahead)
class="macro">#Let&class="macro">#x27;s drop any NaN values
csv.dropna(inplace=True)
class="macro">#Notice that the tails of the box plots have regions where they stop overlapping these zones may guide us as boundaries
sns.boxplot(data=csv,x="Price State",y="Close",hue="Price Target")
class="macro">#Notice that the tails of the box plots have regions where they stop overlapping these zones may guide us as boundaries
sns.boxplot(data=csv,x="Current State",y="Close",hue="Price Target")
class="macro">#Notice that the tails of the box plots have regions where they stop overlapping these zones may guide us as boundaries

「用箱线图看状态与收盘价的分布差」

在 Python 里把 MT5 导出的 csv 读入后,可以直接用 seaborn 的 boxplot 观察不同「Current State」下「Close」价格的分布形态。 以 hue="State Target" 分组,能直观比对当前状态与目标状态切换时收盘价的中位数与离群点范围,帮助判断状态划分是否真有区分度。 这类图不预测涨跌,只暴露数据分布;外汇与贵金属价格高波动,据此做参数或状态阈值调整时务必用小样本先验证。

MQL5 / C++
sns.boxplot(data=csv,x="Current State",y="Close",hue="State Target")

常见问题

可用布林带四区给价格画围栏,只在突破外轨且回到第三区时视为有效信号,能过滤掉一部分假突破。
在终端历史数据界面选对应品种与时间范围,导出为 csv,再用脚本算布林带和箱线图分布即可。
可以,小布能直接调取品种页的布林带四区与AI诊断,把模型围栏和反转区重叠显示,省去手动画图的麻烦。
能看出价格多数卡在哪一区、收盘偏离中轨多少,据此调布林带周期参数比肉眼看线更稳。
英镑小时图实测20周期外轨反转概率偏高,50周期信号少但噪音低,建议先导数据跑箱线图再定。