布林带Squeeze策略回测验证 波动率收缩突破入场与参数设计(1004)
布林带Squeeze策略回测验证 波动率收缩突破入场与参数设计(1004)
做EA这几年,被问得最多的一类问题不是"哪个指标最准",而是"为什么我的突破策略一进场就遇到假突破"。这个问题背后通常藏着一个被忽略的前提:市场并不是任何时候都适合做突破。大部分时间它在收缩、在盘整、在消化,真正的方向性释放只占很小一部分时间窗口。布林带Squeeze策略解决的就是这个"择时"问题——先等波动率收缩到极致,再在释放方向下注。

这篇文章拆解的是我在MT5上跑了多年的一套Squeeze框架,参数可以直接复制去测。先把结论放在前面:它不是圣杯,但它把"什么时候不该交易"这件事量化了,这一点比入场信号本身更值钱。
波动率收缩的本质:带宽收窄意味着什么
布林带的中轨是均线,上下轨是中轨加减若干倍标准差。当标准差变小,带宽自然收窄。这个收窄动作不是随机的,它反映的是近期价格波动幅度在压缩——多空双方暂时达成了一种脆弱的平衡。
关键在于,这种平衡不会永久维持。能量在积累,方向在酝酿。历史上看,无论是外汇主要货币对还是指数品种,带宽收缩到一定分位之后,往往会在有限时间内出现一次幅度可观的单边释放。这不是玄学,是波动率均值回归特性的一个侧面。
我用一个量化定义来锚定"收缩":当前带宽(上轨减下轨)处于过去N根K线带宽的某个低分位。实测中N取100、分位取20%比较稳健。也就是说,只有当带宽低于近100根K线的20%水平时,才认为进入了Squeeze状态。
// MQL5 片段:带宽分位判断
double upper = iBands(_Symbol, PERIOD_H1, 20, 0, 2.0, PRICE_CLOSE, MODE_UPPER, shift);
double lower = iBands(_Symbol, PERIOD_H1, 20, 0, 2.0, PRICE_CLOSE, MODE_LOWER, shift);
double bandwidth = (upper - lower) / ((upper + lower) / 2.0);
// 收集近100根带宽,排序后取20%分位阈值
// 当前带宽 <= 阈值 且 带宽开始回升 => Squeeze释放候选
注意我用的是归一化带宽(除以中轨),这样跨品种、跨价格水平可比。直接比绝对点差在不同品种之间没有意义。
入场模块:等释放,不猜方向
收缩阶段绝不进场,这是纪律。很多人亏在"我觉得快突破了"就提前埋伏,结果被反复打脸。正确的做法是等价格自己给出方向。
我的入场条件有三个,必须同时满足:
- 带宽从低分位开始回升,且当前带宽高于前一根K线的带宽(确认释放启动)
- 收盘价突破上轨或下轨(方向确认)
- 突破的那根K线实体占比超过该K线总幅度的60%(过滤长影线假动作)
第三条是我后来加的。最初版本只看收盘价破轨,结果被大量"插针破轨又收回"的行情消耗。加上实体占比过滤后,入场次数下降约三成,但胜率明显改善。
参数上,布林带周期20、偏差2.0是经典配置,我试过14和30,14太敏感、30太迟钝,20在H1周期上平衡最好。释放确认的回看窗口用1根K线,不拖泥带水。
出场与止损:用ATR让止损跟着波动走
止损设置是这套策略里我改动最多的地方。早期我用固定点数止损,比如黄金固定300点。问题很明显:收缩期波动小,300点太宽;释放后波动放大,300点又太窄,经常被正常回撤扫掉。
后来换成ATR动态止损。入场时取当前H1的ATR(14),止损放在入场价加减1.5倍ATR的位置。这个改动让我的最大回撤从早期版本的22%降到了14%左右。数字不一定精确复现,但方向是确定的——止损要适应波动率,而不是用一个死数字对抗所有行情。
止盈用两层结构。第一层在1倍ATR处平掉一半仓位,锁定利润、降低心理压力。剩余仓位用布林带中轨作为移动止损:价格跌破中轨(多头情形)就全部离场。这样在趋势延续时能吃到大段,趋势夭折时也不会把浮盈全吐回去。
有个细节:中轨跟踪只在价格已经离开入场区超过1.5倍ATR之后才启用,否则刚进场就被中轨扫出来,毫无意义。
仓位管理与回测数据
仓位用固定风险比例法。每笔交易的风险敞口控制在账户净值的0.5%到1%之间,具体手数由"止损距离"反推:
// 手数 = (账户净值 * 风险比例) / (止损点数 * 每点价值)
double riskAmount = AccountInfoDouble(ACCOUNT_EQUITY) * 0.0075;
double stopPoints = atrValue * 1.5 / _Point;
double lots = riskAmount / (stopPoints * tickValue);
回测方案给出来,方便你复现:MT5策略测试器,EURUSD与XAUUSD,H1周期,2019年初到2024年中的历史数据,真实点差模式,每笔按经纪商平均点差加1个滑点。参数:布林带20/2.0,ATR14,止损1.5ATR,第一目标1ATR,中轨跟踪。
跑出来的统计大致是这样(不同经纪商数据会有出入,仅作参考量级):
- 交易次数:EURUSD约340笔,XAUUSD约410笔
- 胜率:约46%到49%
- 盈亏比:平均盈利/平均亏损约1.9
- 盈利因子:1.35到1.55之间
- 最大回撤:账户层面约13%到16%
胜率不到一半,这很正常。突破类策略靠的是盈亏比而非胜率。看到46%胜率就摇头的人,通常没算过期望值。0.47乘以1.9减去0.53,结果仍是正的。
它适合什么样的行情,以及什么时候会失效
这套策略的舒适区是"收缩—释放—趋势"节奏清晰的市场。趋势品种、有明确方向驱动的阶段,表现最好。
反过来,在那种反复收缩、反复假释放的震荡市里,它会被连续的小额止损磨损。2023年某段欧元区横盘期我印象很深,连续七笔止损,账户回撤触到12%。那段时间我手动把分位阈值从20%收紧到10%,减少了无效信号,但代价是错过了后面那波真突破的起点。这种取舍没有完美解,只能根据账户承受力选。
高波动事件窗口(比如某些央行决议前后)也要小心。释放方向可能瞬间反转,实体过滤在这种时候会失效,因为K线本身就被拉得很大。我的处理是:重大数据公布前后各30分钟暂停开新仓,已有仓位正常管理。
最后说一句实在话。Squeeze策略的价值不在于预测方向,它做不到。它的价值在于帮你识别"现在是不是值得下注的时刻",把有限的交易机会留给概率更高的窗口。参数可以调,逻辑要守住:收缩不进场,释放才动手,止损跟着波动走。你拿这套参数跑过回测吗?跑出来的盈亏比和最大回撤是多少,拿数据来对。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
