盈透证券的集成同时支持:

  • 实时数据馈送
  • 实时交易

在投入生产之前,使用模拟交易账户或 TWS 演示彻底测试任何策略。

盈透证券的交互是通过使用该IbPy模块完成的,并且必须在使用前安装。Pypi 中没有包(在撰写本文时),但可以使用pip以下命令安装它:

pip install git+https://github.com/blampe/IbPy.git

如果git在您的系统中不可用(Windows 安装?)以下也应该有效:

pip install https://github.com/blampe/IbPy/archive/master.zip

示例代码

来源包含以下完整示例:

  • 样本/ibtest/ibtest.py

该示例无法涵盖所有​​可能的用例,但它试图提供广泛的见解,并应强调在使用回测模块或实时数据模块时没有真正的区别

可以明确指出一件事:

  • data.LIVE该示例在任何交易活动发生之前等待数据状态通知。这可能是任何实时策略中需要考虑的事情

商店模式与直销模式

通过 2 种模型支持与盈透证券的交互:

  1. 店铺模式(首选
  2. 与数据馈送类和代理类直接交互

当涉及到创建代理数据时,存储模型提供了一个清晰的分离模式。两个代码片段应该更好地作为示例。

首先使用Store模型:

import backtrader as bt

ibstore = bt.stores.IBStore(host='127.0.0.1', port=7496, clientId=35)
data = ibstore.getdata(dataname='EUR.USD-CASH-IDEALPRO')

这里的参数:

  • host,port并被clientId传递到它们所属的位置 IBStore,使用这些参数打开连接。

然后使用backtrader中所有数据馈送的通用参数创建数据馈送getdata

  • dataname要求EUR / USD外汇对。

现在直接使用:

import backtrader as bt

data = bt.feeds.IBData(dataname='EUR.USD-CASH-IDEALPRO',
                       host='127.0.0.1', port=7496, clientId=35)

这里:

  • 用于存储的参数被传递给数据。
  • 这些将用于IBStore在后台创建一个实例

缺点:

  • 清晰度要低得多,因为不清楚什么属于数据,什么属于商店。

IBStore – 商店

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

商店是一个涵盖以下功能的概念:

  • 作为实体的中心商店:在这种情况下,实体是 IB可能需要也可能不需要参数
  • 使用以下方法提供获取代理实例的访问权限:
    • IBStore.getbroker(*args, **kwargs)
  • 提供对 getter数据馈送实例的访问
    • IBStore.getdata(*args, **kwargs)

    在这种情况下,许多是**kwargs数据馈送所共有的,例如 datanamefromdatetodatesessionstartsessionendtimeframe,compression

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

提供IBStore

  • 连接目标(hostport参数)
  • 标识(clientId参数)
  • 重新连接控制(reconnecttimeout参数)
  • 时间偏移检查(timeoffset参数,见下文)
  • 通知和调试notifyall(默认值:)False:在这种情况下,IB 发送的任何error消息(许多只是提供信息)都将转发到Cerebro / Strategy

    _debug(默认值:)False:在这种情况下,从 TWS 收到的每条消息都将打印到标准输出

IBData 提要

数据选项

无论是直接还是通过getdata提要,都IBData支持以下数据选项:

  • 历史下载请求如果持续时间超过 IB 对给定时间范围/压缩组合施加的限制,这些将被拆分为多个请求
  • 3 种风格的实时数据
    • tickPrice事件(通过 IB reqMktData

    用于CASH产品(至少 TWS API 9.70 的实验表明不支持其他类型)

    通过查看价格接收报价BID事件,根据非官方互联网文献,这似乎是跟踪CASH市场价格的方式。

    时间戳在系统本地生成。如果最终用户希望,可以使用 IB 服务器时间的偏移量(从 IB 计算reqCurrentTime

    • tickString事件(又名RTVolume(通过 IB reqMktData

    大约从 IB接收OHLC/卷快照。每 250 毫秒(如果没有发生交易,则更长)

    • RealTimeBars事件(通过 IB reqRealTimeBars

    每 5 秒接收一次历史 5 秒柱(持续时间由 IB 固定)

    如果选择的时间范围/组合低于秒/5级别,此功能将自动禁用。

  • 默认行为是使用:tickString在大多数情况下,除非用户特别想使用RealTimeBars
  • Backfilling除非用户请求只进行历史下载,否则数据馈送将自动回填:
    • 在开始时:具有最大可能的持续时间。示例:对于 Days/1 ( timeframe/compression ) 组合,IB 的最大默认持续时间为1 年,这是将回填的时间量
    • 数据断开后:在这种情况下,通过查看断开前接收到的最新数据,为回填操作下载的数据量将减少到最低限度。
考虑到考虑的最终时间框架/压缩组合可能不是在数据馈送创建期间指定的组合,而是在插入系统期间指定的组合。请参见以下示例:
data = ibstore.getdata(dataname='EUR.USD-CASH-IDEALPRO',
                       timeframe=bt.TimeFrame.Seconds, compression=5)

cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes, compression=2)

现在应该清楚了,考虑的最终时间框架/压缩组合是Minutes/2

数据合同检查

在开始阶段,数据馈送将尝试下载指定合约的详细信息(请参阅参考资料了解如何指定它)。如果没有找到这样的合约或找到多个匹配,数据将拒绝进行,并通知系统。一些例子。

简单但明确的合同规范:

data = ibstore.getdata(dataname='TWTR')  # Twitter

只会找到一个实例(2016-06),因为对于默认类型, STK交易所和货币(默认为无)将找到SMART单个合约交易。USD

类似的方法将失败AAPL

data = ibstore.getdata(dataname='AAPL')  # Error -> multiple contracts

因为SMART在几个真实的交易所中找到合约,并AAPL在其中一些交易所以不同的货币进行交易。以下是可以的:

data = ibstore.getdata(dataname='AAPL-STK-SMART-USD')  # 1 contract found

数据通知

数据馈送将通过以下一项或多项报告当前状态(查看Cerebro策略参考)

  • Cerebro.notify_data(如果被覆盖)n
  • 添加了一个回调Cerebro.adddatacb
  • Strategy.notify_data(如果被覆盖)

策略内的一个例子:

class IBStrategy(bt.Strategy):

    def notify_data(self, data, status, *args, **kwargs):

        if status == data.LIVE:  # the data has switched to live data
           # do something
           pass

系统更改后将发送以下通知:

  • CONNECTED在成功的初始连接上发送
  • DISCONNECTED在这种情况下,不再可能检索数据,并且数据将指示系统无能为力。可能的条件:
    • 指定了错误的合同
    • 历史下载中断
    • 超过 TWS 重新连接尝试次数
  • CONNBROKEN与 TWS 或数据场的连接已丢失。数据馈送将尝试(通过商店)在需要时重新连接和回填,并恢复操作
  • NOTSUBSCRIBED合同和连接都可以,但是由于权限不足,无法检索数据。

    数据将向系统表明它无法检索数据

  • DELAYED发出信号表示正在进行历史/回填操作,并且该策略正在处理的数据不是实时数据
  • LIVE发出信号,表示策略从此时开始处理的数据是实时数据

策略开发人员应考虑在断开连接或接收延迟数据等情况下采取哪些行动。

数据时间帧和压缩

backtrader生态系统中的数据馈送,在创建过程中支持timeframe和 compression参数。这些参数也可以作为属性访问data._timeframe和 data._compression

当通过或 将数据传递给实例时,时间帧/压缩组合的重要性具有特定目的,以让内部重采样器/重放器对象了解预期目标是什么。 并且在重新采样/重放时将被覆盖在数据中。cerebroresampledatareplaydata._timeframe._compression

但另一方面,在实时数据馈送中,这些信息可以发挥重要作用。请参见以下示例:

data = ibstore.getdata(dataname='EUR.USD-CASH-IDEALPRO',
                       timeframe=bt.TimeFrame.Ticks,
                       compression=1,  # 1 is the default
                       rtbar=True,  # use RealTimeBars
                      )
cerebro.adddata(data)

用户正在请求报价数据,这很重要,因为:

  • 不会进行回填(IB 支持的最小单位是 Seconds/1
  • 即使RealTimeBars被请求和支持dataname,它们也不会被使用,因为 a 的最小分辨率RealTimeBar 是Seconds/5

在任何情况下,除非使用Ticks/1的分辨率,否则必须重新采样/重播数据。上面带有实时条和工作的案例:

data = ibstore.getdata(dataname='TWTR-STK-SMART', rtbar=True)
cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=20)

在这种情况下,如上所述,数据的._timeframe._compression 属性将在resampledata. 这将发生:

  • 回填将发生,要求分辨率为Seconds/20
  • RealTimeBars将用于实时数据,因为分辨率等于/大于Seconds/5并且数据支持是(不是CASH 产品)
  • 从 TWS 到系统的事件最多每 5 秒发生一次。这可能并不重要,因为系统只会每 20 秒向策略发送一根柱线。

没有相同的RealTimeBars

data = ibstore.getdata(dataname='TWTR-STK-SMART')
cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=20)

在这种情况下:

  • 回填将发生,要求分辨率为Seconds/20
  • tickString将用于实时数据,因为(不是CASH产品)
  • 从 TWS 到系统的事件最多每 250 毫秒发生一次。这可能并不重要,因为系统只会每 20 秒向策略发送一根柱线。

最后使用CASH产品,最多 20 秒:

data = ibstore.getdata(dataname='EUR.USD-CASH-IDEALPRO')
cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=20)

在这种情况下:

  • 回填将发生,要求分辨率为Seconds/20
  • tickPrice将用于实时数据,因为这是现金产品就算rtbar=True加了
  • 从 TWS 到系统的事件最多每 250 毫秒发生一次。这可能并不重要,因为系统只会每 20 秒向策略发送一根柱线。

时间管理

数据馈送将根据TWSContractDetails报告的对象自动确定时区 。

这需要pytz安装。如果未安装,用户应向tz数据源提供tzinfo所需输出时区的兼容实例参数

如果pytz已安装并且用户感觉自动时区确定不起作用,则该tz参数可以包含带有时区名称的字符串。backtrader将尝试 pytz.timezone使用给定名称实例化 a

报告的datetime将是与产品相关的时区。一些例子:

  • 产品:欧洲期货交易所的 EuroStoxxx 50(股票代码:ESTX50-YYYYMM-DTB)时区将是CET中欧时间)又名 Europe/Berlin
  • 产品:ES-Mini(代码:ES-YYYYMM-GLOBEX)时区将是EST5EDTaka ESTakaUS/Eastern
  • 产品: EUR.JPY 外汇对(代码EUR.JPY-CASH-IDEALPRO)时区将是EST5EDTaka ESTakaUS/Eastern

    实际上这是盈透证券的设置,因为外汇对几乎 24 小时不间断地交易,因此它们不会有真正的时区。

这种行为确保无论交易者的实际位置如何,交易都保持一致,因为计算机很可能具有实际位置的时区,而不是交易场所的时区。

请阅读手册的时间管理部分。

对于没有可用数据下载权限的资产,TWS 演示报告的时区不准确(EuroStoxx 50 期货就是这些情况的一个例子)

实时数据的重采样/重播

关于何时为实时提要交付条形图的设计决策是:

  • 尽可能实时地交付它们

这可能看起来很明显,并且在 的时间范围内就是这种情况Ticks,但如果 重新采样/重放发挥作用,则可能会发生延迟。用例:

  • 重采样配置为Seconds/5,其中:
cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=5)
  • 带时间的刻度23:05:27.325000线已交付
  • 市场交易缓慢,下一个报价在 23:05:59.025000

这可能看起来并不明显,但反向交易者并不知道交易非常缓慢,并且下一个报价将在32几秒钟后出现。如果没有适当的规定,一个重新采样的条形带时间23:05:30.00000029 seconds太迟交付。

这就是为什么实时提要每秒钟唤醒一次x浮点值)以转到重采样器/重放器并让它知道没有新数据进入。这由创建实时数据提要时的参数qcheck(默认值:秒)控制0.5.

