在前面的教程和答读者问中,已经对如何使用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中每个属性和方法的意义。
系统当前共有 426 篇文章