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 20
### backtrader 中的目标订单功能 `backtrager` 提供了一种灵活的方式来创建目标订单(Target Orders)。这些订单允许用户基于特定的价格水平或百分比来设置买入或卖出条件。通过 `buy()` 和 `sell()` 方法,以及附加参数如 `exectype=bt.Order.Limit` 或其他类型订单类型,可以实现目标订单的功能。 以下是关于如何在 `backtrader` 中实现目标订单的具体说明: #### 1. **目标订单的概念** 目标订单通常用于设定价格触发点,在达到某个预设价格时自动执行交易。这可以通过限价单(Limit Order)、止损单(Stop Order)或其他高级订单类型完成。Backtrader 的核心机制支持多种订单类型,并且能够通过回调函数动态调整策略逻辑[^1]。 #### 2. **实现方式** 为了实现目标订单,需要继承 `Strategy` 类并重写其方法。具体来说,可以在 `next()` 方法中调用 `buy()` 或 `sell()` 并传递相应的参数以指定订单类型和目标价格。 常见的订单类型包括: - **限价单 (Limit Order)**:当市场价格到达指定的限价时成交。 - **止损单 (Stop Order)**:当市场价格突破指定的止损价位时成交。 - **止损限价单 (Stop-Limit Order)**:结合止损和限价的特点,先触发改单再按限价成交。 #### 3. **示例代码** 下面是一个简单的例子,展示如何使用限价单作为目标订单: ```python import backtrader as bt class TargetOrderStrategy(bt.Strategy): params = ( ('target_price', None), ) def __init__(self): self.data_close = self.datas[0].close def next(self): if not self.position: # 如果当前无持仓,则尝试开仓 target_price = self.params.target_price if target_price and self.data_close[0] < target_price: size = int(self.broker.getcash() / self.data.close[0]) # 计算最大可买数量 self.buy(size=size, exectype=bt.Order.Limit, price=target_price) # 创建限价买单 if __name__ == '__main__': cerebro = bt.Cerebro() data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2022, 1, 1), todate=datetime(2022, 12, 31)) cerebro.adddata(data) cerebro.addstrategy(TargetOrderStrategy, target_price=150) # 设置目标价格为150美元 cerebro.run() cerebro.plot(style='candlestick') ``` 在这个示例中,我们定义了一个名为 `TargetOrderStrategy` 的自定义策略类。它会在收盘价低于目标价格时发出一个限价买单。注意这里设置了 `exectype=bt.Order.Limit` 来确保这是一个限价订单[^2]。 #### 4. **注意事项** - 需要合理设置目标价格,避免因市场波动过大而导致无法成交的情况发生。 - Backtrader 支持多种时间周期的数据源,因此可以根据实际需求加载日线、分钟线等不同粒度的数据。 - 可视化工具可以帮助分析策略表现,建议启用绘图功能以便观察订单执行效果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值