Backtrader 文档学习-Order General

本文详细介绍了Backtrader库中的Cerebro控制器和Order类在策略执行中的关键作用,包括订单创建、类型、通知机制以及OrderData和OrderExecutionBit类的使用。这些内容涵盖了订单的生命周期管理,从创建到执行状态的变化以及与策略交互的方式。
摘要由CSDN通过智能技术生成

Backtrader 文档学习-Order General

Cerebro是backtrader中的关键控制系统,策略(子类)是最终用户的关键控制点,后者需要连接系统其他部分的方法,这就是订单扮演的关键角色。

Order将strategy的逻辑做出的决策转换为适合broker执行操作的消息。通过以下方式完成:

  • 创建 ,通过strategy 的方法:buy sell 和close 都可以返回Order的实例
  • 取消,通过strategy的方法:cancel 也可以产生Order实例
  • 通知,notify_order 的方法,也返回Order 实例
    订单还作为反馈给用户的通信方法,通知代理中的运行情况( 在strategy中也提及了)。

1.订单创建

通过 buy sell close 创建,带以下参数:

  • data (default: None) ,如果是None ,就是第一个加载cerebro的数据self.datas[0] or self.data0

  • size (default: None) ,每个订单的数量,正数。None,将使用通过getsizer检索的sizer实例来确定大小。默认就是1

  • price (default: None),指定下单的价格(如果实际格式不符合最小报价单位要求,实时broker会对其进行限制)。

    • None 对Market订单和平仓订单有效(市场决定价格,用市价操作)
    • 对于 Limit/ Stop /StopLimit 订单参数,订单该值决定触发点(在Limit的情况下,触发点显然是订单Limit设置的价格)
  • plimit (default: None),仅适用于StopLimit止损单。就是设置隐含限价单的价格,一旦止损被触发(使用该价格) 。

  • exectype (default: None)

    • Order.Market or None, 市价单将以下一个可用价格执行。在回测中它将是下一bar的开盘价
    • Order.Limit,只能以给定价格或更高价格执行的订单
    • Order.Stop,价格到达才能触发订单,产生一个Order.Market
    • Order.StopLimit,在价格上被触发的订单,价格由pricelimit的隐含限价订单执行
  • valid (default: None)

    • None: 生成一个不会过期的订单,一直保留在市场中,直到匹配或取消。在实际中broker会设定一个时间限制,通常是因为时间太久而没有到期
    • datetime.datetime or datetime.date ,该日期将用于生成在给定日期之前有效的订单(也称为有效截止日期)
    • Order.DAY or 0 or timedelta(),将生成一个有效期至会话结束的日期(也称为日订单)
    • numeric value,假设该值对应于matplotlib编码中的日期时间(backtrader使用的日期时间),在该时间之前有效的订单(有效截止日期)
  • tradeid (default: 0),是BT应用的内部值,用于跟踪同一资产的重叠交易。当通知订单状态发生变化时,该tradeid将被发送回策略。

  • **kwargs ,其他broker实现可能支持额外的参数。backtrader将把kwargs传递给创建的订单对象
    示例:如果backtrader直接支持的4种订单执行类型还不够,例如在交互式broker时,以下内容可以作为kwargs传递:

orderType='LIT', lmtPrice=10.0, auxPrice=9.8

重写BT创建的设置,并生成一个触及价格为9.8、限价为10.0的限价订单。
注意:
平仓方法将检查当前position ,并相应地使用买入或卖出来有效平仓。大小也将自动计算,除非参数是用户的输入,在这种情况下,可以实现部分关闭或反转 。

2.订单通知

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

  • 在next方法之前被调用
  • 可能一个order触发多次,在同一个或不同的next循环中。order提交给broker受理,在next再次被触发前执行完成。
    在次情况下至少能有3类通知触发,对应以下状态值:
    • Order.Submitted ,order提交给broker
    • Order.Accepted ,broker接受order,等待潜在 的执行条件
    • Order.Completed ,因为使用市场订单,所以订单能迅速匹配并执行完成

在Order.Partial的部分成交状态,可能发生多次通知。在回测中broker不会看到该状态(在匹配时不考虑交易量),但这个情况肯定会实际broker中设置。

实际broker可能会在更新头寸之前触发一次或多次执行,这组执行将形成Order.Partial状态的部分通知。

实际的执行数据的属性:order.executed,该属性是OrderData类型的对象(请见下面的参考说明),通常的字段为size和price 。
创建时值存储在order.created中,在订单的整个生命周期中保持不变 。

