填充器#
在使用 backtrader 模拟经纪人执行订单时,有一个默认策略与使用交易量相关:
忽略交易量
这是基于两个前提条件的:
在流动性足够高的市场上进行交易,能够完全吸收一次性的 买入/卖出 订单
真实的成交量需要有真实的世界参照
一个快速的例子是一个“执行或取消”订单。即使到 tick 的精度,且有足够的交易量进行订单的 成交,* backtrader*经纪人也无法知道市场上还有多少其他交易参与者,从而无法确定该订单是否能够满足“执行”部分或是否应将该订单“取消”。
但是该 经纪人 可以接受 交易量填充器 ,它决定了在给定时间点上要使用多少交易量进行 订单匹配 。
填充器的签名#
在 backtrader 生态系统中, 填充器 可以是任何符合以下签名的 可调用对象 :
callable(order, price, ago)其中:
order
是将被执行的订单此对象提供对
data
对象的访问,该对象是操作的目标,包括创建大小/价格、执行价格/大小/剩余大小和其他详细信息。price
是订单将被执行的价格ago
是在 order 中查找卷和价格元素的目标data
的索引在几乎所有情况下,这将是
0
(当前时间点),但在一种边缘情况下,为了覆盖Close
订单,这可能是-1
例如,要访问柱体的成交量,可以这样做:
barvolume = order.data.volume[ago]
可调用的可以是一个函数,也可以是支持 __call__
方法的类的实例,比如:
- class MyFiller(object):
- def __call__(self, order, price, ago):
pass向经纪人添加占位符
最直接的方法是使用 set_filler
方法:
import backtrader as bt
cerebro = Cerebro()
cerebro.broker.set_filler(bt.broker.fillers.FixedSize())
第二种选择是完全替换 broker
,虽然这可能只适用于重写了功能部分的 BrokerBack
的子类:
import backtrader as bt
cerebro = Cerebro()
filler = bt.broker.fillers.FixedSize()
newbroker = bt.broker.BrokerBack(filler=filler)
cerebro.broker = newbroker
示例#
backtrader 源代码中包含一个名为
volumefilling
的示例,可以测试一些集成的fillers
(最初全部)
参考资料 ==========.. 当前模块:: backtrader.fillers