IB証券 APIの接続方法

スポンサーリンク
スポンサーリンク

準備

アプリケーションのインストール

まず、ここを理解しないと厳しいです。

「APIなんだからPythonで直接RESTとかすればいいんじゃないの」と思い込んだらハマります。

IB証券のAPIはゲートウェイから接続となります。説明しにくいので以下の図を参照してください。

要はシステムを稼働させるパソコンやサーバにIB証券が提供しているソフトウェアをインストールしないといけないということです。

このソフトウェアは2種類あります。

  • IBゲートウェイ(これが本来のゲートウェイのソフトウェア
  • デスクトップTWS(本来はデスクトップアプリの投資ツール

私のやり方は、

  • IBゲートウェイ(本番の実行時のみ利用
  • デスクトップTWS(開発時に利用

として使っています。IBゲートウェイはゲートウェイしか機能がありませんので、視覚的に発注や決済が見れるデスクトップTWSを利用しながらシステムを開発しています。

ソフトウェアはこちら

IBゲートウェイ
https://www.interactivebrokers.co.jp/jp/index.php?f=16901

デスクトップTWS
https://www.interactivebrokers.co.jp/jp/index.php?f=15901&ns=T#tws-software

インストール後の設定

2つのソフトウェアとも設定内容は同じですが、画面が違うので少し悩みます。

設定画面へのアクセス
  • IBゲートウェイ
    1. メニュー「設定」ー>「設定」
    2. 設定ー>APIー>設定
  • デスクトップTWS
    1. メニュー「ファイル」ー>「グローバルコンフィグ」
    2. 設定ー>APIー>設定
設定内容

以下の3つで問題ないと思います。

  • ActiveXとソケットクライアントを有効にする:ON
  • API(読み込みのみ):OFF
  • ソケットポート:任意の数値(このポートを利用してターミナルなどから接続します

パッケージのインストール

ib_insyncというライブラリを利用します。他にもあるようですが、これが比較的に簡単で安定しているようです。インストールに-Uというのがついています。

pip install -U ib_insync

理由は分かりませんが、ドキュメントに書いてある通りにしています。

ib-insync
Python sync/async framework for Interactive Brokers API

ドキュメントなどは以下にあります。これを知らないと厳しいかもです。
(スキンヘッドのイカツイおにいさん?は気にしないでください)

erdewit/ib_insync
Python sync/async framework for Interactive Brokers API - erdewit/ib_insync

接続

from ib_insync import *ib_insyncの全てのオブジェクトをインポートします。

util.startLoop()Jupyter Notebookで使う時のみ必要です。

ib.connect(ローカル・ループバック・アドレス, ポート番号, clientId=任意の数値)で接続します。

  • ローカル・ループバック・アドレス:自身のPCなどのIPアドレス('127.0.0.1'または'localhost'
  • ポート番号:ゲートウェイで設定したポート番号
  • clientId:1以上の任意の数値(複数の接続が可能ですが、その際は数値が重複しないようにしましょう。
from ib_insync import *
util.startLoop()

ib = IB()
ib.connect('127.0.0.1', 4002, clientId=1000)

再起動

デスクトップTWSとIBゲートウェイは毎日再起動します。再起動の時間は、以下の画面で設定することができます。

再起動中はもちろん接続できません。シストレを開発する際は、この点も考慮する必要があります。

以下を使うと再起動を止めることができるようなのですが、まだ使ったことはありません。情報共有まで。
https://github.com/ib-controller/ib-controller/

切断

上記の再起動とは別に、接続が切断することが多々あります。多分、毎日日本時間で1時ごろ、13時ごろ、19時ごろに断続的にです。

以下のページを見ると赤のマーカーにあるようにシステムのリセットがあるようです。
1日に3回あると思うのですが、2回のAsiaのサーバかなと思います。
First reset: 16:30 – 17:00 ETはアメリカ東部時間なので日本より13時間遅いので一致、Second reset: 20:15 – 21:00 HKTは香港時間なので1時間遅いのでこれも一致しています。

お昼頃の謎の切断は謎です。

Trading is available 24 hours a day, 7 days a week with the exception of system reset times described in the table below.

Server Reset TimesNorth AmericaEuropeAsia
Saturday – Thursday23:45 – 00:45 ET 105:45 – 06:45 CET 1First reset: 16:30 – 17:00 ET 1
Second reset: 20:15 – 21:00 HKT
Friday23:00 – 03:00 ET 223:00 – 03:00 ET 223:00 – 03:00 ET 2
Current System Status | Interactive Brokers LLC
Interactive Brokers system status

再起動と合わせて、この切断もシストレを開発する際は、この点も考慮する必要があります。

接続の確認

接続の有無の確認

ib.isConnected()で接続の有無を確認することができます。
返り値はブーリアン型で、接続していればTrue、接続していなければFalseとなります。

ib.isConnected()

接続情報の確認

ib.client.connectionStats()で接続情報を確認することができます。

ib.client.connectionStats()

# ConnectionStats(startTime=1589937766.302922, duration=20.51628303527832, numBytesRecv=35203, numBytesSent=112, numMsgRecv=708, numMsgSent=7)

デスクトップTWS

画面右上にある「データ」をクリックすると接続状況を確認することができます。
赤枠のところですが、3つの接続があります。この画面から切断することはできません。

切断

ib.disconnect()

引数の設定はなく、ibで接続したものを切断します。他の接続を切断することはできません。

コメント

タイトルとURLをコピーしました