Backtrader-Orders
backtrader
翻译:order
部分
Cerebro
是backtrader
的重要的控制系统,Strategy
的子类是终端用户的关键控制点。后者需要一种链接方法来连接到系统的其他部分,这也就是订单orders发挥重要作用的地方。
Orders将Strategy
中的逻辑制定的决策翻译成代理人可执行某个行为的合适的信息。通过以下来完成:
- 创建
通过Strategy提供的方法:buy
,sell
以及close
将会返回一个订单实例作为引用。 - 取消
通过Strategy提供的方法:cancel
,这将会提供一个订单的实例来操作。
orders还充当返回给用户的通信方法,来通知代理人事情如何运行。
- 通知
策略方法:notify_order
将会报告order
实例
订单创建
当调用buy
,sell
以及close
时,下面的参数将会应用到创建中:
data
(默认:None
)
对于订单创建的数据,如果None
,则使用系统中的第一个数据,self.datas[0]
或self.data0
,也就是self.data
将会使用。size
(默认:None
)
用于订单数据单位的大小。Price
(默认:None
)
使用价格(如果它不符合最小的报价单价要求,在实际中代理人可能对实际格式施加限制)
None
对于Market
和Close
订单有效(市场影响价格)
对于Limit
,Stop
和StopLimit
订单,这个值决定了触发点(在Limit
中,触发点是明显的价格订单匹配的价格)。plimit
(默认:None
)
仅适用于StopLimit
订单。一旦Stop
被触发(price
已被使用),这就是设置的隐含的Limit
订单价格。exectype
(默认:None
)
可取的值:Order.Market
或None
。一个市场订单将使用下一个可能的价格执行。在回测中,他将会使下一个bar的开盘价。Order.Limit
。订单只在给定的price
或更好的情况下才会执行。Order.Stop
。订单在price
触发并像Order.Market
执行一个订单。Order.StopLimit
。订单在price
触发并执行隐含限制订单,price
由pricelimit
提供。
valid
(默认:None
)
可能的值:None
:这会生成一个不会过期的订单(又称Good till cancel,取消前有效)并且保留在市场中直到匹配或者取消。在实际中代理人代理人倾向于提出一个时间限制,但是这个限制通常是如此遥远,以至于可以认为它不会过期。datetime.datetime
或datetime.date
实例:date将用来生成一个订单,到给定日期前有效(又称good till date)。Order.DAY
或0
或者timedelta()
:生成一个日期,有效直到End of the Session(又称day order)。numeric value
:这是假设概述值与mapplotlib
编码的日期相对应的,并且将会用来生成一个订单,直到这个时间都有效。
tradeid
(默认:0
)
这是一个由backtrader
应用的内部数值来朱总在重复资产上的重叠交易。当通知订单状态发生变化时,tradeid
发送回strategy。**kwargs
:额外的代理人实现可能支持额外的参数。backtrader
将会向下传递kwargs到创建的订单对象中。
举例:如果这4个订单执行类型直接被backtrader
支持是不够的,在这种情况下,比如Interactive Brokers将会传递看参数:
orderType='LIT', lmtPrice=10.0, auxPrice=9.8
close
方法将会检查现在的仓位并且相应的来使用buy
和sell
来有效的close平仓。size
也将会自动地计算除非订单通知
为了接收通知,notify_order
方法必须在用户Strategy
子类覆写(默认情况下什么也不做)。下面的可以应用到这些通知中:
- 在策略的
next
方法调用前发出 - 对于在相同的next流程中带有相同或者不同状态的相同的order可能(以及将会)发生几次。
一个订单在next方法又调用一次时,它可能会提交给代理人以及可能被这个执行接收
在这个例子中最少发生3个status
的通知:Order.Submitted
因为订单被送到了代理人那Order.Accepted
因为订单被代理人接收并且等待后续的执行Order.Completed
因为在这个例子中,它快速的的匹配到了(价格)并且完全填充(这通常可能是Market
订单) 在Order.Partial
的情况下,在相同状态,通知可能发生多次。这个状态无法被策略中的代理人看到(匹配时不考虑交易量),但是他将会被代理人设置。
实际上的代理人在更新仓位前可能发出一次或多次执行,而且这一系列执行将会弥补Order.partial
通知。
实际的操作数据在属性中:order.executed
,他是OrderData
的对象,常用字段为size
和price
。
在创建时的数值被存储在了order.created
,这将会在order
的生命周期中保持不变
订单状态值
定义如下:
-
Order.Created
:当Order
实例被创建时设置。不能被终端用户查看,除非order
实例被手动的创建而非通过buy
,sell
和close
-
Order.Submitted
: 在订单实例已传输到经纪人时设置。这仅仅意味着订单已被发送。在回测模式中,这是一个即时的动作,但在实际经纪人情况下可能需要时间,可能在经纪人收到订单并转发给交易所时才会首先通知。 -
Order.Accepted
: 经纪人已经接受订单并且订单已经在系统中(或已在交易所)等待按照设定的参数(如执行类型、大小、价格和有效期)执行。 -
Order.Partial
: 订单已部分执行。order.executed 包含当前的已成交数量和平均价格。 -
order.executed.exbits
包含详细列出部分成交的所有 ExecutionBits 列表。 -
Order.Complete
: 订单已完全成交。 -
Order.Rejected
: 经纪人拒绝了订单。某个参数(例如,用于确定其生命周期的有效期)可能不被经纪人接受,导致订单无法被接受。
拒绝原因将通过策略的notify_store
方法通知。尽管这可能显得很尴尬,但原因是实际经纪人会通过一个事件通知这一点,这个事件可能与订单没有直接关系。但来自经纪人的通知仍然可以在notify_store
中看到。这种状态在回测经纪人中不会看到。 -
Order.Margin
: 订单执行将导致追加保证金要求,之前接受的订单已从系统中移除。 -
Order.Cancelled
(或Order.Canceled
): 用户请求取消的确认。
必须考虑,通过策略的cancel
方法请求取消订单并不保证取消。订单可能已经执行,但这种执行可能尚未被经纪人通知,或者通知可能尚未传递给策略。 -
Order.Expired
: 先前接受的订单具有时间有效性,已过期并从系统中移除。