3.订单状态值

  • Order.Created ,创建order实例时设置,最终用户永远看不到,除非order实例是手动创建的,而不是通过buy/sell/close创建
  • Order.Submitted ,订单实例传输到broker时设置,这仅意味着它已经被发送。在回测模式下,这将是即时操作,但真正的broker可能需要花费时间,broker可能会收到订单,并在order被转发到交易所时触发首次通知 。
  • Order.Accepted ,broker接受了订单,订单在系统中(或已经在交易所中)等待,根据执行类型、规模、价格和有效性等设定参数执行 。
  • Order.Partial ,订单已部分执行。order.executed包含当前的填充大小和平均价格。 order.executed.exbits包含详细说明部分ExecutionBits 的完整列表 。
  • Order.Complete ,order全部以均价成交 。
  • Order.Rejected ,broker 拒绝订单。broker可能不接受某个参数(如:确定其生命周期的有效参数),无法接受订单。
    原因将通过策略的notify_store方法通知。虽然这看起来很奇怪,现实生活中的broker会通过事件通知,该事件可能与订单直接相关,也可能不相关。但可以在notify_store中看到来自broker的通知。 在回测broker中看不到此状态。
  • Order.Margin ,订单执行意味着保证金追缴,之前接受的订单从系统中删除,(保证金不足的情况)。
  • Order.Cancelled / Order.Canceled ,用户请求取消订单的确认, 必须考虑到通过策略的cancel方法取消订单的请求并不能保证取消。订单可能已经执行,但broker可能尚未通知这种执行和/或通知,可能尚未通过策略发布。(下达取消订单的时候,不能确定订单是否被执行)。
  • Order.Expired ,之前接受的订单已过期,并从系统中删除 。

4.Order相关类

对象是backtrader生态系统中的通用类,当与其他broker共同操作时,它们可能被扩展和/或包含额外的嵌入信息。请参考相关的broker。
class backtrader.order.Order()

方法,见上。
属性:

  • ref: 唯一标识
  • created: OrderData 包括的创建数据
  • executed: OrderData 包括的执行数据
  • info: 通过方法addinfo()增加的用户信息,它以OrderedDict的形式保存,ordereddict已被子类化,因此也可以使用“.”指定内容标识 。

用户方法:

  • isbuy(): 如果是buy订单,返回bool值
  • issell(): 如果是sell订单,返回bool值
  • alive(): 如果订单状态是Partial 或 Accepted ,返回bool值

5.backtrader.order.OrderData

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)

保存用于创建和执行的实际order数据。
在order创建的情况下是提出的请求,在order执行的情况下是输出实际结果。

属性:

  • exbits : OrderData可迭代的OrderExecutionBits类。
  • dt: datetime (float) 创建或执行的时间
  • size: 创建请求order的数量,或执行order的数量
  • price: 执行价格,注:如果没有给出价格,也没有给出价格限制,将使用订单创建时的收盘价作为参考 。
  • pricelimit: 设置StopLimit的价格限制(首先被触发)
  • trailamount: 跟踪止损中的绝对价格距离 ??
  • trailpercent: 跟踪止损中的绝对价格百分比 ??
  • value: 持仓的市场价格
  • comm: 执行的佣金
  • pnl: NPL(Net Profit and Loss)代表净盈亏,交易过程中净盈亏 (如果平仓后)
  • margin: 保证金,确保order能执行(如果有要求)。
  • psize: 当前持仓量
  • pprice: 当前未平仓价格

6.backtrader.order.OrderExecutionBit

class backtrader.order.OrderExecutionBit(dt=None, size=0, price=0.0, closed=0, closedvalue=0.0, closedcomm=0.0, opened=0, openedvalue=0.0, openedcomm=0.0, pnl=0.0, psize=0, pprice=0.0)

用于保存订单执行的信息。“bit”并不决定订单是否已经完全/部分执行,它只是保存信息。

属性:

  • dt: datetime (float) 执行时间
  • size: 执行数量
  • price: 执行价格
  • closed: 在已存在的仓位,执行平仓的数量
  • opened: 执行新开仓的数量
  • openedvalue: 开仓的市值 market value of the “opened” part
  • closedvalue: 平仓的市值 market value of the “closed” part
  • closedcomm: 平仓的佣金 commission for the “closed” part
  • openedcomm: 开仓的佣金 commission for the “opened” part
  • value: 整个持仓市值 market value for the entire bit size
  • comm: 整个交易的佣金 commission for the entire bit execution
  • pnl: 本交易的净盈亏(已平仓) pnl generated by this bit (if something was closed)
  • psize: 当前开仓仓位 current open position size
  • pprice: 当前开仓价格 current open position price
  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值