文章目录

  • Boll(布林线)指标
  • CCI(Commodity Channel Index)指标
  • 布林通道策略
  • 布林通道策略源码分析
    • 1、完整源码
    • 2、策略参数与变量
    • 3、策略执行逻辑

Boll(布林线)指标

布林线是一种金融衍生品价格走势图中常用的技术指标,由于其以上下两条线组成的带状区域显示,所以也称为布林带。带状区域的宽度随着价格的变动而变化,当价格幅度增大时,带状区域变宽;当价格幅度减小时,带状区域变窄。布林线在图形上表现为上中下三条线,其中,上下两条线可以分别看成是压力线支撑线,中间的线是N日的移动均线,通常情况下,价格的走势会在上下两条线之间。

Boll指标的计算如下:
1、计算N日收盘价的移动平均值MA
2、计算N日收盘价的标准差MD
3、计算上轨线UP=MA + K * MD
4、计算下轨线DN=MA - K * MD
通常,N常会选择20,K的选取会选择K=2,也可以根据策略运行的过程中进行调整。

CCI(Commodity Channel Index)指标

由于下面的vnpy中的策略引入了CCI指标,所以简单对CCI指标进行介绍。CCI指标也称为顺势指标。它是由唐纳德·蓝伯特(Donald Lambert)于20世纪80年代提出的,用于判断当前价格是否超出常态分布范围,同KDJ、RSI一样,也是用于判断超卖超买。但是不同于这些0-100范围限制的指标,CCI的范围是负无穷和正无穷之间,所以CCI对于短期内暴涨暴跌的股票或者期货可以进行更好的衡量与判断,所以很多短期策略都会用到CCI指标。

CCI指标的计算方法是:
1、计算当前的TYP(typical price) = (Low + High + Close) / 3
2、计算N周期的TYP的移动平均值MA
3、计算N周期的TYP的标准差MD
4、CCI = (TYP - MA) / (MD * 0.015)

布林通道策略

根据布林通道指标指定的策略有很多,主要还是基于价格与上中下轨道之间的关系制定的。例如,当利多利空消息已经出尽,此时股价幅度开始变小,也就是进入了盘整的情况下,此时通道会变窄,当价格波动超出了狭窄的通道上轨时,会预示着盘整结束后新的向上趋势的开始;当价格波动跌破狭窄的通道下轨时,会预示着盘整结束后新的向下趋势的开始。也有的布林通道策略是根据通道的形态制定的,例如上下轨之间的距离扩大形成的开口型喇叭口形态布林线和上下轨之间距离缩小形成的闭口型喇叭口形态布林线。还有的布林通道策略是通过跟其他指标如RSI、ATR、CCI或者KDJ指标进行结合,使得判断更加精准。

布林通道策略源码分析

在vnpy中也有实现一个基于布林通道的策略,其思想是上面的第三种,它是通过布林通道结合CCI以及ATR指标制定的。其中CCI指标用来超买超卖,ATR指标用来作为止损止盈,布林通道则作为日内突破的上下轨。

1、完整源码
from vnpy.app.cta_strategy import (CtaTemplate,StopOrder,TickData,BarData,TradeData,OrderData,BarGenerator,ArrayManager,
)class BollChannelStrategy(CtaTemplate):""""""author = "用Python的交易员"boll_window = 18boll_dev = 3.4cci_window = 10atr_window = 30sl_multiplier = 5.2fixed_size = 1boll_up = 0boll_down = 0cci_value = 0atr_value = 0intra_trade_high = 0intra_trade_low = 0long_stop = 0short_stop = 0parameters = ["boll_window", "boll_dev", "cci_window","atr_window", "sl_multiplier", "fixed_size"]variables = ["boll_up", "boll_down", "cci_value", "atr_value","intra_trade_high", "intra_trade_low", "long_stop", "short_stop"]def __init__(self, cta_engine, strategy_name, vt_symbol, setting):""""""super(BollChannelStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)self.am = ArrayManager()def on_init(self):"""Callback when strategy is inited."""self.write_log("策略初始化")self.load_bar(10)def on_start(self):"""Callback when strategy is started."""self.write_log("策略启动")def on_stop(self):"""Callback when strategy is stopped."""self.write_log("策略停止")def on_tick(self, tick: TickData):"""Callback of new tick data update."""self.bg.update_tick(tick)def on_bar(self, bar: BarData):"""Callback of new bar data update."""self.bg.update_bar(bar)def on_15min_bar(self, bar: BarData):""""""self.cancel_all()am = self.amam.update_bar(bar)if not am.inited:returnself.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)if self.pos == 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = bar.low_priceif self.cci_value > 0:self.buy(self.boll_up, self.fixed_size, True)elif self.cci_value < 0:self.short(self.boll_down, self.fixed_size, True)elif self.pos > 0:self.intra_trade_high = max(self.intra_trade_high, bar.high_price)self.intra_trade_low = bar.low_priceself.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplierself.sell(self.long_stop, abs(self.pos), True)elif self.pos < 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = min(self.intra_trade_low, bar.low_price)self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplierself.cover(self.short_stop, abs(self.pos), True)self.put_event()def on_order(self, order: OrderData):"""Callback of new order data update."""passdef on_trade(self, trade: TradeData):"""Callback of new trade data update."""self.put_event()def on_stop_order(self, stop_order: StopOrder):"""Callback of stop order update."""pass
2、策略参数与变量

