FinancialInstrument を更新すると、最初に発生した問題は発生しなくなります。
リビジョン 888 より前FinancialInstrument:::parse_id
は、twsInstrument によって内部的に使用されていましたが、"GOILG2" のようなシンボルは "GO" の root_id を持つべきだと考えていました。 Interactive Brokers は単一株先物に使用します。これを回避する 1 つの方法は、アンダースコアを使用して 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 ""
2 番目の問題は、少しトリッキーです。基本的に、「ZWH2」に対応する複数の契約が見つかり、「間違った」契約が使用されました(電子ではなくピット取引)。解決策に入る前に、少し背景を説明させてください。
twsInstrument パッケージは、Interactive Brokers を使用して、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"))
もっと早く返信したかったのですが、それほど頻繁にSOを訪問することはありません。twsInstrument についての質問は、r-sig-finance メーリングリストまたは私 (私の電子メール アドレスはパッケージの DESCRIPTION ファイルに記載されています) に直接送信していただくと、より迅速に回答を得ることができます。twsInstrument はまだ開発中であることに注意してください。