Skip to content

Latest commit

 

History

History
145 lines (92 loc) · 7.97 KB

File metadata and controls

145 lines (92 loc) · 7.97 KB

20、backtrader 的一些基本概念---创建订单的时候使用到的参数?

原文:https://yunjinqi.blog.csdn.net/article/details/111500298

在前两节中,介绍了order 使用 dir(order)之后看到的方法和属性,尤其是在 order 里面发现了 order 相关的数据;然后,基于市场微观结构的角度上,简单分析了市价单和限价单及其区别,这节主要分析下 backtrader 的几种订单类型的区别及使用方法。

创建订单的时候使用到的参数

《订单的一些基本信息》里面,分享了开平的一些基本方法,使用 self.buy,self.sell,self.close,每个函数使用的时候都需要用到响应的参数。

  1. order 的参数,self.buy 和 self.sell 类似,以 self.buy 为例。

    def buy(self, data=None,
                size=None, price=None, plimit=None,
                exectype=None, valid=None, tradeid=0, oco=None,
                trailamount=None, trailpercent=None,
                parent=None, transmit=True,
                **kwargs):
            '''self.buy 是创建一个多头开仓的 order 或者空头平仓的 order
    
              - ``data`` (default: ``None``)
    
                data 代表买卖那个品种,默认是 None,如果是默认的话,就是加载到系统的第一个数据;
    
              - ``size`` (default: ``None``)
    
                size 代表买卖的数量是多少,大小需要是正数,但是多少没有限制,小数也可以。一般情况下,股票需要 100 股,期货需要 1 手,都是需要整数。
                如果 size 是默认的话,就会通过 getsizer 获取下单的大小。
    
              - ``price`` (default: ``None``)
              	下单时使用的价格。实盘的时候,交易所可能对于价格的格式有限制,如果不符合响应的格式等标准,可能造成下单失败。
    
                price 的默认值是 None,可以用在市价单和收盘订单(close orders),这两种订单的价格是市场决定的,不用人为限定。
    
                当 order 类型是限价单、止损单、止损限价单的时候,这个价格是触发价格;如果是限价单,这个价格就是触发价格,回测的时候在这个价格成交,实盘交易的时候以不次于这个价格成交(等于或者优于这个价格)
    
              - ``plimit`` (default: ``None``)
    
              plimit 只应用于止损限价单,前一个 price 是用于成交的时候的价格,市价,收盘价或者限价。这个 plimit 用于当已经存在交易,止损条件被触发之后,用于限价止损。
    
              - ``trailamount`` (default: ``None``)
              trailamount 应用于跟踪止损市价单或者跟踪止损限价单,这个参数是一个止损区间的大小,当持有多头的时候,一般是最高价到减去这个参数,就是止损线,如果价格跌破这个止损线,就会触发止损;如果持有空头的时候,一般是开仓之后的最低价加上这个参数的大小,就是相应的止损线,如果价格在这个止损线的上方,就会触发止损。
    
              - ``trailpercent`` (default: ``None``)
    
                trailpercent 应用于跟踪止损市价单或者跟踪止损限价单,这个参数是一个止损区间的大小,当持有多头的时候,一般是最高价到减去一定比例的最高价,就是止损线,如果价格跌破这个止损线,就会触发止损;如果持有空头的时候,一般是开仓之后的最低价加上一定比例的最高价,就是相应的止损线,如果价格在这个止损线的上方,就会触发止损。
    
              - ``exectype`` (default: ``None``)
    
                执行类型的值:
    
                - ``Order.Market`` or ``None``. 市价单或者 None,在回测的时候,将会在下个 bar 撮合成交,在交易的时候,将会在下个 tick 撮合成交。
    
                - ``Order.Limit``. 限价单,将会在一个不次于限定价的价格成交(等于或者优于)。
    
                - ``Order.Stop``. 止损单,将会在 price 的时候被触发,并以市价单成交。不怎么用这个,还没有验证过被触发过后,回测的时候,是不是在下个 bar 的 open 价格成交,如果是这样的话,回测就比较不准。实盘推测起来应该问题不大。关于这个,稍后会写的小策略去验证一下。
    
                - ``Order.StopLimit``. 止损限价单,这个会在 price 被触发之后,等待 plimit 被触发之后成交。
    
                - ``Order.Close``. 收盘价订单,将会在 close 的时候成交,稍后验证下,是在这个 close 成交还是在下个 close 成交。
    
                - ``Order.StopTrail``. 跟踪止损市价单。
    
                - ``Order.StopTrailLimit``. 跟踪止损限价单
    
              - ``valid`` (default: ``None``)
    
                订单有效期的取值:
    
                  - ``None``: 直到自己取消或者交易所取消,如果没有成交的话,这个订单会一直有效。
    
                  - ``datetime.datetime`` or ``datetime.date`` instance: 到时间前有效
    
                  - ``Order.DAY`` or ``0`` or ``timedelta()``: 当日有效
    
                  - ``numeric value``: 用数字代表时间,到时间前有效
    
              - ``tradeid`` (default: ``0``)
    
                这是 backtrader 的内部的值,用来跟踪在同一资产上的不同的有重叠的交易。traderid 在 notify 订单的状态改变的时候,会被送到 strategy
    
              - ``oco`` (default: ``None``)
    
                实现 oco 订单的时候使用的参数
    
              - ``parent`` (default: ``None``)
                 一篮子订单的时候使用,用于控制这一篮子订单,只有这个 parent 订单成交了之后,另外一个止盈和止损订单才会成交;如果这个 parent 的订单被取消了,这两个止盈止损的也会被取消。
    
              - ``transmit`` (default: ``True``)
    
                用于控制一篮子订单的下单顺序,transmit 只能一个为正,并且是止盈止损中的一个;transmit 是正数的时候,这个订单最后一个下。
    
              - ``**kwargs``: 其他的一些额外参数。
    
            Returns:
              - 下单之后,会返回一个提交之后的订单(the submitted order)。
    
            '''
            if isinstance(data, string_types):
                data = self.getdatabyname(data)
    
            data = data if data is not None else self.datas[0]
            size = size if size is not None else self.getsizing(data, isbuy=True)
    
            if size:
                return self.broker.buy(
                    self, data,
                    size=abs(size), price=price, plimit=plimit,
                    exectype=exectype, valid=valid, tradeid=tradeid, oco=oco,
                    trailamount=trailamount, trailpercent=trailpercent,
                    parent=parent, transmit=transmit,
                    **kwargs)
    
            return None 
  2. self.close

    def close(self, data=None, size=None, **kwargs):
            '''
            平仓,通过反向交易进行平仓。
    
            Note:
    		  - ``data``: 如果 data 没有指定,默认是 data0
              - ``size``: 如果不提供的情况下,会计算所有的可平的仓位,全部平掉
    
            Returns: the submitted order
            '''
            if isinstance(data, string_types):
                data = self.getdatabyname(data)
            elif data is None:
                data = self.data
    
            possize = self.getposition(data, self.broker).size
            size = abs(size if size is not None else possize)
    
            if possize > 0:
                return self.sell(data=data, size=size, **kwargs)
            elif possize < 0:
                return self.buy(data=data, size=size, **kwargs)
    
            return None