源码文件:vnpy_ctastrategy.strategies.boll_channel_strategy

1. 策略概述

BollChannelStrategy 是一个基于 布林带 (Bollinger Bands) 的通道突破策略。 它不仅仅依赖价格突破布林带上下轨,还引入了 CCI (Commodity Channel Index) 作为趋势过滤器,并使用 ATR (Average True Range) 来计算动态的移动止损位。

  • 基类CtaTemplate
  • 周期:15分钟 K 线 (通过 BarGenerator 合成)
  • 核心指标:Bollinger Bands, CCI, ATR
  • 风控机制:ATR 倍数移动止损

2. 核心参数与变量

参数名默认值含义
boll_window18布林带均线周期
boll_dev3.4布林带标准差倍数(较宽,意味着只抓大趋势)
cci_window10CCI 计算周期
atr_window30ATR 计算周期
sl_multiplier5.2止损距离的 ATR 倍数(非常宽的止损)

3. 策略逻辑详解

3.1 K 线合成

策略在 on_init 中初始化了一个 15 分钟的 K 线生成器:

1
self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)

这意味着 on_tick 更新 1 分钟 bar,1 分钟 bar 累积满 15 个后触发 on_15min_bar,核心逻辑都在 on_15min_bar 中执行。

3.2 指标计算

1
2
3
self.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)
self.cci_value = am.cci(self.cci_window)
self.atr_value = am.atr(self.atr_window)

3.3 入场逻辑:突破 + 过滤

策略使用 停止单 (Stop Order) 进行突破交易。

  • 做多:当 CCI > 0 (处于多头趋势) 时,在布林带上轨 (boll_up) 挂出买入停止单。
  • 做空:当 CCI < 0 (处于空头趋势) 时,在布林带下轨 (boll_down) 挂出卖出停止单。
1
2
3
4
if self.cci_value > 0:
    self.buy(self.boll_up, self.fixed_size, True) # True 表示这是一个 Stop Order
elif self.cci_value < 0:
    self.short(self.boll_down, self.fixed_size, True)

关键点:这里使用了 stop=True 参数。这意味着委托不会立即成交,而是挂在交易所(或策略引擎本地),只有当价格触及上轨/下轨时才会触发成交。这正是“突破”的定义。

3.4 出场与风控:ATR 吊灯止损 (Chandelier Stop)

策略使用 ATR 的倍数作为移动止损距离。

  • 多单止损最高价 - ATR * 5.2
  • 空单止损最低价 + ATR * 5.2
1
2
self.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplier
self.sell(self.long_stop, abs(self.pos), True)

4. 总结

BollChannelStrategy 是一个非常稳健的趋势策略设计范例:

  1. 大周期:使用 15 分钟而非 1 分钟,过滤了高频噪音。
  2. 宽通道:3.4 倍标准差的布林带,意味着只有极端的行情爆发才会被捕捉。
  3. 宽止损:5.2 倍 ATR 的止损幅度,给予行情充分的震荡空间,避免被轻易洗出。
  4. 顺势过滤:CCI 确保了只在趋势方向上进行突破尝试。
  5. 停止单: 触发后按市场价成交,确保突破时能迅速进场。可能导致较大滑点。