Backtrader 文档学习-Order OCO orders

2024-01-25 11:28

本文主要是介绍Backtrader 文档学习-Order OCO orders,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Backtrader 文档学习-Order OCO orders

主要是可以使用订单组的管理策略,使用订单组策略,则一组订单中,有一个符合条件的订单成交,订单组中其他的订单就自动被取消。

1.概述

V1.9.36.116 版本交互式代理支持StopTrail、StopTrailLimit和OCO。

  • OCO始终将组中的第一个order指定为参数OCO
  • 代理模拟和IB代理具有相同的行为。指定:price作为初始停止触发价格(也指定trailamount),然后plimit作为初始限制价格。两者之间的差异将决定极限偏移量(极限价格与停止触发价格之间的距离)。

IB代理(Introducing Broker)是外汇行业中一个特殊的群体,主要充当销售角色,负责拓展外汇交易商市场并获取更多客户。
IB代理的职责是为外汇交易商拓展市场,并从交易商那里获得一定的返佣作为销售的佣金。在服务外汇平台的第三方工作人员中,也有被称为IB代理的,职责是为平台发展客户,以赚取交易者点差中的佣金为收入来源。

使用模式尽量保持用户友好,如果策略中的逻辑已决定发布订单的时候了,则可以这样使用OCO:

def next(self):...o1 = self.buy(...)...o2 = self.buy(..., oco=o1)...o3 = self.buy(..., oco=o1)  # or even oco=o2, o2 is already in o1 group

第一个order o1将类似于组长。通过用oco命名参数指定o1,o2和o3成为OCO组的一部分。请注意,代码片段中的注释表明,通过指定O2(O2已经是组的一部分),o3也可以成为组的一部分。
随着order组的形成,将发生以下情况:
如果该组中的任何订单被执行、取消或过期,其他订单将被取消 。
理解:订单组中,只能有一个订单成交。

2.示例

现金额度到50000,因为资产价值达到4000,3个order,其中1给订单至少需要12000(broker的默认值为10000)

标准的SMA交叉策略,该示例执行以下操作:

  • 当快速均线向上穿过慢速均线时,发出3个order
  • order1是限价订单,将在限制天内到期(策略的参数),用收盘价降低1个百分点作为限价
  • order2是限价订单,到期时间更长,限价更低。
  • order3是更进一步降低限价的限价单
    order3 is a Limit order which further reduces the limit price

因此order2和order3不会执行,因为:

  • order1如首先执行,将触发其他订单的取消
    或者
  • order1将到期,也将触发其他订单的取消

系统保留3个订单的参考ID,只有在notify_order中显示三个ID为已完成、已取消、保证金或过期时,才会发出新的order 。

在持有某些bar的头寸后,就简单退出。

