从交互式经纪商下载数据时,有些期货合约可以正常下载,有些则不能。
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'
您遇到的第一个问题将不会发生,如果您更新FinancialInstrument。
在修订888之前,FinancialInstrument:::parse_id
—它是由twsininstrument内部使用的——你会想到Symbol吗"GOILG2"应该有一个"GO"的root_id,因为它会将"ILG2"视为一个4个字符后缀,类似于Interactive Brokers使用的single股指期货。解决这个问题的一种方法是使用下划线分隔从后缀_id中获取root_id,以便parse_id
不必处理模棱两可的id。所以,getContract("GOIL_G2")
应该起作用了,现在仍然仪器id的推荐格式。也就是说,如果你更新金融工具,它会正常工作。
> 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",使用的是"错误"的(坑交易而不是电子的)。在得到解之前,请允许我给出一点背景。
twsininstrument包是为了使用Interactive而构建的经纪人帮助我更新我已经拥有的工具元数据使用FinancialInstrument包定义。
它将利用它所拥有的信息来收集更多的信息。
当您使用getContract
时,它将首先在本地搜索twsContract
。如果找不到,它将查看仪器元数据是否已定义在FinancialInstrument:::.instrument
环境中。如果有,那就是信息将用于创建一个外壳的twsContract
,可以传递给IBrokers:::reqContractDetails
,它将填补缺失的部分。如果有这个符号没有仪器定义,那么FinancialInstrument:::parse_id
将计算出IBrokers:::reqContractDetails
所需的信息。
如果盈透证券有几个合同匹配给出的信息,它将返回所有这些元素的列表。不幸的是,我没有意识到这一点twsInstrument写道。因此,只使用列表的第一个元素。
就我所知,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
中的"local"。在本例中,它是"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")
最后,如果您有twsininstrument的233版或更高版本,请执行以下操作还将努力定义该工具:twsInstrument(twsFUT("ZW", "ECBOT", "201203"))
我应该早点回复,但是我不经常访问SO。你会得到一个如果您将您的问题发送到以下任一网站,您将获得更快的回复r-sig-finance列表,或直接发给我(我的电子邮件地址在描述中)包的文件)。请注意twsininstrument还在开发中