默认情况下,backtrader中发出的订单,如果要成交,会成交全部数量,而与成交那根bar的总成交量(volumn)无关。
比如,在当前bar结束时,创建如下市价买单:
self.buy(size=100)
那么,到下一根bar,会以开盘价全部成交100股,即使下一根bar总成交量是50股也不影响该订单成交100股。
那么,我们能不能改变这种默认行为,让订单成交量与bar的总成交量挂钩呢?至少不要超过总成交量。方法是有的,那就是使用订单履行对象filler。有三种filler,以下分别介绍。
(1)固定数量filler:FixedSize
使用方法如下(假设在策略里创建了100股买单self.buy(size=100),后面2根bar的总成交量分别为90、80):
...
filler = bt.broker.fillers.FixedSize(size=70)
cerebro.broker.set_filler(filler)
cerebro.run()
那么在某bar上订单实际成交数量(不管买单还是卖单)=min(size,bar的总成交量,订单剩余数量)
在这种情况下,订单可能会被分开几次执行完。订单会在第一根bar成交70股