(1)程序
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
import datetimeimport backtrader as btclass St(bt.Strategy):params = dict(ma=bt.ind.SMA,p1=5,p2=15,limit=0.005,limdays=3,limdays2=1000,hold=10,switchp1p2=False,  # switch prices of order1 and order2oco1oco2=False,  # False - use order1 as oco for order3, else order2do_oco=True,  # use oco or not)def notify_order(self, order):print('{}: Order ref: {} / Type {} / Status {}'.format(self.data.datetime.date(0),order.ref, 'Buy' * order.isbuy() or 'Sell',order.getstatusname()))if order.status == order.Completed:self.holdstart = len(self)if not order.alive() and order.ref in self.orefs:self.orefs.remove(order.ref)def __init__(self):ma1, ma2 = self.p.ma(period=self.p.p1), self.p.ma(period=self.p.p2)self.cross = bt.ind.CrossOver(ma1, ma2)self.orefs = list()def next(self):if self.orefs:return  # pending orders do nothingif not self.position:if self.cross > 0.0:  # crossing upp1 = self.data.close[0] * (1.0 - self.p.limit)p2 = self.data.close[0] * (1.0 - 2 * 2 * self.p.limit)p3 = self.data.close[0] * (1.0 - 3 * 3 * self.p.limit)if self.p.switchp1p2:p1, p2 = p2, p1o1 = self.buy(exectype=bt.Order.Limit, price=p1,valid=datetime.timedelta(self.p.limdays))print('{}: Oref {} / Buy at {}'.format(self.datetime.date(), o1.ref, p1))oco2 = o1 if self.p.do_oco else Noneo2 = self.buy(exectype=bt.Order.Limit, price=p2,valid=datetime.timedelta(self.p.limdays2),oco=oco2)print('{}: Oref {} / Buy at {}'.format(self.datetime.date(), o2.ref, p2))if self.p.do_oco:oco3 = o1 if not self.p.oco1oco2 else oco2else:oco3 = Noneo3 = self.buy(exectype=bt.Order.Limit, price=p3,valid=datetime.timedelta(self.p.limdays2),oco=oco3)print('{}: Oref {} / Buy at {}'.format(self.datetime.date(), o3.ref, p3))self.orefs = [o1.ref, o2.ref, o3.ref]else:  # in the marketif (len(self) - self.holdstart) >= self.p.hold:self.close()def runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()# Data feed kwargskwargs = dict()# Parse from/to-datedtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S'for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']):if a:strpfmt = dtfmt + tmfmt * ('T' in a)kwargs[d] = datetime.datetime.strptime(a, strpfmt)# Data feeddata0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs)cerebro.adddata(data0)# Brokercerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')'))# Sizercerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')'))# Strategycerebro.addstrategy(St, **eval('dict(' + args.strat + ')'))# Executecerebro.run(**eval('dict(' + args.cerebro + ')'))if args.plot:  # Plot if requested tocerebro.plot(**eval('dict(' + args.plot + ')'))def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description=('Sample Skeleton'))parser.add_argument('--data0', default='./datas/2005-2006-day-001.txt',required=False, help='Data to read in')# Defaults for datesparser.add_argument('--fromdate', required=False, default='',help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')parser.add_argument('--todate', required=False, default='',help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')parser.add_argument('--cerebro', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--broker', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--sizer', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--strat', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--plot', required=False, default='',nargs='?', const='{}',metavar='kwargs', help='kwargs in key=value format')return parser.parse_args(pargs)if __name__ == '__main__':runstrat()
(2)oco=True
  • 第一批order订单发出,order1过期,order2和order3同时取消,如前面说明的一样。

  • order1的有效期是3天,28日触发下单,30日无数据,31日order提交并接受,2月1日order1过期。

  • 6月23日一批3个订单触发。订单49完成,订单50和订单51立即取消 。

python ./oco.py --broker cash=50000 --plot
2005-01-28: Oref 1 / Buy at 2941.11055
2005-01-28: Oref 2 / Buy at 2896.7722
2005-01-28: Oref 3 / Buy at 2822.87495
2005-01-31: Order ref: 1 / Type Buy / Status Submitted
2005-01-31: Order ref: 2 / Type Buy / Status Submitted
2005-01-31: Order ref: 3 / Type Buy / Status Submitted
2005-01-31: Order ref: 1 / Type Buy / Status Accepted
2005-01-31: Order ref: 2 / Type Buy / Status Accepted
2005-01-31: Order ref: 3 / Type Buy / Status Accepted
2005-02-01: Order ref: 1 / Type Buy / Status Expired
2005-02-01: Order ref: 3 / Type Buy / Status Canceled
2005-02-01: Order ref: 2 / Type Buy / Status Canceled
2005-03-03: Oref 4 / Buy at 3062.71945
2005-03-03: Oref 5 / Buy at 3016.5478000000003
2005-03-03: Oref 6 / Buy at 2939.59505
2005-03-04: Order ref: 4 / Type Buy / Status Submitted
2005-03-04: Order ref: 5 / Type Buy / Status Submitted
2005-03-04: Order ref: 6 / Type Buy / Status Submitted
2005-03-04: Order ref: 4 / Type Buy / Status Accepted
2005-03-04: Order ref: 5 / Type Buy / Status Accepted
2005-03-04: Order ref: 6 / Type Buy / Status Accepted
2005-03-07: Order ref: 4 / Type Buy / Status Expired
2005-03-07: Order ref: 6 / Type Buy / Status Canceled
2005-03-07: Order ref: 5 / Type Buy / Status Canceled
2005-03-31: Oref 7 / Buy at 3040.45135
2005-03-31: Oref 8 / Buy at 2994.6154
2005-03-31: Oref 9 / Buy at 2918.22215
... ...
2006-06-23: Oref 49 / Buy at 3532.39925
2006-06-23: Oref 50 / Buy at 3479.147
2006-06-23: Oref 51 / Buy at 3390.39325
2006-06-26: Order ref: 49 / Type Buy / Status Submitted
2006-06-26: Order ref: 50 / Type Buy / Status Submitted
2006-06-26: Order ref: 51 / Type Buy / Status Submitted
2006-06-26: Order ref: 49 / Type Buy / Status Accepted
2006-06-26: Order ref: 50 / Type Buy / Status Accepted
2006-06-26: Order ref: 51 / Type Buy / Status Accepted
2006-06-26: Order ref: 49 / Type Buy / Status Completed
2006-06-26: Order ref: 51 / Type Buy / Status Canceled
2006-06-26: Order ref: 50 / Type Buy / Status Canceled

在这里插入图片描述

(3)oco=False

不使用OCO的效果:

python ./oco.py --strat do_oco=False --broker cash=50000
2005-01-28: Oref 1 / Buy at 2941.11055
2005-01-28: Oref 2 / Buy at 2896.7722
2005-01-28: Oref 3 / Buy at 2822.87495
2005-01-31: Order ref: 1 / Type Buy / Status Submitted
2005-01-31: Order ref: 2 / Type Buy / Status Submitted
2005-01-31: Order ref: 3 / Type Buy / Status Submitted
2005-01-31: Order ref: 1 / Type Buy / Status Accepted
2005-01-31: Order ref: 2 / Type Buy / Status Accepted
2005-01-31: Order ref: 3 / Type Buy / Status Accepted
2005-02-01: Order ref: 1 / Type Buy / Status Expired

仅此而已,没有订单执行,也不太需要图表

The batch of orders is issued
order1过期,但是由于策略的参数do_oco=False,order2和order3不属于oco组 ,没有出现取消的状态。

Orders 2 and 3 are therefore not cancelled and because the default expiration delta is 1000 days later, they never expire with the available data for the sample (2 years of data)

order2和order3不会被取消,因为默认的到期是1000天后,它们永远不会因样本的可用数据(2年的数据)而到期 。
系统永远不能触发order2和order3。

3.Help

python ./oco.py --help
usage: oco.py [-h] [--data0 DATA0] [--fromdate FROMDATE] [--todate TODATE][--cerebro kwargs] [--broker kwargs] [--sizer kwargs][--strat kwargs] [--plot [kwargs]]Sample Skeletonoptional arguments:-h, --help           show this help message and exit--data0 DATA0        Data to read in (default:./datas/2005-2006-day-001.txt)--fromdate FROMDATE  Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )--todate TODATE      Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )--cerebro kwargs     kwargs in key=value format (default: )--broker kwargs      kwargs in key=value format (default: )--sizer kwargs       kwargs in key=value format (default: )--strat kwargs       kwargs in key=value format (default: )--plot [kwargs]      kwargs in key=value format (default: )

这篇关于Backtrader 文档学习-Order OCO orders的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643117

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API