2011-12-17 19 views
4

從交互式經紀商下載數據時,某些未來的合約可以正確下載,而不是其他合約。如何使用getContract與twsInstrument下載歷史數據?

[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當是:如果你更新 FinancialInstrument

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' 
+0

請隨時通過電子郵件直接向我發送關於twsInstrument的問題以獲得更快的響應。我的電子郵件地址位於軟件包的描述文件中。 – GSee

回答

3

不會出現你遇到的第一個問題。

此前版本888,FinancialInstrument:::parse_id - 這是由twsInstrument內部使用 - 本來以爲一個符號像 「GOILG2」應該有「GO」一個root_id,因爲它會看到「ILG2」作爲 4個字符的後綴與Interactive Brokers用於股票期貨的單個 類似。解決此問題的一個方法是使用下劃線將 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包是使用交互式 經紀人幫我更新說我已經 與FinancialInstrument包中定義儀器的元數據的意圖建造。

它將採取什麼樣的信息,並用它來收集更多的信息。

當您使用getContract時,它將首先在本地搜索twsContract。 如果找不到它,那麼它將查看是否已在FinancialInstrument:::.instrument環境中定義儀器元數據 。如果是這樣,那麼將使用該信息 來創建可以被傳遞到 IBrokers:::reqContractDetails的外殼,其將填充缺少的部分。如果 沒有此符號的儀器定義,則FinancialInstrument:::parse_id 將找出IBrokers:::reqContractDetails所需的信息。

如果盈透證券有幾個合約與給定的信息相匹配,它將返回一個所有這些信息的列表。不幸的是,我並沒有意識到這一點,當我 寫twsInstrument。所以,只會使用列表的第一個元素。例如,IF 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_idtwsContract 「本地」的值。在這種情況下,它是「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") 

最後,如果你有一個修訂版233或更高版本twsInstrument,下面 也將一起定義儀器: twsInstrument(twsFUT("ZW", "ECBOT", "201203"))

我會盡早回覆,但我沒有經常訪問。如果您將問題發送至 r-sig-finance列表或直接發給我(我的電子郵件地址位於軟件包的描述 文件中),您將得到一個關於twsInstrument的更快速的響應 。請注意twsInstrument仍在開發中。