天天看点

backtrader FAQ:什么是一篮子订单Bracket Orders optMaster

完整教程见这里。

一篮子订单并非一个单一订单,而是三个订单组合起来的,其中一个是主订单,另外两个一是针对主订单的止损保护单,二是针对主订单的获利了结单。

我们考虑一个做多的场景:这种场景下,我们想买入股票(创建买单),但是又希望在股价下跌时通过止损卖单限制损失,并且希望股价上升到目标价后卖出股票获利了结。因此,当下达一个主买单后,同时下达一个止损卖单保护自己,再同时下达一个获利了结卖单保护利润,说明如下:

  • 一个主买单buy,默认是限价单Limit,要设置主限制价price(相当于进入市场价格)。此单称为main单。
  • 一个子卖单sell,默认为停损单Stop,限制损失,要设置子停损价stopprice。此单称为stop单。
  • 再一个子卖单sell,默认为限价单Limit,以获利离场,要设置子限制价(即获利了结价)limitprice。此单称为limit单。

以上三个价格的关系是:stopprice(止损价)<price(进入价)<limitprice(获利了结价)。

这3个订单一起提交,主订单执行后,两个子订单才激活(激活前不执行)。若主单取消,则子单自动取消。激活的子单中任意一个执行或取消将导致另一个自动取消。

以下是代码例子:

brackets = self.buy_bracket(limitprice=14.00, price=13.50, stopprice=13.00)
           

返回值brackets 是一个列表[main, stop, limit],记录了三个订单的引用。

该方法的签名如下:

buy_bracket(self, data=None, size=None, price=None, plimit=None,# 主买单设置
                    exectype=bt.Order.Limit, valid=None, tradeid=0,
                    trailamount=None, trailpercent=None, oargs={},
                    stopprice=None, stopexec=bt.Order.Stop, stopargs={},# 止损卖单设置
                    limitprice=None, limitexec=bt.Order.Limit, limitargs={},# 获利了结卖单设置
                    **kwargs):
           

如果是做空的场景,那么命令是self.sell_bracket(),它用于发布一个主卖单,一个止损保护买单和一个获利了结买单,此时三个价格的关系是:

stopprice(止损价)>price(进入价)>limitprice(获利了结价),例子如下:

self.sell_bracket(limitprice=short_tp, price=entry, stopprice=short_stop, exectype=bt.Order.Limit)
该方法的签名如下:
sell_bracket(self, data=None,size=None, price=None, plimit=None,# 主卖单设置
                     exectype=bt.Order.Limit, valid=None, tradeid=0,
                     trailamount=None, trailpercent=None,
                     oargs={},
                     stopprice=None, stopexec=bt.Order.Stop, stopargs={},# 止损买单设置
                     limitprice=None, limitexec=bt.Order.Limit, limitargs={},# 获利了结买单设置
                     **kwargs):
           

如果你想看详细的使用案例代码,参考这里。