默认模式
假设为日线数据,在next方法中调用订单方法。
执行逻辑为,当天收盘后提交订单,次日使用开盘价执行订单。
在backtrader中对任何时间粒度的数据,下单时机是当前bar(索引为0)的完成时间点;执行时机是下一根bar(索引为1)开始。
作弊模式
收盘作弊模式
简述
当日(收盘)下单,当日(收盘)成交
有些用户想要在使用日线bar时,今日下市价单,成交价格就是今日收盘价。
相当于实际场景:用户在下午临收盘前观察盘面,预估收盘价,下单成交,这个价格有可能与收盘价差别不大,相当于今日收盘价成交。
backtrader提供了收盘作弊模式 cheat_on_close
,可以以今日收盘价成交,
开启方法 cerebro.broker.set_coc(True)
注意:在作弊模式下,notify_order中输出self.data0.datetime.datetime(0)
并不是订单执行时间,而是次日。
正确的 获取订单执行时间order.executed.dt
、获取订单创建时间order.created.dt
开盘作弊模式
简述
当日(开盘)下单,当日(开盘)成交
有些用户希望当天下单,并以当天开盘价成交。相当于上帝模式(提前观察到开盘价),然后以开盘价成交,这在backtrader中成为开盘作弊模式 cheat_on_open
。当用户想要以开盘价计算全量全量买入数量时,有可能使用此模式。
开启开盘作弊模式方法:cerebro = bt.Cerebro(cheat_on_open=True)
由于这个模式整个执行逻辑与默认模式很大不同,所以策略类中覆写的方法不再之前的 prenext、next等。backtrader提供了另一套队形的 xxx_open 方法供用户编写业务逻辑。如:next_open、nextstart_open、prenext_open、next_open
等。
在这些 xxx_open 方法中:
1、各种技术指标都还未重新计算,还保留着昨天的结果。如 self.sma[0]是昨天的移动均值
2、经纪行broker还未评估未决订单。
Tips:
当然,在默认模式下,可以使用如 self.data0.open[1]
来实现提前获得开盘价,但者需要预加载。同时要注意最后一根bar异常,需要的next中加上保护条件:
if len(self.datas[0]) == self.data0.buflen():
return