Backtrader 文档学习-Strategy
策略通过方法的形式体现生命周期。
是BackTrader的核心模块,需要好好研读。
1.Strategy
- (1)怀胎
在init中创建indicator和需要的属性值 - (2)出生
start方法,策略启动,start默认是空方法 - (3)儿童
prenext方法,indicator 在init初始化的时候设置了成熟期的时间,称为最小周期。上面在 __init__创建了一个周期=15的SimpleMovingAverage。 - (4)成人
next方法,一旦系统生成15个bar,SMA缓存了足够的用于启动的数据,策略就可以真正执行。
nextstart方法执行一次,是从prenext切换到next的标志,nextstart默认执行是调用next方法。 - (5)生育
策略中并没有真正的生育,但是从某种意义上来说是存在的,因为如果优化用不同的参数的话,系统会实例化多次。算是生育吧 - (6)死亡
stop方法,系统通知策略重启,恢复所有设置,默认是空方法。
策略就像现实世界中的交易员一样,会在事件发生时得到通知。实际上在每一个next循环在回测过程中 :
- 通过notify_order(order)获得订单状态变化的通知
- 通过notify_trade(trade)通知所有开仓/更新/平仓交易
- 通过notify_cashvalue(cash,value)通知在broker中当前现金和投资组合
- 通过notify_fund(cash,value,fundvalue,shares)跟踪broker中当前现金和投资组合,以及基金价值和份额
- 通过notify_store(msg,*args,**kwargs)实现特定事件 ,请参见Cerebro的关于store的说明。event将被传递给策略,即使已经被传递给cerebro实例(通过重写notify_store方法或通过回调)
策略像交易者有机会在市场期间通过next方法试图实现获利
- buy方法 是做多或减少/平仓空头的头寸
- sell方法 是做空或减少/平仓多头的头寸
- close方法 是平仓存在的仓位
- cancel方法 是取消尚未执行的订单
2. How to Buy/Sell/Close
order常用的方法是Buy和Sell方法。当被调用时,它们返回一个订单(或子类)实例作参考。该订单具有唯一的参考标识符,可用于对比。
order的参数:
- data(默认:无) 必须为其创建订单的数据。如果没有,则将使用系统中的第一个数据,即self.datas[0]或self.data0(也称为self.data)
- size(默认值:无) 用于订单的数据单位的大小(正值)。 如果没有,将使用通过getsizer检索的sizer来确定大小。
- price(默认值:无) 如要设置的价格(实时broker会对其进行限制,如果格式不符合最小报价单位要求)
None对market订单和close订单是有效(市价决定价格)
对于limit限价单、stop止损单和stoplimit单,该值price决定是否触发,(在限价单limit的情况下,触发点显然是订单应该匹配price) - exectype(默认值:None) 执行订单的类型:
- Order.Market or None,市价单将以next可用价格执行。回测中,next使用第二天的开盘价执行订单。
- Order.Limit,只能以给定价格或更低(好)价格执行的订单
- Order.Stop,止损价格被触发,和订单一样执行。
- Order.StopLimit,以价格触发的订单,隐含限价订单执行,价格由pricelimit执行,理解应该是止损单的止损价格。
- numeric value: 如果是一个与matplotlib编码中的日期时间相对应的值(backtrader使用的日期时间),就是该数字能转换成正确的日期,可以生成一个在该时间(截止日期)之前有效的订单。
如果backtrader直接支持的4种订单执行类型还不够用,例如在交互时broker,可以将作为kwargs传递:
orderType='LIT', lmtPrice=10.0, auxPrice=9.8
将重写backtrader创建的设置,并生成一个触及限价单,触及价格为9.8,限价为10.0。
3.Information Bits
策略的长度总是等于主数据(datas[0])的长度,可以用len(self) 。
如果正在replay数据或正载入数据,并且新tick正在到达相同的时间点,调用next而不改变长度 。(没有理解 ?)
4.Member Attributes
未完待续