Backtrader 文档学习-Bracket Orders
1. 概述
组合订单类型是一个非常宽泛的订单类别,只要brokder支持的订单类型都可以,
包括(Market, Limit, Close, Stop, StopLimit, StopTrail, StopTrailLimit, OCO)。
该功能用于回测,交互broker
Bracket订单不是单个订单,而是由3个订单组成,考虑多头情况。
- 一个主要的买入订单,通常设置为限价或止损限价订单。
- 一个低位卖出订单,通常设置为止损单以限制损失。(止损单)
- 一个高位卖出订单,通常设置为限价单以获利。(止盈单)
相反如果是空头情况,有相应的卖出和2个买入订单。
低/高位订单实际上在主订单周围创建了一个bracket。
从逻辑上讲,以下规则适用:
- 3个订单是同时提交的,以避免其中任何一个单独触发
- 低/高侧订单被标记为主订单的子订单
- 子订单在主订单被执行之前不会被激活
- 主订单的取消同时取消了低端和高端的子订单
- 一旦激活,任何低/高端的订单的执行或取消都会自动取消另外的订单
2.使用模式
创建Bracket订单集有两种可能性 :
- 单次触发3个订单
- 手动触发3个订单
(1) 单次触发Bracket订单
要控制bracket订单,backtrader在
strategy
中提供了2个新的方法:
buy_bracket 和 sell_bracket
下面一条语句返回一个包含3个订单组合
brackets = self.buy_bracket(limitprice=14.00, price=13.50, stopprice=13.00)
注意上面参数 stopprice 和 limitprice 如何环绕在 price 周围。
实际成交的数据默认是data0,成交数量由默认的sizer自动计算得到。除了可以指定这两个参数,也可以指定其他参数,执行精细控制。
因为当发出sell_bracket订单时,低端和高端将被转向,参数的命名遵循常规stop 和 limit 。
- 代码返回list,list中包含3个订单[main, stop, limit]。
- 因为当生成一个sell_bracket订单,low和high会环绕在price两边,参数的命名遵循stop和 limit的约定。
- stop意味着止损(低的一侧是买入,高的一侧是卖出)
- limit意味着止盈(高的一侧是买入,低的一侧是卖出)
(2)手工触发Backet订单
涉及到3个订单的生成,通过transmit和parent参数实现。规则:
- 主端订单必须首先创建,并且传入transmit=False
- 低/高侧订单必传入parent=main_side_order
- 要创建的第一个低/高侧订单必须传入transmit=False
- 最后一个要创建的命令(低位或高位)设置transmit=True
测试用例:
mainside = self.buy(price=13.50, exectype=bt.Order.Limit, transmit=False)
lowside = self.sell(price=13.00, size=mainside.size, exectype=bt.Order.Stop,
transmit=False, parent=mainside)
highside = self.sell(price=14.00, size=mainside.size, exectype=bt.Order.Limit,
transmit=True, parent=mainside)
- 保持跟踪主侧订单,标识它是其他订单的父订单
- 控制传输,以确保只有最后一个订单会被联合触发
- 定义执行类型
- 定义低位和高位的size
由于size必须相同。如果没有手工指定参数,最终用户引入了sizer,那么sizer实际上可以为订单指示不同的值。这就是为什么必须先设置主侧订单后手动添加到调用中。
3. 示例
交易核心代码
o1 exectype=bt.Order.Limit 主单
o2 exectype=bt.Order.Stop 止损单
o3 exectype=bt.Order.Limit 止盈单
if self.cross > 0.0