策略中主要6个超参数和8个变量。

6个超参数的意义是:
1、boll_window:计算布林通道的窗口大小。
2、boll_dev:中轨标准差的倍数。
3、cci_window:计算cci指标的窗口大小。
4、atr_window:计算atr指标的窗口大小。
5、sl_multiplier:止损止盈的乘数。
6、fixed_size:开仓的手数。

8个变量的意义是:
1、boll_up:布林通道的上轨。
2、boll_down:布林通道的下轨。
3、cci_value:cci指标的值。
4、atr_value:atr指标的值。
5、intra_trade_high:日内交易的最高值。
6、intra_trade_low:日内交易的最低值。
7、long_stop:多头止盈止损。
8、short_stop:空头止盈止损。

    boll_window = 18boll_dev = 3.4cci_window = 10atr_window = 30sl_multiplier = 5.2fixed_size = 1boll_up = 0boll_down = 0cci_value = 0atr_value = 0intra_trade_high = 0intra_trade_low = 0long_stop = 0short_stop = 0parameters = ["boll_window", "boll_dev", "cci_window","atr_window", "sl_multiplier", "fixed_size"]variables = ["boll_up", "boll_down", "cci_value", "atr_value","intra_trade_high", "intra_trade_low", "long_stop", "short_stop"]
3、策略执行逻辑

不同于之前的策略,这次的策略的是基于15min K线级别的,所以在创建BarGenerator对象时需要传递15分钟bar级别的回调函数。策略也是需要10天的数据进行初始化。

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):""""""super(BollChannelStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)self.am = ArrayManager()def on_init(self):"""Callback when strategy is inited."""self.write_log("策略初始化")self.load_bar(10)

由于这个策略是在15-min级别的数据上执行的,所以主要策略逻辑将不是在on_bar()函数里实现,on_bar()函数的作用是继续将推送的1-min数据合成为15-min数据,然后主要策略执行逻辑是在on_15min_bar()函数里实现的。这个策略的思想可以借鉴一下,为以后写其他时间周期级别的策略提供编写代码的思路。

    def on_bar(self, bar: BarData):"""Callback of new bar data update."""self.bg.update_bar(bar)

一开始同样也是取消上一笔没有成交的订单,然后将bar数据添加到ArrayManager当中。之后通过ArrayMangager对象am中的boll()以及cci()、atr()函数来调用底层的ta-lib接口来计算当前相应窗口下的布林上轨和下轨以及cci和atr指标的值。

    def on_15min_bar(self, bar: BarData):""""""self.cancel_all()am = self.amam.update_bar(bar)if not am.inited:returnself.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)

当持有空仓时,需要记录当前bar的最高价和最低价。如果cci指标的值大于0,则以布林通道的上轨价位开出一手多头停止单;如果cci指标的值小于0,则以布林通道的下轨价位开出一手空头停止单。

        if self.pos == 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = bar.low_priceif self.cci_value > 0:self.buy(self.boll_up, self.fixed_size, True)elif self.cci_value < 0:self.short(self.boll_down, self.fixed_size, True)

当持有多头仓位的时候,从之前存储的最高价位和当前bar的最高价位中选取最大的,并且将之前的最低价位设置为当前bar的最低价位。然后通过atr指标和sl_multiplier参数来设置止损止盈的价位,并以这个价位进行平仓卖出;当持有空头仓位的时候,从之前存储的最低价位和当前bar的最低价位中选取最小的,并且将之前的最高价位设置为当前bar的最高价位。然后通过atr指标和sl_multiplier参数来设置止损止盈的价位,并以这个价位进行平仓买入。

        elif self.pos > 0:self.intra_trade_high = max(self.intra_trade_high, bar.high_price)self.intra_trade_low = bar.low_priceself.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplierself.sell(self.long_stop, abs(self.pos), True)elif self.pos < 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = min(self.intra_trade_low, bar.low_price)self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplierself.cover(self.short_stop, abs(self.pos), True)

