Backtrader 教程:实时交易 - Oanda v1.0

  |  

与 Oanda 的集成同时支持:

  • 实时数据馈送

  • 实时交易

要求

  • oandapy

    安装它: pip install git+https://github.com/oanda/oandapy.git

  • pytz (可选,不推荐)

    鉴于外汇的全球性和 24x7 的性质,选择在UTC时间工作。如果愿意,您仍然可以使用所需的输出时区。

示例代码

来源包含以下完整示例:

  • samples/oandatest/oandatest.py

Oanda - 商店

存储是实时数据馈送/交易支持的基石,在 Oanda API 与数据馈送和代理代理的需求之间提供了一层适配。

  • 提供使用以下方法获取代理实例的访问权限:

    • OandaStore.getbroker(*args, **kwargs)
  • 提供对 getter数据馈送实例的访问

    • OandaStore.getedata(\*args, **kwargs)

    在这种情况下,许多**kwargs数据提要很常见,例如datanamefromdatetodatesessionstartsessionendtimeframecompression

    数据可以提供其他参数。检查下面的参考。

强制参数

为了成功连接到 Oanda,以下参数是必需的:

  • token (默认值: None ):API 访问令牌

  • account (默认值: None ):帐户 ID

这是由 Oanda 提供的

无论是连接练习服务器还是真实服务器,使用:

  • practice (默认: False ):使用测试环境

必须定期检查帐户以获取现金和价值。可以通过以下方式控制周期性:

  • account_tmout (default: 10.0 ): 账户价值/现金刷新周期

Oanda 饲料

实例化数据:

  • 根据 Oanda 指南传递符号

    • 遵循 Oanda 指南的 EUR/USDD 必须指定为EUR_USD 。将其实例化为:
    data = oandastore.getdata(dataname='EUR_USD', ...)
    

时间管理

除非将tz参数(与 pytz 兼容的对象)传递给data feed ,否则所有时间输出都是如上所述的UTC格式。

回填

backtrader对 Oanda 没有特别要求。对于小时间框架,Oanda 在练习服务器上返回的回填长度为500

OandaBroker - 实时交易

使用代理

要使用 OandaBroker,必须替换由cerebro创建的标准代理仿真实例。

使用 Store 模型(首选):

import backtrader as bt

cerebro = bt.Cerebro()
oandastore = bt.stores.OandaStore()
cerebro.broker = oandastore.getbroker()  # or cerebro.setbroker(...)

经纪人 - 初始头寸

代理支持单个参数:

  • use_positions (默认值: True ):连接到代理提供商时,使用现有头寸启动代理。

    在实例化期间设置为False以忽略任何现有位置

操作

标准用法没有变化。只需使用策略中可用的方法(有关完整说明,请参阅Strategy参考)

  • buy

  • sell

  • close

  • cancel

订单运行类型

Oanda 支持反向交易者所需的几乎所有订单运行类型,但Close除外。

因此,订单运行类型仅限于:

  • Order.Market

  • Order.Limit

  • Order.Stop

  • Order.StopLimit (使用 Stop 和 upperBound / lowerBound 价格)

  • Order.StopTrail

  • 通过使用takeprofitstoploss订单成员并创建内部仿真订单来支持括号订单。

订单有效期

