盈透证券API集成的详细说明 – backtrader中文教程
与盈透证券的集成同时支持:
- 实时数据馈送
- 实时交易
在投入生产之前,使用模拟交易账户或 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 种模型支持与盈透证券的交互:
- 店铺模式(首选)
- 与数据馈送类和代理类直接交互
当涉及到创建代理和数据时,存储模型提供了一个清晰的分离模式。两个代码片段应该更好地作为示例。
首先使用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
数据馈送所共有的,例如dataname
,fromdate
,todate
,sessionstart
,sessionend
,timeframe
,compression
数据可以提供其他参数。检查下面的参考。
提供IBStore
:
- 连接目标(
host
和port
参数) - 标识(
clientId
参数) - 重新连接控制(
reconnect
和timeout
参数) - 时间偏移检查(
timeoffset
参数,见下文) - 通知和调试
notifyall
(默认值:)False
:在这种情况下,IB 发送的任何error
消息(许多只是提供信息)都将转发到Cerebro / Strategy_debug
(默认值:)False
:在这种情况下,从 TWS 收到的每条消息都将打印到标准输出
IBData 提要
数据选项
无论是直接还是通过getdata
提要,都IBData
支持以下数据选项:
- 历史下载请求如果持续时间超过 IB 对给定时间范围/压缩组合施加的限制,这些将被拆分为多个请求
- 3 种风格的实时数据
tickPrice
事件(通过 IBreqMktData
)
用于CASH产品(至少 TWS API 9.70 的实验表明不支持其他类型)
通过查看价格接收报价
BID
事件,根据非官方互联网文献,这似乎是跟踪CASH
市场价格的方式。时间戳在系统本地生成。如果最终用户希望,可以使用 IB 服务器时间的偏移量(从 IB 计算
reqCurrentTime
)tickString
事件(又名RTVolume
(通过 IBreqMktData
)
大约从 IB接收OHLC/卷快照。每 250 毫秒(如果没有发生交易,则更长)
RealTimeBars
事件(通过 IBreqRealTimeBars
)
每 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
当通过或 将数据传递给实例时,时间帧/压缩组合的重要性具有特定目的,以让内部重采样器/重放器对象了解预期目标是什么。 并且在重新采样/重放时将被覆盖在数据中。cerebro
resampledata
replaydata
._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)时区将是
EST5EDT
akaEST
akaUS/Eastern
- 产品: EUR.JPY 外汇对(代码EUR.JPY-CASH-IDEALPRO)时区将是
EST5EDT
akaEST
akaUS/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.000000
将29 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 of
23:05.30.000000`
这主要发生在以下情况:
timeoffset
被禁用(设置为False
),IBStore\
*IB报告的时间和本地时钟之间的时间差很大。
避免大多数迟到样本的最佳方法:
- 增加该
qcheck
值,以允许考虑迟到的消息:
data = ibstore.getdata('TWTR', qcheck=2.0, ...)
这应该会增加额外的空间,即使它会延迟 重新采样/重放条的交付
如果最终用户出于某种原因希望禁用timeoffset
而不是管理 via qcheck
,仍然可以获取后期样本:
- 使用
_latethrough
set toTrue
作为getdata
/ 的参数IBData
:
data = ibstore.getdata('TWTR', _latethrough=True, ...)
- 重采样/重放时使用
takelate
set 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
消息),但它不知道消息何时到达。
getcash
和getvalue
方法报告的值IBBroker
始终是从 IB 收到的最新值。
进一步的限制是,即使有更多货币的值可用,这些值也以账户的基础货币报告。这是一个设计选择。
位置
backtrader使用Position
TWS 报告的资产的(价格和规模)。可以在订单执行和订单状态消息之后使用内部计算,但如果其中一些消息丢失(套接字有时会丢失数据包),则不会进行计算。
当然,如果在连接到 TWS 时,将执行交易的资产已经有一个未平仓头寸,Trades
由于初始抵消,该策略进行的计算将不会像往常一样工作
与之交易
标准用法没有变化。只需使用策略中可用的方法(Strategy
完整说明请参阅参考资料)
buy
sell
close
cancel
返回的订单对象
- 与 backtrader
Order
对象兼容(同一层次结构中的子类)
订单执行类型
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 文档
订单有效期
在回测期间可用的相同有效性概念(使用valid
to buy
和sell
)是可用的并且具有相同的含义。因此, 对于以下值, 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
– 订单已发送至 TWSAccepted
– 已下订单Rejected
– 下单失败或在其生命周期内被系统取消Partial
– 部分执行已发生Completed
– 订单已全部执行Canceled
(或Cancelled
)这在 IB 下有几个含义:
- 手动用户取消
- 服务器/交易所取消了订单
- 订单有效期已过
将应用启发式,如果
openOrder
从 TWS 收到带有orderState
指示PendingCancel
或的消息Canceled
,则订单将被标记为Expired
Expired
– 见上面的解释
参考
IBStore
class backtrader.stores.IBStore()
包装 ibpy ibConnection 实例的单例类。
参数也可以在使用这个存储的类中指定,比如IBData
和IBBroker
参数:
host
(默认值127.0.0.1
:):IB TWS 或 IB 网关实际运行的位置。虽然这通常是本地主机,但一定不是port
(默认值:7496
):要连接的端口。演示系统使用7497
clientId
(默认值None
):使用哪个 clientId 连接到 TWS。None
: 生成一个介于 1 和 65535 之间的随机 id 一个integer
: 将作为要使用的值传递。notifyall
(默认False
)If
False
onlyerror
消息将被发送到 和 的notify_store
方法。Cerebro
Strategy
如果
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
数据馈送将在第一次下载数据后停止。标准数据馈送参数
fromdate
,todate
将用作参考。如果为数据选择的时间范围/压缩所请求的持续时间大于 IB 允许的持续时间,则数据馈送将发出多个请求。
what
(默认None
)如果
None
不同资产类型的默认值将用于历史数据请求:- 现金资产的“出价”
- 任何其他的“交易”
如果需要其他值,请检查 IB API 文档
rtbar
(默认False
)如果盈透证券提供
True
的5 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 服务器时间与本地计算机的时间不同步时,可能会发生这种情况False
IBStore
tradename
(默认值:None
)对于某些特定情况很有用,CFD
例如价格由一种资产提供而交易发生在不同的资产中- SPY-STK-SMART-USD -> SP500 ETF(将被指定为
dataname
) - SPY-CFD-SMART-USD -> 对应的 CFD 不提供价格跟踪,但在这种情况下将是交易资产(指定为
tradename
)
- SPY-STK-SMART-USD -> SP500 ETF(将被指定为
参数中的默认值是允许应用\
TICKER , to which the parameter
sectype (default:
STK ) and
exchange (default:
SMART`) 之类的东西。
有些资产AAPL
需要完整的规范,包括currency
(默认值:”),而其他类似的资产TWTR
可以简单地按原样传递。
AAPL-STK-SMART-USD
将是 dataname 的完整规范否则:
IBData
asIBData(dataname='AAPL', currency='USD')
which 使用默认值 (STK
andSMART
) 并覆盖货币为USD