4

当从交互式经纪人下载数据时,一些未来的合约可以正确下载,而另一些则不能。

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'
4

1 回答 1

3

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

在 twsInstrument 内部使用的版本 888 之前,FinancialInstrument:::parse_id会认为像“GOILG2”这样的符号应该有一个“GO”的 root_id,因为它会将“ILG2”看作一个 4 个字符的后缀,类似于盈透证券用于单一股票期货。解决此问题的一种方法是使用下划线将 root_id 与 suffix_id 分开,这样parse_id就不必处理不明确的 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 Brokers 帮助我更新我已经使用 FinancialInstrument 包定义的工具的元数据。

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

使用getContract时会先在本地搜索twsContract. 如果它找不到它,那么它将查看仪器元数据是否已在FinancialInstrument:::.instrument环境中定义。如果是这样,该信息将用于创建一个twsContract可以传递给 的外壳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 找不到超过一个匹配项。例如

> 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"))

我会更早做出回应,但我不会那么频繁地访问。如果您将问题发送到 r-sig-finance 列表或直接发送给我(我的电子邮件地址在包的说明文件中),您将获得关于 twsInstrument 的更快回复。请注意,twsInstrument 仍在开发中。

于 2012-01-26T03:08:31.247 回答