【答读者问44】backtrader中如何根据订单的order_id查找包括订单状态在内的订单信息?
作者:yunjinqi   类别:    日期:2022-03-20 12:36:52    阅读:1120 次   消耗积分: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中每个属性和方法的意义。


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/94
上一篇:【答读者问43】再谈不复权、前复权、后复权、定点复权在回测与实盘中的应用
下一篇:【答读者问45】谈一谈扩展backtrader中用于回测数据的列的问题(入门级别难度)