【答读者问44】backtrader中如何根据订单的order_id查找包括订单状态在内的订单信息?
作者:yunjinqi 类别:
日期:2022-03-20 12:36:52
阅读:1667 次 消耗积分:0 分
在前面的教程和答读者问中,已经对如何使用order做了一些介绍,先梳理一下order相关的文章
18、backtrader的一些基本概念—order包含哪些信息(1)?
19、backtrader的一些基本概念—order有哪些类型(2)?
20、backtrader的一些基本概念—创建订单的时候使用到的参数?
21、backtrader的一些基本概念—市价单(market order)的创建和撮合逻辑
24、backtrader的一些基本概念—限价单(limit order)的创建和撮合逻辑
26、backtrader的一些基本概念-市价止损单(stop_order)与限价止损单(stop limit order)的创建和撮合逻辑
27、backtrader的一些基本概念—收盘价订单(close order)的创建和撮合逻辑
28、backtrader的一些基本概念—目标订单(target order)的创建和撮合逻辑
29、backtrader的一些基本概念—成交一个取消其他订单(OCO order)的创建和撮合逻辑
32、backtrader的一些基本概念—一篮子订单(Bracket Orders)的创建和撮合机制
33、backtrader的一些基本概念—跟踪止损订单(StopTrail)的创建及撮合机制(2021-12-17更新)
44、backtrader的一些基本概念—Cheat-On-Open的使用方法
【答读者问29】如何在backtrader的策略下不同的订单?
如何根据order_id查找到具体的订单并获取订单相关的信息呢?
这个问题是这篇文章的核心。首先需要更正的是,在backtrader中的order属性中,其实是不存在order_id这个属性的,等价的属性是ref,ref是订单的标识符,同一个订单ref相同,不同的订单ref不同,所以查找订单需要使用ref来查找。
首先,我们需要获取预计要查找的订单都有哪些。如果需要全部的订单,可能需要自己在初始化的时候设置一个容器,比如设置一个字典或者列表进行保存;如果仅仅是想要查找没有完全成交的订单,可以使用self.broker.get_orders_open()
获取。
然后,根据自己的target_order_ref,循环要查找的订单,如果order.ref等于自己的target_order_ref,那么,这个order就是自己想要查找的order,然后再根据这个order获取相应的信息就好了。
关于订单状态,一般比较常用的下面的几个,这些order的判断方法也可以用到next中根据订单的状态不断调整订单。
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
# order被提交和接受
return
# 订单被拒绝
if order.status == order.Rejected:
self.log(f"Rejected : order_ref:{order.ref} data_name:{order.p.data._name}")
# 保证金不足
if order.status == order.Margin:
self.log(f"Margin : order_ref:{order.ref} data_name:{order.p.data._name}")
# 订单被取消
if order.status == order.Cancelled:
self.log(f"Concelled : order_ref:{order.ref} data_name:{order.p.data._name}")
# 部分成交
if order.status == order.Partial:
self.log(f"Partial : order_ref:{order.ref} data_name:{order.p.data._name}")
# Check if an order has been completed
# Attention: broker could reject order if not enougth cash
# 完全成交
if order.status == order.Completed:
# 订单是否是买
if order.isbuy():
self.log(f" BUY : data_name:{order.p.data._name} price : {order.executed.price} , cost : {order.executed.value} , commission : {order.executed.comm}")
else: # Sell
self.log(f" SELL : data_name:{order.p.data._name} price : {order.executed.price} , cost : {order.executed.value} , commission : {order.executed.comm}")
在order系列文章中,第一篇,我已经使用了dir(order)获取了order包含的属性和方法,如下的列表所示,这里面包含order能够获取的所有信息。
# dir(order)['Accepted','Buy','Canceled','Cancelled','Close','Completed','Created','DAY','ExecType','ExecTypes','Expired','Historical','Limit','Margin','Market','OrdTypes','Partial','Rejected',
'Sell','Status','Stop','StopLimit','StopTrail','StopTrailLimit','Submitted','T_Close','T_Date',
'T_Day','T_None','V_None','__class__','__delattr__','__dict__','__dir__','__doc__','__eq__',
'__format__','__ge__','__getattr__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__',
'__repr__','__setattr__','__setattribute__','__sizeof__','__slotnames__', '__str__',
'__subclasshook__','__weakref__','_active','_getplimit','_limitoffset','_plimit','_setplimit','accept','activate','active','addcomminfo', 'addinfo','alive','broker','brokerstatus','cancel',
'clone','comminfo','completed','created','dteos','exectype','execute','executed','expire',
'frompackages','getordername','getstatusname','info','isbuy','issell','margin','ordtype',
'ordtypename', 'p','packages','params','partial','plen','plimit','position','ref','refbasis',
'reject','setposition','status','submit','trailadjust','triggered']
在backtrader源码解析中order部分,会详细讲解order中每个属性和方法的意义。