填充器#

在使用 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