在前两节中,介绍了order 使用 dir(order)之后看到的方法和属性,尤其是在 order 里面发现了 order 相关的数据;然后,基于市场微观结构的角度上,简单分析了市价单和限价单及其区别,这节主要分析下 backtrader 的几种订单类型的区别及使用方法。
在《订单的一些基本信息》里面,分享了开平的一些基本方法,使用 self.buy,self.sell,self.close,每个函数使用的时候都需要用到响应的参数。
-
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
-
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