Backtrader交易基础2

成交价格确定:

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:订单已到期,其已经从系统中删除 。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 小技巧

2019独角兽企业重金招聘Python工程师标准>>> 桌面图标显示不全、图标呈现白色方块 ie4uinit -show 关闭占用指定端口的进程 获取进程: netstat -ano | findstr 端口号关闭进程&#xff1a;taskkill -f -pid 进程号文件被占用 打开任务管理器&#xff0c;切换到 性能…

进一步了解 apt-get 的几个命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 用 apt-get 也很久了&#xff0c;没多想它的实现&#xff0c;最近遇到 gstreamer 装不上的问题&#xff0c;才多看看了它 apt-get 就是…

java学习笔记20(Arraylist复习,Collection接口方法,迭代器,增强型for循环)

集合&#xff1a;集合是Java提供的一种容器&#xff0c;可以用来存储多个数据&#xff1b; 集合与数组的区别&#xff1a;集合的长度是可变的&#xff0c;数组的长度是固定的 集合中存储的数据必须是引用类型数据&#xff1b; ArrayList回顾&#xff1a; public class Person {…

backtrader数据基础

cerebro bt.Cerebro() cerebro.addstrategy(TestStrategy2) codes[600862.SH,300326.SZ,300394.SZ] #加载最近两日交易数据 for code in codes:feed Addmoredata(dataname get_data(code,20200506),namecode)cerebro.adddata(feed) cerebro.run() 数据查看&#xff1a; cl…

谈判学:三招了解对方底线

导读&#xff1a;谈判者都希望能了解对方的底线&#xff0c;最直接的一招就是将对手变成“朋友”&#xff0c;只是这种“内奸法”毕竟不是常规之法。大多数情况下&#xff0c;谈判双方也不可能像《无间道》一样在对方阵营安放卧底&#xff0c;但是我们完全可以通过一些办法来揣…

JSLint检测Javascript语法规范

前端javascript代码编写中&#xff0c;有一个不错的工具叫JSLint&#xff0c;可以检查代码规范化&#xff0c;压缩JS&#xff0c;CSS等&#xff0c;但是他的语法规范检查个人觉得太“苛刻”了&#xff0c;会提示各种各样的问题修改建议&#xff0c;有时候提示的信息我们看的莫名…

Apt 命令解说(apt-get update、apt-cache search package、apt-get install package、apt-get remove )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 高级打包工具&#xff08;英语&#xff1a;Advanced Packaging Tools&#xff0c;缩写为APT&#xff09;是Debian及其派生发行版的软件包…

SQL SERVER 2012 AlwaysOn - 维护篇 03

搭建 AlwaysOn 是件非常繁琐的工作&#xff0c;需要从两方面考虑&#xff0c;操作系统层面和数据库层面&#xff0c;AlwaysOn 非常依赖于操作系统&#xff0c;域控&#xff0c;群集&#xff0c;节点等概念&#xff1b; DBA 不但要熟悉数据库也要熟悉操作系统的一些概念&#xf…

指标研究与多周期

哪些地方会用到指标 &#xff1f; 回顾一下 Backtrader 的主要功能模块和回测流程&#xff08;见&#xff1a;Backtrader 来了&#xff01;&#xff09;可以发现&#xff0c;只有在编写策略Strategy 时才会涉及到指标的计算和使用&#xff0c;而且是 Strategy 中的 __init__()…

区块链BAAS平台:公共或私人区块链编程以用于各种用途

2019独角兽企业重金招聘Python工程师标准>>> 人们可以为公共或私人区块链编程以用于各种用途。理论上&#xff0c;我认为牺牲权力下放的方面可以解决区块链技术背后的许多当前问题。区块链仍然可以包容&#xff0c;而不是分散。这如何解决当前的一些问题&#xff1f…

CURL 是什么

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。 它支持文件上传和下载&#xff0c;所以是综合传输工…

易用性问题回复

针对淘宝网为例&#xff0c;以一次完整的购物流程为背景&#xff0c;我们分析了在淘宝网中的一些易用性的体现&#xff0c;主要场景如下图所示: 在本场景中&#xff0c;新用户下载淘宝app时&#xff0c;第一次打开应用&#xff0c;淘宝app会出现新手指引&#xff0c;教会用户如…

易盛极星期货量化教学

我目前量化实盘做期货交易用的是这个软件。主要就是因为它可以做套利合约&#xff0c;还有就是国企的外包&#xff0c;安全&#xff08;vnpy的狗咬狗害怕&#xff09;。 策略模板&#xff1a; 设置全局参数变量&#xff1a; #导入包 import talib #选择合约代码 code1 #设…

eBay是如何进行大数据集元数据发现的

很多大数据系统每天都会收集数PB的数据。这类系统通常主要用于查询给定时间范围内的原始数据记录&#xff0c;并使用了多个数据过滤器。但是&#xff0c;要发现或识别存在于这些大型数据集中的唯一属性可能很困难。 在大型数据集上执行运行时聚合&#xff08;例如应用程序在特定…

职业发展 先“立功”还是先“安内”?

导读&#xff1a;职业生涯更上一层楼&#xff0c;章良踌躇满志&#xff0c;想在短期内建功立业&#xff0c;奠定江湖地位。但他清楚&#xff0c;自己运筹中的分公司服务升级计划&#xff0c;对公司整体和自己的职业生涯都非常有利&#xff0c;却将不可避免地转移老将掌握的部分…

网关 Kong 折腾笔记 - 相关技术清单

背景 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 公司准备更好的实现微服务架构&#xff0c;我前期的任务主要是 API 开发相关的技术学习&#xff0c;微服务会随着业务的增加不断增加…

Quantaxis更新数据到最新

登录QQ群&#xff1a;563280067 安装方法&#xff1a; 1.进入命令界面&#xff0c; 2.pip install pytdx-1.72r2-py3-none-any.whl 3. pip install quantaxis-1.10.19r1-py3-none-any.whl 之后输入save save all 即可看到所有的数据全部安装到位

Java各进制之间的转换

十进制转成十六进制&#xff1a; Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("…

mingW与cygwin 异同

首先MingW和cygwin都可以用来跨平台开发。 MinGW是Minimalistic GNU for Windows的缩写&#xff0c;也就是Win版的GCC。 Cygwin则是全面模拟了Linux的接口&#xff0c;提供给运行在它上面的的程序使用&#xff0c;并提供了大量现成的软件&#xff0c;更像是一个平台。 相…

shell字符串的用法

shell字符串的用法 注意&#xff1a;shell4.2和shell4.1会有差别&#xff0c;较低版本的shell可能不支持某些功能 获取字符串长度&#xff1a;${#string}获取子串&#xff1a; 注&#xff1a;&#xff08;左边的第一个字符是用 0 表示&#xff0c;右边的第一个字符用 0-1 表示&…