成交价格确定:
Order.Market
市价单,以当时市场价格成交的订单,不需要自己设定价格。市价单能被快速达成交易,防止踏空,尽快止损/止盈;
按下一个 Bar (即生成订单的那个交易日的下一个交易日)的开盘价来执行成交;
例:self.buy(exectype=bt.Order.Market) 。
Order.Close
和 Order.Market 类似,也是市价单,只是成交价格不一样;
按下一个 Bar 的收盘价来执行成交;
例:self.buy(exectype=bt.Order.Close) 。
Order.Limit
限价单,需要指定成交价格,只有达到指定价格(limit Price)或有更好价格时才会执行,即以指定价或低于指点价买入,以指点价或更高指定价卖出;
在订单生成后,会通过比较 limit Price 与之后 Bar 的 open\high\low\close 行情数据来判断订单是否成交。
如果下一个 Bar 的 open 触及到指定价格 limit Price,就以 open 价成交,订单在这个 Bar 的开始阶段就被执行完成;
如果下一个 Bar 的 open 未触及到指定价格 limit Price,但是 limit Price 位于这个 bar 的价格区间内 (即 low ~ high),就以 limit Price 成交;
例:self.buy(exectype=bt.Order.Limit, price=price, valid=valid) 。
Order.Stop
止损单,需要指定止损价格(Stop Price),一旦股价突破止损价格,将会以市价单的方式成交;
在订单生成后,也是通过比较 Stop Price 与之后 Bar 的 open\high\low\close 行情数据来判断订单是否成交。
如果下一个 Bar 的 open 触及到指定价格 limit Price,就以 open 价成交;如果下一个 Bar 的 open 未触及到指定价格 Stop Price,
但是 Stop Price 位于这个 bar 的价格区间内 (即 low ~ high),就以 Stop Price 成交;
例:self.buy(exectype=bt.Order.Stop, price=price, valid=valid) 。
Order.StopLimit
止损限价单,需要指定止损价格(Stop price)和限价(Limit Price),一旦股价达到设置的止损价格,将以限价单的方式下单;
在下一个 Bar,按 Order.Stop 的逻辑触发订单,然后以 Order.Limit 的逻辑执行订单;
例:self.buy(exectype=bt.Order.StopLimit, price=price, valid=valid, plimit=plimit)。
Order.StopTrail
跟踪止损订单,是一种止损价格会自动调整的止损单,调整范围通过设置止损价格和市场价格之间的差价来确定。
差价即可以用金额 trailamount 表示,也可以用市价的百分比 trailpercent 表示;
如果是通过 buy 下达了买入指令,就会“卖出”一个跟踪止损单,在市场价格上升时,止损价格会随之上升;
若股价触及止损价格时,会以市价单的形式执行订单;若市场价格下降或保持不变,止损价格会保持不变;
如果是通过 sell 下达卖出指令,就会“买入”一个跟踪止损单,在市场价格下降时,止损价格会随之下降;
若股价触及止损价格时,会以市价单的形式执行订单;但是当市场价格上升时,止损价格会保持不变;
例:self.buy(exectype=bt.Order.StopTrail, price=xxx, trailamount=xxx)。
Order.StopTrailLimit
跟踪止损限价单,是一种止损价格会自动调整的止损限价单,订单中的限价 Limit Price 不会发生变动,止损价会发生变动,变动逻辑与上面介绍的跟踪止损订单一致;
例:self.buy(exectype=bt.Order.StopTrailLimit, plimit=xxx, trailamount=xxx) 。
交易函数:
1.常规下单函数
Strategy 中的常规下单函数主要有 3 个:买入 buy() 、卖出 sell()、平仓 close() ,
它们的调用方式非常简单,大家也经常在案例中看到,交易函数会返回订单 Order 实例,通常会赋值给对象self.order :
class TestStrategy(bt.Strategy):def next(self):self.order = self.buy( ...) # 买入、做多 longself.order = self.sell(...) # 卖出、做空 shortself.order = self.close(...) # 平仓 cover
参数说明:
调用的 buy、sell、close 方法中支持设置的参数有:
data(默认: None):用于指定给哪个数据集(即哪个证券)创建订单,默认为 None,表示给第 1 个数据集(self.datas[0] 、self.data0 对应的证券)创建订单。
size(默认: None):订单委托数量(正数),默认为 None,表示会自动通过 getsizer 获取 sizer 。
price(默认: None):订单委托价, None 表示不指定具体的委托价,而是由市场决定最终的成交价,适用于市价单;对于限价单、止损单和止损限价单,price 就是触发订单执行的那个价格 。
plimit(默认: None):仅适用于 StopLimit 订单,用于指定 StopLimit 订单的限价 Limit Price 为多少。
exectype (默认: None):执行的订单类型,None 表示按市价单执行,可选的类型有:
1. Order.Market 市价单,回测时将以下一个 bar 的开盘价执行的市价单 ;
2. Order.Close 市价单,回测时将以下一个 bar 的收盘价执行的市价单;
3. Order.Limit 限价单;
4. Order.Stop 止损单;
5. Order.StopLimit 止损现价单;
6. Order.StopTrail 跟踪止损订单;
7. Order.StopTrailLimit 跟踪止损限价单。
valid(默认: None):订单有效期,可选取值有:
1. None 表示订单在完成成交或被撤销之前一直都有效(aka Good till cancel or match);
2. datetime实例、date 实例、数值形式的日期,表示订单在设置的 date 之前有效,date 之后会被撤销(aka good till date);
3. Order.DAY 、0 、imedelta(),表示订单当日有效,未成交的订单将在当日收盘后被自动撤销(aka day order)。
tradeid(默认: None):当同一资产出现重复交易的时候,通知订单状态更改时,tradeid 会被传递给 Strategy。
**kwargs:通过传入其他参数,生成特定类型的订单 。
2.目标下单函数
目标下单函数包括按目标数量下单、按目标金额下单、按目标百分比下单,这些下单函数会根据设置的目标来选择买卖方向:
class TestStrategy(bt.Strategy):def next(self):# 按目标数量下单self.order = self.order_target_size(target=size)# 按目标金额下单self.order = self.order_target_value(target=value)# 按目标百分比下单self.order = self.order_target_percent(target=percent)
参数说明:
order_target_size:按目标数量下单,按“多退少补”的原则,让证券的持仓数量等于设定的目标数量 target :
如果目标数量 target 大于当前持仓数量,则会发出买入订单,补足持仓量,例如:
当前持仓量 size=0, 目标持仓量 target=7 -> 买入订单,买入数量 size=7-0=7;
当前持仓量 size=3, 目标持仓量 target=7 -> 买入订单,买入数量 size=7-3=4;
当前持仓量 size=-3, 目标持仓量 target=7 -> 买入订单,买入数量 size=7-(-3)=10。
如果目标数量 target 小于当前持仓数量,则会发出卖出订单,减少持仓量,例如:
当前持仓量 size=0,目标持仓量 target=-7 -> 卖出订单,卖出数量 size=0-(-7)=7;
当前持仓量 size=3, 目标持仓量 target=-7 -> 卖出订单,卖出数量 size=3-(-7)=10;
当前持仓量 size=-3, 目标持仓量 target=-7 -> 卖出订单,卖出数量 size=-3-(-7)=4。
order_target_value:按目标金额下单,通过比较目标金额与当前持仓额和持仓方向,确定最终买卖买卖方向:(持仓量默认使用当前 Bar 的 close 进行计算,然后以下一根 bar 的开盘价进行交易)
如果当前持有的是空单(size<0):
若目标金额 target > 当前持仓额 -> 卖出;
若目标金额 target < 当前持仓额 -> 买入。
如果当前无持仓或持有的是多单(size>=0):
若目标金额 target > 当前持仓额 -> 买入;
若目标金额 target < 当前持仓额 -> 卖出。
order_target_percent:按目标百分比下单,订单生成逻辑同 order_target_value,目标金额 = 目标百分比 * 当前账户的总资产。
取消订单
交易函数用于生成订单,返回 Order 对象,如果想要取消生成的订单,就可以通过 cancel() 方法来取消:
通过 cancel() 来取消订单 :self.cancel(order);
通过 Broker 来取消订单 :self.broker.cancel(order) 。
订单组合:
buy_bracket()
buy_bracket() 用于long side 的交易场景,买入证券后,在价格下跌时,希望通过止损单卖出证券,限制损失;
在价格上升时,希望通过限价单卖出证券,及时获利,通过 buy_bracket() 可以同时提交上述 3 个订单,而无需繁琐的调用 3 次常规交易函数。
# 函数可用参数
buy_bracket(# 主订单的参数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):......# 调用示例
brackets = self.buy_bracket(price=13.50,limitprice=14.00,stopprice=13.00)
# 主订单以 13.5 的价格买入 self.data0 数据集对应的标的
# 当价格超过 14.00 时,会触发止盈单,卖出标的
# 当价格跌破 13.00 时,会触发止损单,卖出标的
参数说明:
从 buy_bracket 的可用参数可知:
data=None,默认是对 data0 数据集对应的证券标的进行交易;
主订单:为买入单,默认为 Order.Limit 限价单,可通过参数 price 设定成交价,也可通过参数 plimit 设置指定价 limit;主订单通常设置为 Order.Limit 限价单 或 Order.StopLimit 止损限价单;
止损单:为卖出单,用于及时止损,默认为 Order.Stop 止损单,可通过参数 stopprice 设置止损价,参数 stopargs 中还可设置止损单相关的其他参数;
止盈单:为卖出单,用于及时止盈,默认为 Order.Limit 限价单,可通过参数 limitprice 设置指定价格,参数 limitargs 中还可设置限价单相关的其他参数。
sell_bracket()
sell_bracket() 用于short side 的交易场景,卖出证券做空后,在价格上升时,希望通过止损单买入证券,限制损失;
在价格下降时,希望通过限价单买入证券,及时获利,sell_bracket() 也是一次同时提交上述 3 个订单 。
# 函数可用参数
sell_bracket(# 主订单设置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):# 调用示例
brackets = self.sell_bracket(price=13.50,limitprice=13.00,stopprice=14.00)
# 主订单以 13.5 的价格卖出 self.data0 数据集对应的标的
# 当价格跌破 13.00 时,会触发止盈单,买入标的,获得套利收益
# 当价格超过 14.00 时,会触发止损单,买入标的,及时止损
Broker 中的交易执行
Broker 在执行交易时,会根据执行流程给订单赋予不同的状态,不同阶段的订单状态可以通过Strategy 中定义 notify_order() 方法来捕获,
从而进行自定义的处理,从下达交易指令到订单执行结束,订单可能会依次呈现如下状态:
Order.Created:订单已被创建;
Order.Submitted:订单已被传递给经纪商 Broker;
Order.Accepted:订单已被经纪商接收;
Order.Partial:订单已被部分成交;
Order.Complete:订单已成交;
Order.Rejected:订单已被经纪商拒绝;
Order.Margin:执行该订单需要追加保证金,并且先前接受的订单已从系统中删除;
Order.Cancelled (or Order.Canceled):确认订单已经被撤销;
Order.Expired:订单已到期,其已经从系统中删除 。