【vn.py】源码解析之布林通道(BollChannel)策略相关推荐

  1. vn.py源码解读(一、环境配置与回测初试)

    近来忙于毕业找工作,也不知道能不能继续在量化界混了.周末比较闲,抽空研究了一下vn.py.有人说,为什么学那么多的回测平台呀.其实我个人觉得,做cta的话,两个回测平台还是要的,这样,当你的策略出现和 ...

  2. vn.py源码解读(六、主引擎代码分析---策略模块)

    之前在讲MainEngine的时候,有这样一个代码: me.addApp(ctaStrategy) 这里,我们来看一下MainEngine里面这个addApp函数的代码: def addApp(sel ...

  3. vn.py源码解读(五、主引擎代码分析----CTP模块)

    上一篇文章讲了MainEngine中的初始化函数,重点是DataEngine的讲解.有了对行情数据的处理,还需要有行情数据的来源.在MainEngine的初始化函数后面的一个函数就是addGatewa ...

  4. matlab布林算法代码,MATLAB量化交易策略源码分享之 布林通道+高低点

    策略原理: 通过布林带以及突破后的高低点的形成产生交易信号 采取跟踪止损出场 回测曲线: 2017-2-27 10:09:43 上传 下载附件 (65.41 KB) 策略代码: function  S ...

  5. [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略

    [源码解析] 深度学习流水线并行 PipeDream(6)- 1F1B策略 文章目录 [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 0x00 摘要 0x01 流水线比 ...

  6. YOLOX源码解析--全网最详细,建议收藏!

    YOLOX源码解析 大家好,我是[豆干花生],这次我带来了YOLOX源码解析,与你分享~ 参考文献: https://blog.csdn.net/u011622208/article/details/ ...

  7. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (5) 嵌入式hash表

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器- (5) 嵌入式hash表 文章目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (5) 嵌入式hash表 ...

  8. AlphaFold2源码解析(4)--模型架构

    AlphaFold2源码解析(4)–模型架构 我们将Alphafold的流程分为一下几个部分: 搜索同源序列和模板 特征构造 特征表示 MSA表示与残基对表示之间互相交换信息 残基的抽象表示转换成具体 ...

  9. 【DETR源码解析】二、Backbone模块

    目录 前言 一.Backbone整体结构 一.CNN-Backbone 二.Positional Encoding Reference 前言 最近在看DETR的源码,断断续续看了一星期左右,把主要的模 ...

最新文章

  1. SQL Server查询某字段在哪些表中
  2. 使用python爬虫抓站的一些技巧总结:进阶篇
  3. mysql高效率写法_mysql高效率随机获取n条数据写法
  4. python都可以干什么-python都能干嘛
  5. python零基础实例-零基础学习Python开发练习100题实例(1)
  6. 包管理和环境管理软件Anaconda
  7. repo init和sync命令的实用小技巧
  8. 现代 JavaScript 教程
  9. android 声明一个空数组
  10. python eof是什么_EOF错误python
  11. win10重装系统后,无限自动修复
  12. 电子产品高温贮存试验的价格-第三方检测机构
  13. shing boot 做session共享 redis
  14. 渗透测试常见漏洞描述及修复建议
  15. sql增加数据的几种方法
  16. 你连基础的JVM运行时内存布局都忘了?Java面试题及解析
  17. 电脑显示器不亮的三种原因和解决方法
  18. Linux第三章:shell编程之for循环语句
  19. QT出现中文乱码及解决方案
  20. 云存储使用以及dropbox免费获取空间

热门文章

  1. 2021年安全员-A证考试报名及安全员-A证最新解析
  2. Ubuntu18.04——安装视频编辑软件OpenShot
  3. 解决使用element-ui级联选择框内容空白且下拉框过高
  4. C++:日期操作、复数加减法、求二元一次方程的根
  5. Linux云主机开启IPv6服务
  6. 《LKD3粗读笔记》(6)内核数据结构
  7. 购买云服务器和域名的过程备案
  8. windows10 原版 纯净版 下载
  9. android eth0静态ip,在android中将静态IP设置为以太网
  10. matlab利民的逻辑运算符,matlab逻辑运算符