这意味着qcheck如果本地时钟显示重采样周期结束,重采样器每秒钟就有机会发送一个条形图。有了这个,上面场景的重新采样条 ( 23:05:30.000000) 将在qcheck报告时间后最多几秒内交付。

因为默认值是0.5最新时间,所以: 23:05:30.500000. 这比以前早了将近 29 秒。

缺点:

  • 对于已经交付的重新采样/重放的条形图,一些刻度可能来得太晚

如果在交付后,TWS 从服务器收到一条延迟消息,时间戳为23:05:29.995\000 , this is simply too late for the already reported time to the system of23:05.30.000000`

这主要发生在以下情况:

  • timeoffset 被禁用(设置为False),IBStore\ *IB报告的时间和本地时钟之间的时间差很大。

避免大多数迟到样本的最佳方法:

  • 增加该qcheck值,以允许考虑迟到的消息:
data = ibstore.getdata('TWTR', qcheck=2.0, ...)

这应该会增加额外的空间,即使它会延迟 重新采样/重放条的交付

如果最终用户出于某种原因希望禁用timeoffset而不是管理 via qcheck,仍然可以获取后期样本:

  • 使用_latethroughset toTrue作为getdata/ 的参数IBData
data = ibstore.getdata('TWTR', _latethrough=True, ...)
  • 重采样/重放时使用takelateset to :True
cerebro.resampledata(data, takelate=True)

IBBroker – 实时交易

根据请求,在backtrader中可用的经纪人模拟tradeid中实施了一项功能 。这允许跟踪在同一资产上并行执行的交易,将佣金正确分配给适当的tradeid

此实时经纪商不支持这种概念,因为经纪商有时会报告佣金,在这种情况下,不可能将它们区分为不同的tradeid价值。

tradeid仍然可以指定,但它不再有意义。

使用代理

要使用IB Broker ,必须替换由cerebro创建的标准代理模拟实例 。

使用Store模型(首选):

import backtrader as bt

cerebro = bt.Cerebro()
ibstore = bt.stores.IBStore(host='127.0.0.1', port=7496, clientId=35)
cerebro.broker = ibstore.getbroker()  # or cerebro.setbroker(...)

使用直接方法:

import backtrader as bt

cerebro = bt.Cerebro()
cerebro.broker = bt.brokers.IBBroker(host='127.0.0.1', port=7496, clientId=35)

代理参数

无论是直接还是通过getbroker代理IBBroker都不支持任何参数。这是因为经纪人只是真正 经纪人的代理。而真正的经纪人所给予的,是不会被拿走的。

一些限制

现金和价值报告

如果内部反向交易经纪人模拟计算 value(净清算价值)并且cash在调用策略 next方法之前,则无法保证与真实经纪人相同。

  • 如果请求了值,则next可能会延迟执行,直到答案到达
  • 经纪人可能尚未计算出价值

backtrader告诉 TWS 在更改后立即提供更新的值(backtrader订阅accounUpdate消息),但它不知道消息何时到达。

getcashgetvalue方法报告的值IBBroker 始终是从 IB 收到的最新值。

进一步的限制是,即使有更多货币的值可用,这些值也以账户的基础货币报告。这是一个设计选择。

位置

backtrader使用PositionTWS 报告的资产的(价格和规模)。可以在订单执行订单状态消息之后使用内部计算,但如果其中一些消息丢失(套接字有时会丢失数据包),则不会进行计算。

当然,如果在连接到 TWS 时,将执行交易的资产已经有一个未平仓头寸,Trades由于初始抵消,该策略进行的计算将不会像往常一样工作

与之交易

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

  • buy
  • sell
  • close
  • cancel

返回的订单对象

  • 与 backtraderOrder对象兼容(同一层次结构中的子类)

订单执行类型

IB支持多种执行类型,其中一些由IB模拟,一些由交易所本身支持。关于最初支持哪种订单执行类型的决定有一个动机:

  • 与backtrader中提供的经纪人模拟的兼容性

    原因是经过回溯测试的内容将投入生产。

因此,订单执行类型仅限于 经纪人模拟中可用的类型:

  • Order.Market
  • Order.Close
  • Order.Limit
  • Order.Stop(当触发止损时,市场订单会跟随)
  • Order.StopLimit(当止损被触发时,一个限价单会跟随)

停止触发是按照 IB 的不同策略完成的。backtrader不会修改默认设置0

0 - 默认值。
场外股票和美式期权的订单将采用“双重买/卖”方法。所有其他订单将使用
“最后”方法。
如果用户希望对此进行修改,**kwargs可以向IB 文档提供额外内容buy并遵循该文档。sell例如在next策略的方法中:
def next(self):
    # some logic before
    self.buy(data, m_triggerMethod=2)

这已将策略更改为2“last”方法,根据最后价格触发止损单。

有关停止触发的任何进一步说明,请查阅 IB API 文档

订单有效期

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

  • None -> GTC(直到取消)

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

  • datetime/date翻译为GTD(截止日期)

    传递 datetime.datetime/datetime.date 实例表示订单必须在给定时间点之前有效。

  • timedelta(x)翻译为GTD(这里timedelta(x) != timedelta()

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

  • float翻译成GTD

    如果该值是从反向交易者使用的原始浮动日期时间存储中 获取的,则订单必须在该浮动指示的日期时间之前有效

  • timedelta() or 0翻译成DAY

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

通知

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

  • Submitted– 订单已发送至 TWS
  • Accepted– 已下订单
  • Rejected– 下单失败或在其生命周期内被系统取消
  • Partial– 部分执行已发生
  • Completed– 订单已全部执行
  • Canceled(或Cancelled

    这在 IB 下有几个含义:

    • 手动用户取消
    • 服务器/交易所取消了订单
    • 订单有效期已过

      将应用启发式,如果openOrder从 TWS 收到带有orderState指示PendingCancel 或的消息Canceled,则订单将被标记为Expired

  • Expired– 见上面的解释

参考

IBStore

class backtrader.stores.IBStore()

包装 ibpy ibConnection 实例的单例类。

参数也可以在使用这个存储的类中指定,比如IBDataIBBroker

参数:

  • host(默认值127.0.0.1:):IB TWS 或 IB 网关实际运行的位置。虽然这通常是本地主机,但一定不是
  • port(默认值:7496):要连接的端口。演示系统使用 7497
  • clientId(默认值None):使用哪个 clientId 连接到 TWS。

    None: 生成一个介于 1 和 65535 之间的随机 id 一个integer: 将作为要使用的值传递。

  • notifyall(默认False

    If Falseonlyerror消息将被发送到 和 的notify_store方法。CerebroStrategy

    如果True, 每条从 TWS 收到的消息都会被通知

  • _debug(默认False

    将从 TWS 收到的所有消息打印到标准输出

  • reconnect(默认3

    第一次连接尝试失败后尝试重新连接的尝试次数

    将其设置为一个-1值以永远重新连接

  • timeout(默认3.0

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

  • timeoffset(默认True

    如果为 True,则从reqCurrentTime(IB 服务器时间)获得的时间将用于计算与本地时间的偏移量,并且此偏移量将用于价格通知(tickPrice 事件,例如对于 CASH 市场)以修改本地计算的时间戳。

    时间偏移将传播到backtrader 生态系统的其他部分,例如重采样,以使用计算的偏移对齐重采样时间戳。

  • timerefresh(默认60.0

    以秒为单位的时间:必须多久刷新一次时间偏移量

  • indcash(默认True

    管理 IND 代码,就像它们是用于价格检索的现金一样

IB经纪商

class backtrader.brokers.IBBroker(**kwargs)

盈透证券的经纪商实施。

此类将来自 Interactive Brokers 的订单/头寸映射到backtrader.

笔记

  • tradeid不是真的支持,因为盈亏是直接从IB拿的。因为(如预期的那样)以 FIFO 方式计算它,所以 pnl 对于 tradeid 不准确。
  • 位置

如果在操作开始时有资产的未平仓头寸或通过其他方式下达的订单更改头寸,则在大脑中计算的交易Strategy将无法反映现实。

为避免这种情况,该经纪人必须进行自己的仓位管理,这也将允许 tradeid 具有多个 id(盈亏也将在本地计算),但可能被认为违背了与真实经纪人合作的目的

IB数据

class backtrader.feeds.IBData(**kwargs)

盈透证券数据馈送。

在参数中支持以下合约规范dataname

  • TICKER # 股票类型和智能交换
  • TICKER-STK #股票和智能交易所
  • TICKER-STK-EXCHANGE #股票
  • 股票代号-STK-EXCHANGE-CURRENCY #股票
  • TICKER-CFD # CFD 和 SMART 交易所
  • TICKER-CFD-EXCHANGE # CFD
  • TICKER-CDF-EXCHANGE-CURRENCY #股票
  • TICKER-IND-EXCHANGE # 索引
  • TICKER-IND-EXCHANGE-CURRENCY # 索引
  • TICKER-YYYYMM-EXCHANGE # 未来
  • TICKER-YYYYMM-EXCHANGE-CURRENCY # 未来
  • TICKER-YYYYMM-EXCHANGE-CURRENCY-MULT # 未来
  • TICKER-FUT-EXCHANGE-CURRENCY-YYYYMM-MULT # 未来
  • TICKER-YYYYMM-EXCHANGE-CURRENCY-STRIKE-RIGHT # FOP
  • TICKER-YYYYMM-EXCHANGE-CURRENCY-STRIKE-RIGHT-MULT # FOP
  • TICKER-FOP-EXCHANGE-CURRENCY-YYYYMM-STRIKE-RIGHT # FOP
  • TICKER-FOP-EXCHANGE-CURRENCY-YYYYMM-STRIKE-RIGHT-MULT # FOP
  • CUR1.CUR2-CASH-IDEALPRO # 外汇
  • TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT # OPT
  • TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT-MULT # OPT
  • TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT # OPT
  • TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT-MULT # OPT

参数:

  • sectype(默认STK

    如果规范中未提供,则 作为安全类型应用的默认值dataname

  • exchange(默认SMART

    如果规范中未提供,则 作为交换应用的默认值dataname

  • currency(默认''

    如果规范中未提供,则 作为货币应用的默认值dataname

  • historical(默认False

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

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

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

  • what(默认None

    如果None不同资产类型的默认值将用于历史数据请求:

    • 现金资产的“出价”
    • 任何其他的“交易”

    如果需要其他值,请检查 IB API 文档

  • rtbar(默认False

    如果盈透证券提供True5 Seconds Realtime bars将用作小数点。根据文档,它们对应于实时值(由 IB 整理和策划)

    如果False这样,RTVolume价格将被使用,它基于接收报价。在CASH资产(例如 EUR.JPY)的情况下,RTVolume将始终使用bid价格(根据散布在 Internet 上的文献,IB 的行业事实标准)

    即使设置为True,如果数据被重新采样/保持到低于 Seconds/5 的时间帧/压缩,则不会使用实时柱,因为 IB 不会在低于该水平的情况下为它们提供服务

  • qcheck(默认0.5

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

  • backfill_start(默认True

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

  • backfill(默认True

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

  • backfill_from(默认None

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

  • latethrough(默认False

    如果数据源被重新采样/重放,对于已经交付的重采样/重放柱,一些刻度可能来得太晚。如果是 True这样,那么无论如何都会让这些滴答声通过。

    查看 Resampler 文档以了解谁将这些刻度考虑在内。

    尤其是 在实例timeoffset中设置为且 TWS 服务器时间与本地计算机的时间不同步时,可能会发生这种情况FalseIBStore

  • tradename(默认值:None对于某些特定情况很有用,CFD例如价格由一种资产提供而交易发生在不同的资产中
    • SPY-STK-SMART-USD -> SP500 ETF(将被指定为dataname
    • SPY-CFD-SMART-USD -> 对应的 CFD 不提供价格跟踪,但在这种情况下将是交易资产(指定为tradename

参数中的默认值是允许应用\TICKER , to which the parametersectype (default:STK ) andexchange (default:SMART`) 之类的东西。

有些资产AAPL需要完整的规范,包括currency (默认值:”),而其他类似的资产TWTR可以简单地按原样传递。

  • AAPL-STK-SMART-USD将是 dataname 的完整规范

    否则:IBDataas IBData(dataname='AAPL', currency='USD') which 使用默认值 ( STKand SMART) 并覆盖货币为USD