Backtrader(十三)- Order订单 -订单类型、订单执行逻辑

订单执行原则

通常订单可分类为 市价单Market、收盘价单Close、限价单Limit、止损单Stop、止损限价单StopLimit、止损跟踪单StopTrail、止损跟踪限价单StopTrailLimit,在用buy、sell方法创建订单时,exectype参数指明了创建的订单类型

1、当前数据已经产生,不能用于执行交易

def next(self):
	if self,data.close > self.sma:
		self.buy()

在这个逻辑中,如果当日收盘价close高于移动平均价,就创建买单。但是买单无法在当天以当天的收盘价执行,因为next方法中,close是已经发生的数据。因此只能用下一根bar的某个价位执行成交,成交价取决于order类型。
因此,订单的首个可执行的时间在下一根bar上

2、成交量不影响订单执行
在实际交易中,成交量是会影响交易的。如果交易员是在进行低流动性资产的买卖,或者在bar的极端点(最高点或最低点)进行的交易,成交量将影响实盘交易。
但是触及最高点或最低点是很少发生的,所以通常所选资产将有足够的流动性来吸引任何常规交易的指令,因此backtrader假设成交量不影响交易

注意:以上两个原则是默认行为,其实是可以改变的

不同类型订单的执行逻辑

Market 市价单

市价单以下一根实际bar的开盘价执行。假设5号通过buy创建了订单,迭代到了下一根实际bar,假设是6号,会以6号的开盘价执行订单,并触发 notify_order。

Close 收盘价单

收盘价单将以下一根bar的收盘价执行

Limit 限价单

在下一个bar,在给定的限制价位price或者更好的价位执行的订单。

以买单为例,如果下一个bar开盘价低于price,则以开盘价执行;若开盘价高于price同时,最低价低于price。卖单相反。

如果订单设置了 有效期,并且到了有效期仍然没有执行,则自动取消订单

2022-01-23 at 21:37:51|INFO|2021-10-18, Buy Create, exectype Limit, ClosePrice 14.99, OpenPrice 14.81, valid 2021-10-22, LimitPrice 14.5403
2022-01-23 at 21:37:51|INFO|2021-10-20, Buy DaY Open 15.1, Close 14.58, High 15.1, Low 14.53
2022-01-23 at 21:37:51|INFO|2021-10-20, Buy Executed Price 14.5403, Cost 14.5403, Comm 0.0145403

如上为backtrader创建并执行买单的运行日志:

从第一条日志获取到有用的内容:
在2021-10-18,创建了一个限价单,有效期到 2021-10-22,限制价格为14.5403
第二、三条日志:
当迭代到2021-10-20时,当天的开盘价15.1,收盘价14.58,最高价15.1,最低价14.53。说明当天,开盘价>限制价格>最低价格,则买单执行价格为限制价格。

Stop 止损单

在下一个bar,当资产触及设定止损价格price时,触发订单按市价单方式市价成交。

以买单为例,如果下一个bar开盘价向上突破大于等于止损price(相当于开盘突破),则以开盘价执行;若开盘价低于price,同时最高价向上突破大于等于price(相当于盘中突破),则以price价格执行买单。

这个逻辑说明这种买单在有空方仓位时可用于止损。如果订单设置了有效期,并且到了有效期仍未执行,则自动取消订单

如果没有空方仓位,这种买单的含义就不是止损,而是向上突破买入,也就是当价格向上突破price时,市价买入,所以这种订单更贴合本质的称呼应该是停止单,是基于突破某价位而执行的订单

止损卖单逻辑恰好相反,在有多方仓位时可用于止损。在下一个bar,如果开盘价向下突破低于止损价,则以开盘价执行;若开盘价高于止损价,同时最低价低于止损价,则卖单以止损价执行。当然,即使没有多方仓位,但在允许做空的情况下,也可以发出这种向下突破卖出的卖单

2022-01-23 at 21:51:22|INFO|2021-11-11, Buy Create, exectype Stop, ClosePrice 13.51, OpenPrice 13.02, valid 2021-11-15 StopPrice 13.9153
2022-01-23 at 21:51:22|INFO|2021-11-15, Buy DaY Open 13.58, Close 14.21, High 14.3, Low 13.58
2022-01-23 at 21:51:22|INFO|2021-11-15, Buy Executed Price 13.965300000000001, Cost 13.965300000000001, Comm 0.013965300000000002

