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