在回测期间可用的相同有效性概念(具有validbuysell )是可用的并且具有相同的含义。因此,对于以下值,Oanda Orders 的valid参数转换如下:

  • None转化为良好直到取消

    由于未指定有效性,因此订单必须在取消之前有效

  • datetime/date转换为 Good Til Date

  • timedelta(x)转换为 Good Til Date(此处timedelta(x) != timedelta()

    这被解释为使订单从now开始有效的信号 + timedelta(x)

  • timedelta() or 0转换为 Session

    已传递一个值(而不是None )但为 Null 并被解释为对当天(会话)有效的订单

通知

标准Order状态将通过notify_order方法通知给策略(如果被覆盖)

  • Submitted - 订单已发送至 TWS

  • Accepted - 订单已下达

  • Rejected - 用于真正的拒绝以及在创建订单期间不知道其他状态时

  • Partial - 部分运行已发生

  • Completed - 订单已完全运行

  • Canceled (或Cancelled

  • Expired - 当订单因过期而取消时

参考

万达店

backtrader .stores.OandaStore()

单例类包装以控制与 Oanda 的连接。

参数:

  • token (默认值: None ):API 访问令牌

  • account (默认值: None ):帐户 ID

  • practice (默认: False ):使用测试环境

  • account_tmout (default: 10.0 ): 账户价值/现金刷新周期

万达经纪人

backtrader .brokers.OandaBroker(**kwargs)

Oanda 的代理实现。

此类将 Oanda 的订单/头寸映射到backtrader的内部 API。

参数:

  • use_positions (默认值: True ):连接到代理提供商时,使用现有头寸启动代理。

    在实例化期间设置为False以忽略任何现有位置

万达数据

backtrader .feeds.OandaData(**kwargs)

Oanda数据馈送

参数:

  • qcheck (默认值: 0.5

    如果没有接收到数据以有机会正确重新采样/重放数据包并将通知传递到链上,则唤醒时间(以秒为单位)

  • historical (默认: False

    如果设置为True ,则数据馈送将在第一次下载数据后停止。

    标准数据馈送参数fromdatetodate将用作参考。

    如果为数据选择的时间范围/压缩所请求的持续时间大于 IB 允许的持续时间,则数据馈送将发出多个请求。

  • backfill_start (默认值: True

    在开始时运行回填。将在单个请求中获取最大可能的历史数据。

  • backfill (默认值: True

    在断开/重新连接循环后运行回填。间隙持续时间将用于下载尽可能少的数据量

  • backfill_from (默认值: None

    可以传递一个额外的数据源来做一个初始的回填层。一旦数据源耗尽并且如果有请求,将从 IB 回填。理想情况下,这意味着从已存储的源(如磁盘上的文档)回填,但不限于。

  • bidask (默认值: True

    如果为True ,则历史/回填请求将从服务器请求出价/要价

    如果False ,则将请求中点

  • useask (默认值: False

    如果True将使用 bidask 价格的要价部分,而不是默认使用 bid

  • includeFirst (默认值: True

    通过将参数直接设置为 Oanda API 调用来影响历史/回填请求的一个柱的传递

  • reconnect (默认值: True

    网络连接断开时重新连接

  • reconnections (默认值: -1

    尝试重新连接的次数: -1表示永远

  • reconntimeout (默认值: 5.0

    重新连接尝试之间的等待时间(以秒为单位)

数据馈送仅支持timeframecompression的这种映射,它符合 OANDA API 开发人员指南中的定义:

(TimeFrame.Seconds, 5): 'S5',
(TimeFrame.Seconds, 10): 'S10',
(TimeFrame.Seconds, 15): 'S15',
(TimeFrame.Seconds, 30): 'S30',
(TimeFrame.Minutes, 1): 'M1',
(TimeFrame.Minutes, 2): 'M3',
(TimeFrame.Minutes, 3): 'M3',
(TimeFrame.Minutes, 4): 'M4',
(TimeFrame.Minutes, 5): 'M5',
(TimeFrame.Minutes, 10): 'M10',
(TimeFrame.Minutes, 15): 'M15',
(TimeFrame.Minutes, 30): 'M30',
(TimeFrame.Minutes, 60): 'H1',
(TimeFrame.Minutes, 120): 'H2',
(TimeFrame.Minutes, 180): 'H3',
(TimeFrame.Minutes, 240): 'H4',
(TimeFrame.Minutes, 360): 'H6',
(TimeFrame.Minutes, 480): 'H8',
(TimeFrame.Days, 1): 'D',
(TimeFrame.Weeks, 1): 'W',
(TimeFrame.Months, 1): 'M',

任何其他组合将被拒绝

推荐阅读

相关文章

Backtrader砖块

Renko Bricks 是呈现价格演变的另一种方式,其中价格比时间发挥更重要的作用。这已在1.9.54.122的1.9.54.122版本中作为过滤器引入Stockcharts 对 Renko Bricks 有很好的参考。

Backtrader教程:观察者 - 参考

基准 backtrader类 .observers.基准() 此 observer 存储策略的回报和参考资产的回报,参考资产是传递到系统的数据之一。

Backtrader教程:经纪人 - 开仓作弊

“发布”1.9.44.116 添加了对 Cheat-On-Open的支持。这似乎是那些全力以赴的人的需求功能,他们在酒吧 close 后进行了计算,但希望与 open 价格相匹配。 当开盘价跳空(上涨或下跌,取决于是否buysell有效)并且现金不足以进行全面运营时,这样的用例就会失败。这将强制代理拒绝该操作。

Backtrader 教程:佣金计划

不可知论在继续之前,让我们记住, backtrader者试图对数据代表什么保持不可知论。不同的佣金方案可以应用于相同的数据集。让我们看看它是如何做到的。使用代理快捷方式这使最终用户远离CommissionInfo对象,因为可以通过单个函数调用创建/设置佣金方案。

Backtrader标杆

backtrader 包括 2 种不同类型的对象,可帮助进行跟踪: Observers Analyzers 工单 #89 是关于添加资产基准测试的。明智的是,人们实际上可能有一个策略,即使积极,也低于简单地跟踪资产所能提供的策略。

Backtrader教程:过滤器 - 参考

工作阶段筛检程序 类 backtrader.filters。

Backtrader数据同步

在最新版本中,次要编号已从 8 移至 9,以指示即使已考虑兼容性,也可能会对行为产生一些影响。 在 1.9.0.99 版中,使用 datetime 同步多个数据的整个机制已经重新设计(适用于下一个和一次模式)。

Backtrader跨越数字

《backtrader》的发布1.9.27.105纠正了一个疏忽。这是一个疏忽,因为拼图的所有部分都已到位,但启动并不是在所有角落都进行的。 该机制使用一个名为的属性_mindatas,因此让我们将其称为: mindatas。 社区问了这个问题,答案并不是很到位。

Backtrader节省内存

1.3.1.92版本已经重新设计并完全实现了以前到位的内存节省方案,尽管没有太多的吹捧和使用。

Backtrader教程:数据馈送 - 多个时间帧

有时投资决策是使用不同的时间框架做出的: 每周评估趋势 每天运行条目 或者5分钟对60分钟。 这意味着需要组合多个时间帧的数据backtrader 来支持这种组合。 对它的本机支持已经内置。