从第一条日志获取到有用的内容:
在2021-11-11,创建了一个止损买单,有效期到 2021-11-15,限制价格为 13.9153
第二、三条日志:
当迭代到2021-11-15时,当天的开盘价13.58,最高价14.3,说明当天,开盘价<限制价格<最高价格,则买单执行价格为限制价格。

StopLimit 止损限价单

self.buy(
	exectype=bt.Order.StopLimit,
	price=10,  # 止损价
	plimit=10.5# 限价
)

当资产价格触及设定价格price,触发订单以限价plimit或更好的价格执行。

以买单为例,如果下一个bar开盘价高于止损价price,或开盘价低于price同时最高价高于price,则触发订单以限价单方式执行。注意对于买单来说,限价plimit必须设置为不小于触发价price

止损限价单卖单执行逻辑恰好相反,在下一个bar如果开盘价向下突破低于price,或开盘价高于price同时最低价低于price,则触发订单以Limit限价单方式执行。注意对于卖单来说,限价plimit必须设置为不大于触发价price

2022-01-23 at 22:13:53|INFO|2021-10-13, Buy Create, exectype StopLimit, ClosePrice 15.22, OpenPrice 14.28, valid 2021-10-17  LimitPrice 15.6766 StopPrice 15.372200000000001
2022-01-23 at 22:13:53|INFO|2021-10-14, Buy DaY Open 15.0, Close 15.23, High 15.58, Low 14.9
2022-01-23 at 22:13:53|INFO|2021-10-14, Buy Executed Price 15.422200000000002, Cost 15.422200000000002, Comm 0.015422200000000002

从第一条日志获取到有用的内容:
在2021-10-13,创建了一个止损限价买单,有效期到2021-10-17,限制价格为15.6766,止损价格为15.372200000000001
第二、三条日志:
当迭代到2022-01-14时,当天的开盘价15.0,最高价15.58,最低价14.9。说明当天,开盘价<止损价<最高价,触发执行限价单 -> 开盘价<限制价格<最低价,最终以限制价格成交。

StopTrail 止损跟踪单

百分比跟踪量
self.sell(
	exectype=bt.Order.StopTrail,
	trailpercent=0.05  # 百分比跟踪量
)

根据每个bar收盘价动态调整止损价,其余逻辑于Stop单一样。

以卖单止损为例子,先以当日收盘价计算止损价,迭代到次日若未成交,并且收盘价上升了,则动态调高止损价,否则不调整止损价,继续寻找卖出机会。

上面代码采用的是百分比跟踪量,执行逻辑是:
1、计算当日止损价

stop_price = 当日收盘价 *1-trailpercent)

2、迭代到下一根bar时,若开盘价低于止损价 stop_price ,则以开盘价执行卖单。若开盘价高于 stop_price 同时最低价低于stop_price,则以 stop_price 价格执行
3、若未触发执行,且收盘价比昨日上涨,则更新 stop_price

绝对跟踪量 trailamount
self.sell(
	exectype=bt.Order.StopTrail,
	trailamount=0.1  # 绝对跟踪量
)

止损价计算公式

stop_price = 当天收盘价 - trailamount

StopTrailLimit 止损跟踪限价单

self.sell(
	exectype=bt.Order.StopTrailLimit,
	trailamount=0.05,
	plimit=9.05
)

与止损跟踪单 StopTrail 一样,根据每个bar收盘价动态调整止损价,差别是一旦触发了止损价,则按限价单方式执行。

以卖单止损为例,先以当日收盘价计算止损价,迭代到次日若未成交,并且收盘价上升了,则动态调高止损价。否则不调整止损价,继续寻找卖出机会, 某天符合卖出条件(低于止损价),则按限价单的逻辑卖出。
注意:这里限价plimit是固定的,不会动态调整,另外要说明的是。backtrader内置的回测broker支持StopTrail 和 StopTrailLimit。但其他内置broker不支持。

你可能感兴趣的:(量化,python)