如何使用getContract下载twsInstrument的历史数据?

时间:2011-12-17 12:26:15

标签: r ibrokers

从交互式经纪人处下载数据时,可以正确下载其他未来的合同。

R控制台命令:

icegasoil_feb <- getContract("GOILG2")

Connected with clientId 100.
Error in buildIBcontract(symbol = instrument, tws = tws, addIBslot = addIBslot,  : 
 Could not create valid twsContract.
GOI may not be a valid CASH. Disconnected.

使用getBAT时的下一个错误是:

getBAT("ZWH2")

Connected with clientId 120.
waiting for TWS reply on ZW ............failed.
waiting for TWS reply on ZW ....failed.
waiting for TWS reply on ZW ....failed.
Disconnecting ... 
NULL
Failure:

1: In errorHandler(con, verbose, OK = c(165, 300, 366, 2104, 2106,  :
  Historical Market Data Service error message:No data of type DayChart is available for 

the exchange 'CBOT' and the security type 'Futures' and '5 d' and '1 min'
able for the exchange 'CBOT' and the security type 'Futures' and '5 d' and '1 min'

1 个答案:

答案 0 :(得分:3)

如果您更新,则不会遇到您遇到的第一个问题 FinancialInstrument。

在修订版888之前,FinancialInstrument:::parse_id - 这是由twsInstrument内部使用 - 会想象一个符号 “GOILG2”应该有一个root_id为“GO”,因为它会看到“ILG2”为 4个字符后缀类似于Interactive Brokers用于单个的后缀 股票期货。解决这个问题的一种方法是使用下划线来分隔 来自suffix_id的root_id,以便parse_id不必处理 暧昧的身份。所以,getContract("GOIL_G2")应该有效,而且仍然有效 仪器ID的推荐格式。也就是说,如果你更新 FinancialInstrument,它将按原样运作。

> require("twsInstrument")
> getContract("GOILG2")
Connected with clientId 100.
Checking to see if other 'type's have a pre-defined currency.
Request complete: GOIL FUT USD.
Disconnected.
List of 16
$ conId          : chr "34134707"
$ symbol         : chr "GOIL"
$ sectype        : chr "FUT"
$ exch           : chr "IPE"
$ primary        : chr ""
$ expiry         : chr "20120210"
$ strike         : chr "0"
$ currency       : chr "USD"
$ right          : chr ""
$ local          : chr "GOILG2"
$ multiplier     : chr "100"
$ combo_legs_desc: chr ""
$ comboleg       : chr ""
$ include_expired: chr "0"
$ secIdType      : chr ""
$ secId          : chr ""

第二个问题有点棘手。基本上,不止一个合同 发现对应于“ZWH2”并且使用了“错误的”(坑交易 而不是电子)。在得到解决方案之前,请允许我给出 一点点背景。

twsInstrument包的构建旨在使用Interactive 经纪人帮助我更新我已经拥有的工具的元数据 使用FinancialInstrument包定义。

它将获取它拥有的信息并使用它来收集更多信息。

当您使用getContract时,它将首先在本地搜索twsContract。 如果找不到它,那么它将查看是否已定义仪器元数据 在FinancialInstrument:::.instrument环境中。如果是这样,那个信息 将用于创建可传递给twsContract的shell IBrokers:::reqContractDetails,它将填补缺失的部分。如果有 这个符号没有仪器定义,那么FinancialInstrument:::parse_id 将找出IBrokers:::reqContractDetails所需的信息。

如果盈透证券有几个与给定信息相匹配的合约,它会 返回所有这些列表。不幸的是,我没有意识到这一点 写了twsInstrument。因此,只会使用列表的第一个元素。

FWIW,IB API似乎试图明确它返回的合同 首先,但是当它给你一个不同的时候,这实际上可能会引起挫折 例如,合同取决于您最后查看的合同。

在您的情况下,您要求提供有关“ZWH2”的数据。第一份合同 reqContractDetails返回将是“CBOT”交易的未来,但就像你一样 从您收到的错误消息可以看出,该数据不可用。那是 因为你真的想要一个以“ECBOT”交易的那个。以下说明如何 查看IBrokers:::reqContractDetails返回的长度为2的列表。

require("IBrokers")
fut <- twsContract()
fut$symbol <- 'ZW'
fut$sectype <- 'FUT'
fut$expiry <- '201203'
fut$currency <- 'USD'
tws <- ConnectIB()
reqContractDetails(tws, fut)
twsDisconnect(tws)

确保获得所需合同的方法是使用足够的信息 reqContractDetails没有找到多个匹配项。 e.g。

> define_futures("ZW", "ECBOT", "201203")
Connected with clientId 100.
Request complete: ZW FUT USD.
Disconnected.
[1] "ZW_MAR12"

> getBAT("ZW_MAR12")
Connected with clientId 120.
waiting for TWS reply on ZW ....... done.
Pausing 10 seconds between requests ...
waiting for TWS reply on ZW .... done.
Pausing 10 seconds between requests ...
waiting for TWS reply on ZW .... done.
Pausing 10 seconds between requests ...
Disconnecting ... 
[1] "ZW_MAR12"

define_futures使得乐器的primary_id基于值 twsContract中的“本地”。在这种情况下,它是“ZW_MAR12”。如果你想要的话 id为“ZWH2”,您可以使用FinancialInstrument:::instrument_attr

进行更改
> instrument_attr("ZW_MAR12", "primary_id", "ZWH2")
>  # Now your original code will work
> getBAT("ZWH2")
Connected with clientId 120.
waiting for TWS reply on ZW ....... done.
Pausing 10 seconds between requests ...
waiting for TWS reply on ZW .... done.
Pausing 10 seconds between requests ...
waiting for TWS reply on ZW .... done.
Pausing 10 seconds between requests ...
Disconnecting ... 
[1] "ZWH2"

或者,您可以仅使用FinancialInstrument定义仪器 包装确保提供交换:

future("ZW", currency("USD"), 5000, exchange='ECBOT')
future_series("ZWH2")
getBAT("ZWH2")

最后,如果您有twsInstrument的修订版233或更高版本,请执行以下操作 还将努力定义该工具: twsInstrument(twsFUT("ZW", "ECBOT", "201203"))

我会尽快回复,但我不经常访问所有这些。你会得到一个 如果你把你的问题发送到,那么对twsInstrument的反应会更快 r-sig-finance list,或直接给我(我的电子邮件地址在说明中 包的文件)。请注意,twsInstrument仍在开发中。