订单执行原则
通常订单可分类为 市价单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 20