Как загрузить исторические данные с помощью twsInstrument, используя getContract? - PullRequest
4 голосов
/ 17 декабря 2011

При загрузке данных с интерактивных брокеров некоторые будущие контракты могут быть загружены должным образом, другие нет.

Консольная команда 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 Ответ

3 голосов
/ 26 января 2012

Первая проблема, с которой вы столкнулись, не возникнет, если вы обновите Финансовый инструмент.

До редакции 888, FinancialInstrument:::parse_id - который используется внутренне twsInstrument - думал бы символ как «GOILG2» должен иметь root_id «GO», потому что он видел бы «ILG2» как 4-х символьный суффикс, аналогичный тем, которые Interactive Brokers использует для одиночного биржевые фьючерсы. Одним из способов решения этой проблемы является использование подчеркивания для разделения root_id из суффикса_id, так что parse_id не должен иметь дело с неоднозначный идентификатор. Итак, getContract("GOIL_G2") должен был сработать, и до сих пор рекомендуемый формат для идентификаторов инструментов. Тем не менее, если вы обновите 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, которую можно передать IBrokers:::reqContractDetails, который заполнит недостающие части. Если там нет определения инструмента для этого символа, тогда FinancialInstrument:::parse_id выяснит информацию, необходимую для IBrokers:::reqContractDetails.

Если у Interactive Brokers есть несколько контрактов, соответствующих указанной информации, он будет вернуть список всех из них. К сожалению, я не понял этого, когда я написал twsInstrument. Таким образом, будет использоваться только первый элемент списка.

FWIW, IB API, кажется, пытается быть умным о том, какой контракт он возвращает во-первых, но это может на самом деле вызвать разочарование, когда это дает вам другой контракт, в зависимости от того, какой контракт вы смотрели, например.

В вашем случае вы запрашиваете данные для "ZWH2". Первый контракт, который reqContractDetails возвраты - это будущее, которое торгует на «CBOT», но, как вы из полученного сообщения об ошибке видно, что данные недоступны. Это потому что вы действительно хотите тот, который торгует на "ECBOT". Ниже показано, как чтобы увидеть список длины 2, который возвращает IBrokers:::reqContractDetails.

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

Наконец, если у вас есть 233 или более поздняя версия twsInstrument, следующее Также будет работать, чтобы определить инструмент: twsInstrument(twsFUT("ZW", "ECBOT", "201203"))

Я бы ответил раньше, но я не так часто бываю. Вы получите более быстрый ответ о twsInstrument, если вы отправите свой вопрос либо r-sig-finance list или напрямую мне (мой адрес электронной почты в ОПИСАНИИ файл пакета). Обратите внимание, что twsInstrument все еще находится в стадии разработки.

...