Backtrader交易基础2

68 篇文章 14 订阅
13 篇文章 22 订阅

成交价格确定:

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( ...) # 买入、做多 long
        self.order = self.sell(...) # 卖出、做空 short
        self.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:订单已到期,其已经从系统中删除 。    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值