You are here:  Home » 量化交易与机器学习 » backtrader » 交易订单相关类的详细说明 – backtrader中文教程

Cerebro是关键控制系统,backtraderStrategy一个子类)是最终用户的关键控制点。后者需要一种链接到系统其他部分的方法,而这正是订单发挥关键作用的地方。

订单将 a 中的逻辑做出的决策Strategy转换为适合Broker执行操作的消息。这是通过以下方式完成的:

  • 创建通过 Strategy 的方法:buy\``,卖出and平仓(Strategy) which return an订单实例作为参考
  • 消除通过 Strategy 的方法:cancel(Strategy) 接受一个订单实例来操作

订单还可以作为返回给用户的一种通信方式,以通知代理中的事情是如何运行的。

  • 通知To Strategy 方法:(notify_order策略)它报告一个 order实例

订单创建

调用时,buy以下参数适用于创建:sellclose

  • data(默认:None)必须为哪些数据创建订单。如果None那么系统中的第一个数据,self.datas[0] or self.data0(又名 self.data)将被使用
  • size(默认:None)用于订单的数据单位的大小(正)。

    如果通过检索None的实例将用于确定大小。sizergetsizer

  • price(默认:None)使用价格(如果实际格式不符合最小报价大小要求,实时经纪人可能会对实际格式施加限制)

    NoneMarketClose订单有效(市场决定价格)

    For LimitStopand StopLimitorders 这个值决定了触发点(在触发的情况下Limit明显是在哪个价格下单应该匹配)

  • plimit(默认:None)仅适用于StopLimit订单。这是设置隐含限价单的价格,一旦触发止损price(已使用)
  • exectype(默认:None)可能的值:
    • Order.MarketNone。市价单将以下一个可用价格执行。在回测中,它将是下一个柱的开盘价
    • Order.Limit. 只能在给定 price或更好的条件下执行的订单
    • Order.Stop. 像订单一样触发price和执行的Order.Market订单
    • Order.StopLimit. 触发price并作为隐式限价订单执行的订单,价格为 pricelimit
  • valid(默认:None)可能的值:
    • None:这会生成一个不会过期的订单(又名 Good until cancel)并保留在市场中直到匹配或取消。实际上,经纪人倾向于施加时间限制,但这通常在时间上很遥远,以至于认为它不会过期
    • datetime.datetimedatetime.date实例:日期将用于生成在给定日期时间之前有效的订单(又名有效期至日期
    • Order.DAY0timedelta():将生成在会话结束前有效的一天(又名日订单)
    • numeric valuematplotlib:这被假定为与编码 中的日期时间相对应的值(由 使用的那个backtrader),并将用于生成在该时间之前有效的订单(直到日期有效)
  • tradeid(默认:0)这是一个内部值,用于backtrader跟踪同一资产的重叠交易。当通知订单状态的变化时,这tradeid将被发送回策略。
  • **kwargs: 额外的代理实现可能支持额外的参数。backtraderkwargs传递给创建的订单对象示例:如果直接支持的 4 种订单执行类型 backtrader不够用,例如 Interactive Brokers,可以将以下内容作为kwargs传递:
orderType='LIT', lmtPrice=10.0, auxPrice=9.8

这将覆盖由创建的设置backtrader并生成一个触及价格为 9.8 和限价为 10.0的LIMIT IF TOUCHED订单

Tips:该close方法将检查当前仓位并相应地使用buysell有效地平仓size也将自动计算,除非参数是来自用户的输入,在这种情况下可以实现部分平仓 或反转

订单通知

要接收通知,notify_order必须在用户子类中重写该方法Strategy(默认行为是什么都不做)。以下适用于这些通知:

  • next在调用策略的方法之前发出
  • 在同一下一个周期中,可能(并且将会)发生多次相同或不同状态的相同订单。订单可以提交给经纪人并被接受,之前完成的订单next将被再次调用。

    在这种情况下,至少会发生 3 个通知,并具有以下 status值:

    • Order.Submitted因为订单已发送给经纪人
    • Order.Accepted因为订单已被经纪人接受并等待潜在的执行
    • Order.Completed因为在示例中它被快速匹配并完全填充(通常可能是Market订单的情况)

对于相同的状态,通知甚至可能发生多次 Order.Partial。此状态不会在回代理中看到(匹配时不考虑交易量),但肯定会由真实代理设置。

真实经纪人可能会在更新头寸之前发出一次或多次执行,而这组执行将弥补一次Order.Partial通知。

实际执行数据在属性中:order.executed这是一个类型的对象OrderData(参见下面的参考),通常的字段为sizeprice

创建时的值存储在order.created其中,在整个生命周期中保持不变order

订单状态值

定义如下:

  • Order.Created:在Order创建实例时设置。除非order手动创建实例而不是通过buy,sellclose
  • Order.Submitted:在order实例已传输到broker. 这仅仅意味着它已被发送。在回测 模式下,这将是一个立即行动,但它可能需要真正的经纪人实际时间,该经纪人可能会收到订单,并且只有在它被转发到交易所时才首先通知
  • Order.Accepted:broker已接受订单并且它在系统中(或已经在交易所中)等待根据设置的参数(如执行类型、大小、价格和有效性)执行
  • Order.Partial:order已部分执行。order.executed包含当前的size成交价和平均价。order.executed.exbits包含ExecutionBits 详细说明部分填充物的完整列表
  • Order.Complete:order已完全填满均价。
  • Order.Rejected:broker已拒绝订单。参数(例如valid确定其生命周期)可能不被 the 接受,broker并且order不能被接受。原因将通过 的notify_store方法 通知strategy。虽然这可能看起来很尴尬,但原因是现实生活中的经纪人会通过事件通知这一点,这可能与订单直接相关,也可能不直接相关。但是仍然可以看到来自经纪人的通知notify_store

    在回测代理中不会看到此状态

  • Order.Margin:订单执行将意味着追加保证金,并且先前接受的订单已从系统中删除
  • Order.Cancelled(或Order.Canceled):确认用户请求取消必须考虑到,通过策略方法取消订单 的请求并不能保证取消。cancel订单可能已经执行,但经纪商可能尚未通知此类执行和/或通知可能尚未交付给策略
  • Order.Expired:以前接受的具有时效性的订单已过期并已从系统中删除

参考:订单和相关类

这些对象是backtrader生态系统中的通用类。在与其他经纪人合作时,它们可能会被扩展和/或包含额外的嵌入信息。请参阅相应经纪人的参考资料

class backtrader.order.Order()

保存创建/执行数据和订单类型的类。

订单可能有以下状态:

  • Submitted:发送给经纪人并等待确认
  • Accepted:被经纪人接受
  • Partial:部分执行
  • Completed:完全执行
  • Canceled/Cancelled:被用户取消
  • Expired:过期
  • Margin:没有足够的现金来执行订单。
  • Rejected:被经纪人拒绝这可能发生在订单提交期间(因此订单不会达到已接受状态)或在每个新柱价格执行之前,因为现金已被其他来源提取(类似未来的工具可能已经减少了现金或订单订单可能已经执行)

会员属性:

  • ref:唯一的订单标识符
  • created:OrderData 保存创建数据
  • 执行:OrderData 保存执行数据
  • info:通过方法传递的自定义信息addinfo()。它以已被子类化的 OrderedDict 的形式保存,因此也可以使用 ‘.’ 指定键。符号

用户方法:

  • isbuy():返回 bool 指示订单是否购买
  • issell():返回 bool 指示订单是否卖出
  • alive():如果订单状态为 Partial 或 Accepted,则返回 bool

class backtrader.order.OrderData(dt=None, size=0, price=0.0, pricelimit=0.0, remsize=0, pclose=0.0, trailamount=0.0, trailpercent=0.0)

保存创建和执行的实际订单数据。

在创建的情况下提出请求,在执行的情况下实际结果。

会员属性:

  • exbits : 此 OrderData 的 OrderExecutionBits 的可迭代
  • dt: datetime (float) 创建/执行时间
  • size:请求/执行的大小
  • price:执行价格注:如果没有给出价格,也没有给出pricelimite,则以当时的收盘价或订单创建时的收盘价作为参考
  • pricelimit:持有 StopLimit 的 pricelimit(先触发)
  • trailamount:追踪止损的绝对价格距离
  • trailpercent:追踪止损的百分比价格距离
  • value:整个比特大小的市场价值
  • comm:整个比特执行的佣金
  • pnl:由该位生成的 pnl(如果某些东西已关闭)
  • margin:订单产生的保证金(如有)
  • psize: 当前开仓大小
  • pprice:当前未平仓价格

class backtrader.order.OrderExecutionBit(dt=None, size=0, price=0.0, closed=0, closedvalue=0.0, closedcomm=0.0, open=0, opensvalue=0.0, openscomm=0.0, pnl=0.0, psize=0 , pprice=0.0)

旨在保存有关订单执行的信息。“位”不能确定订单是否已全部/部分执行,它只是保存信息。

会员属性:

  • dt: datetime (float) 执行时间
  • size:执行了多少
  • price:执行价格
  • closed:有多少执行关闭了现有职位
  • opened:多少执​​行了新仓位
  • opensvalue:“打开”部分的市场价值
  • closedvalue:“封闭”部分的市场价值
  • closedcomm:“封闭”部分的佣金
  • openscomm:“打开”部分的佣金
  • value:整个比特大小的市场价值
  • comm:整个比特执行的佣金
  • pnl:由该位生成的 pnl(如果某些东西已关闭)
  • psize: 当前开仓大小
  • pprice:当前未平仓价格

评论被关闭。