Contents

Backtrader-Orders

backtrader翻译:order部分

Cerebrobacktrader的重要的控制系统,Strategy的子类是终端用户的关键控制点。后者需要一种链接方法来连接到系统的其他部分,这也就是订单orders发挥重要作用的地方。

Orders将Strategy中的逻辑制定的决策翻译成代理人可执行某个行为的合适的信息。通过以下来完成:

  • 创建
    通过Strategy提供的方法:buysell以及close将会返回一个订单实例作为引用。
  • 取消
    通过Strategy提供的方法:cancel,这将会提供一个订单的实例来操作。

orders还充当返回给用户的通信方法,来通知代理人事情如何运行。

  • 通知
    策略方法:notify_order将会报告order实例

订单创建

当调用buysell以及close时,下面的参数将会应用到创建中:

  • data(默认:None)
    对于订单创建的数据,如果None,则使用系统中的第一个数据,self.datas[0]self.data0,也就是self.data将会使用。
  • size(默认:None)
    用于订单数据单位的大小。
  • Price(默认:None)
    使用价格(如果它不符合最小的报价单价要求,在实际中代理人可能对实际格式施加限制)
    None对于MarketClose订单有效(市场影响价格)
    对于LimitStopStopLimit订单,这个值决定了触发点(在Limit中,触发点是明显的价格订单匹配的价格)。
  • plimit(默认:None)
    仅适用于StopLimit订单。一旦Stop被触发(price已被使用),这就是设置的隐含的Limit订单价格。
  • exectype(默认:None)
    可取的值:
    • Order.MarketNone。一个市场订单将使用下一个可能的价格执行。在回测中,他将会使下一个bar的开盘价。
    • Order.Limit。订单只在给定的price或更好的情况下才会执行。
    • Order.Stop。订单在price触发并像Order.Market执行一个订单。
    • Order.StopLimit。订单在price触发并执行隐含限制订单,pricepricelimit提供。
  • valid(默认:None)
    可能的值:
    • None:这会生成一个不会过期的订单(又称Good till cancel,取消前有效)并且保留在市场中直到匹配或者取消。在实际中代理人代理人倾向于提出一个时间限制,但是这个限制通常是如此遥远,以至于可以认为它不会过期。
    • datetime.datetimedatetime.date实例:date将用来生成一个订单,到给定日期前有效(又称good till date)。
    • Order.DAY0或者timedelta():生成一个日期,有效直到End of the Session(又称day order)。
    • numeric value:这是假设概述值与mapplotlib编码的日期相对应的,并且将会用来生成一个订单,直到这个时间都有效。
  • tradeid(默认:0)
    这是一个由backtrader应用的内部数值来朱总在重复资产上的重叠交易。当通知订单状态发生变化时,tradeid发送回strategy
  • **kwargs:额外的代理人实现可能支持额外的参数。backtrader将会向下传递kwargs到创建的订单对象中。

举例:如果这4个订单执行类型直接被backtrader支持是不够的,在这种情况下,比如Interactive Brokers将会传递看参数:

orderType='LIT', lmtPrice=10.0, auxPrice=9.8
Note
close方法将会检查现在的仓位并且相应的来使用buysell来有效的close平仓。size也将会自动地计算除非

订单通知

为了接收通知,notify_order方法必须在用户Strategy子类覆写(默认情况下什么也不做)。下面的可以应用到这些通知中:

  • 在策略的next方法调用前发出
  • 对于在相同的next流程中带有相同或者不同状态的相同的order可能(以及将会)发生几次。
    一个订单在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实例被手动的创建而非通过buysellclose

  • Order.Submitted: 在订单实例已传输到经纪人时设置。这仅仅意味着订单已被发送。在回测模式中,这是一个即时的动作,但在实际经纪人情况下可能需要时间,可能在经纪人收到订单并转发给交易所时才会首先通知。

  • Order.Accepted: 经纪人已经接受订单并且订单已经在系统中(或已在交易所)等待按照设定的参数(如执行类型、大小、价格和有效期)执行。

  • Order.Partial: 订单已部分执行。order.executed 包含当前的已成交数量和平均价格。

  • order.executed.exbits 包含详细列出部分成交的所有 ExecutionBits 列表。

  • Order.Complete: 订单已完全成交。

  • Order.Rejected: 经纪人拒绝了订单。某个参数(例如,用于确定其生命周期的有效期)可能不被经纪人接受,导致订单无法被接受。
    拒绝原因将通过策略的 notify_store 方法通知。尽管这可能显得很尴尬,但原因是实际经纪人会通过一个事件通知这一点,这个事件可能与订单没有直接关系。但来自经纪人的通知仍然可以在 notify_store 中看到。这种状态在回测经纪人中不会看到。

  • Order.Margin: 订单执行将导致追加保证金要求,之前接受的订单已从系统中移除。

  • Order.Cancelled(或 Order.Canceled): 用户请求取消的确认。
    必须考虑,通过策略的 cancel 方法请求取消订单并不保证取消。订单可能已经执行,但这种执行可能尚未被经纪人通知,或者通知可能尚未传递给策略。

  • Order.Expired: 先前接受的订单具有时间有效性,已过期并从系统中移除。