IB証券:API接続検証その4「クラスオブジェクトの、どこから手をつけるか」
(以下は Java限定。他の言語でも似たようなオブジェクトデザインなので参考程度に。)
IB証券へのAPI接続には、"IB Gateway"というプログラムを Windows or Linux/Macの環境で起動すると IDとパスワードを打ち込み "IB Gateway"が、IB証券に繋がるので、自分で作るプログラムはこの "IB Gateway"に接続する形になります。
自作PG(デモプログラムも同じ) → IB Gateway → IB証券
24時間/365日OKみたいです。たまに切れて再接続してます。
サンプルソースコードは、この IB Gatewayに、接続して リアルタイムや 履歴データを取得するプログラムそのものになっていました。
開発環境への取り込み:
私の環境は eclipseです。
eclipseってなんじゃ?という人はググって使って慣れてください。何でも出来る系の開発環境なので敷居が高く感じますが根性で乗り切りましょう。
D:\TWS API\source\JavaClient\com\ib
ディレクトリパスにある、3つのパスにある javaファイルをパッケージとしてインポートします。
com.ib.client
com.ib.contracts
com.ib.controller
です。ぜんぶで68ファイルぐらいあります。
警告が出たりしたら適当に直すか、エラーでは無い限り放置で良いかと思います。
セッション確立のあたりはサンプルを見ればなんとか解ると思います。
結論から先に書くと、com.ib.controller.ApiController クラスを継承して新しいクラスを作成し、履歴データやリアルタイムデータが返ってくるメソッドをオーバーライドして必要な処理を実装すればOKです。
オンラインドキュメントでは、EReaderSignalオブジェクトを EJavaSignalクラスでインスタンス化して、EClientSocketクラスに EWrapperインターフェースを実装して作成したクラスもインスタンス化して渡せば、EWrapperインターフェースクラスの実装メソッドにデータが返ってくるように読めますが、素直にそういうのを作ってやっても返ってきません。(汗)
ApiControllerクラスがすでにその条件のもとに作成されているので、多少使わない機能実装があったとしてもそのまま使うのが吉かと思います。
重要なクラスの一つが、ApiControllerです。
履歴データ取得専用の新たなクラスを作るとすると、こんな感じです。
public class ibController extends ApiController {
/** とりあえずコンストラクタはそのまま上位を呼び出し。 */
public ibController(IConnectionHandler handler, ILogger inLogger, ILogger outLogger) {
super(handler, inLogger, outLogger);
}
/**
*/
@Override
public void historicalData(int reqId, String date, double open, double high, double low, double close, int volume, int count, double wap, boolean hasGaps) {
//上位メソッド呼び出し。
super.historicalData(reqId, date, open, high, low, close, volume, count, wap, hasGaps);
//データ処理(上位メソッドの条件判定の一部をそのままコピペ。ApiControllerを修正したくないので)
if (date.startsWith( "finished")) {
//ここに指定条件の全てを取得後の処理、たとえばトランザクションのコミットなどを書く。
System.out.println("IB historical data received end:");
}
else {
long longDate;
if (date.length() == 8) {
int year = Integer.parseInt( date.substring( 0, 4) );
int month = Integer.parseInt( date.substring( 4, 6) );
int day = Integer.parseInt( date.substring( 6) );
longDate = new GregorianCalendar( year - 1900, month - 1, day).getTimeInMillis() / 1000;
}
else {
longDate = Long.parseLong( date);
}
//Date型への変換用に1000倍して戻す。
Date dt = new Date(longDate*1000);
//ここで1件ずつデータがやってくるので persistするか、コミット用にためるなどの処理を書く。
System.out.println("IB historical data received:" + reqId + ":" + date + ":" + dt + ":" + open + ":" + high + ":" + low + ":" + close + ":" + volume + ":" + count + ":" + wap + ":" + hasGaps);
}
}
}
IB証券:API接続検証その3「まずはどんな感じでデータが取れるのかを確認」
イメージをつかむために、サンプルデモプログラムを動かすのが一番。
VB用と、C#用が何もせずに exe実行すれば動くので、見た目の解り易さで C#のプログラムを起動します。
ソースを展開したディレクトリ、(私の場合は ドライブDに展開した)
D:\TWS API\samples\CSharp\IBSampleApp\bin\Release
に、IBSampleApp.exe があるので実行。こんな感じ。
実際に動かすには、口座開設と1万ドル以上もしくは同等の任意の通貨での入金し、承認されて、データ情報を受け取る金融商品をアクティベートしてからになるので、ゼロから手続きすると半月ぐらいはかかると思います。
ドル円を、15分足で、midpoint中間値で、履歴データを表示させるとこんな画面になります。
VisualStudio2015 CommunityEditionとか入手して、ソリューションファイルを読み込んでデザインを変えて再構築したりしても楽しいかもしれません。
☆ソリューションファイルは、絶対パスで記述されているので、エディタなどで自分の環境に合わせてディレクトリパスなどを書き換えないと動きません。
IB証券:API接続検証その2「必要な前提知識と資料など」
IB証券接続プログラムを作成するにあたって、前提となる知識を箇条書き。
足りない場合には学習して取得するしかないと思います。
・Java or C# or VB or C++ or Pythonのプログラミング能力
・オブジェクト指向の理解
・英語の読解力
1つ目はサンプルコードが上記のいずれかであるため。それ以外に Swiftやらpythonやらで対応したい場合は自力でクラスライブラリなりを作る労力が必要ですが不可能ではないと思います。2つ目は Javaのサンプルコードを読む限り、3階層ぐらいのオブジェクトの継承と Interface実装を伴うので解っていないとコード読むことができないと思います。3つ目は、まぁ資料が英語しかないので仕方ないです。
(追記)驚きです。この記事を書いていたらオンラインヘルプに Pythonが追加されていました。たぶん昨日までなかったと思う。。
資料のリンクなど:
これらは、特に口座開設していなくてもアクセスできると思うので、とりあえず見てみて手に負えそうであればトライしてみる判断になると思います。
・オンラインヘルプ:各言語ごとにヘルプが別れているのでGoodです
TWS API v9.72: Trader Workstation API
・APIガイド(言語別):Getting Started Guidesの列の下のほうに言語ごとのPDF。
Traders University | Interactive Brokers オンラインヘルプだけではなくこちらも目を通さないと、たぶんプログラム動かないと思います。ちょっと嵌まりました。
・サンプルプログラムソースコード:上記のオンラインヘルプの introductionにリンクがありますが、各言語ごとのデモプログラムとソースが入手できます。
IB証券:API接続検証その1「サンプルと仮検証」
3連休、いかがお過ごしでしょうか。
急なドル安で、初めてFXにポジション持ってみました。
なんぴんダブルを2回繰り返してちょろっと微益を稼いで、小心者なので金曜夜中は決済したので117円までの戻しでリターンはとれませんでしたが、まぁいい感じでした。
IB証券、サンプルソースがダウンロード出来るので、自前の Javaプログラムに組み込むべく、検証開始しました。とりあえずどんな感じでデータがとれるのか、C#向けにコンパイル済みの exeが含まれていたのでちょろっと動かしたところ、
・Forexは92通貨ペアでBid/Ask + 中間値Midpointが、最も高頻度な1secは無理ですが 30sec足で 2005/10/01頃までHigh/Lowを含めて取得出来そうです。(USD/JPYのみチェック)
・日本株も同様で、Price, High, Low, Volume,VWAPの値が同じく30秒足で取れそうです。(7201日産/6758ソニーでのみチェック)
サンプルコードを解析しながら、データ取り込み出来るようになったらアウトライン概念からちゃんとまとめたいと思います。
■
ここの更新が滞ってひと月近くあっという間、もう12月だ(汗)。
トランプ相場であれよあれよでうまく振舞えて2割ほど資産増。
バックエンドプログラム制御のHinemosジョブスケジューラ環境を仮想マシンから物理マシンに移行。
仮想マシン廃止したセカンダリDBサーバ4コアフル使用でバックアップ日次作業を短縮。
バックエンドプログラム処理用のサーバを追加し部屋が温くなり未だ暖房未使用。
スクレイピングプログラムのいくつかのバグとり。
自作システムのクライアントツールをC#で作成。
銘柄情報と日足の分析結果をいい感じで見られるようになった。
トレステとHyperSBIの両方を使うようになってきて画面不足。
トレーディング環境のディスプレイ支持ポール自作で2枚追加。
とまぁこんな感じで、シストレ的には書くようなネタでもないなあという感じでした。
今週は C#クライアント作っていて、それが終わったらトレステのロジック使った構成を再開するつもり。
特にネタなし:IB証券接続
TradeStationについてはELコーディングなど遠ざかってまして特にネタがない日々が1週間ほど続いています。
自作のJavaプログラムの不具合改修を続けています。
上場企業のHP丸ごととIR、TDNet、上場企業の財務情報、いくつかの通信社系ニュースのスクレイピング、日足の株価データ取得、日証金と信用残、そういったデータ取得プログラムを安定的に動かすための ジョブスケジューラ Hinemosの設定といった微調整を続けていました。
現在のシステム構成の DBは、mariaDBを使っています。それ以外にもPDFなどの物理ファイルを自動で落としてきたIRデータ容量が 2TBで足りなくなってきたので、今週末は新しい6TB HDDへの移行作業になります。そのあとでまたトレステELの予定。平日ざら場中は毎分、引け後と寄り付き前は10分間隔でIR公開サイトのいくつかに自動アクセスしているので、ほぼ土日しか作業ができなかったりします。
息抜き?に、InteractiveBrokers証券のアカウントで、ざっくり確認してみたところです。TSEからのマーケットデータ取得は月額300JPYで可能なようです。安いですなあ。どの程度の同時取得が可能なのかはこれから検証ですが、一番期待できそうな感じです。それ以外は Forexなどは口座維持者であれば無料、あとはなぜか韓国市場のマーケットデータが無料なようです。なんでしょう全く買う気になれないので、データ取得の検証用という感じかもしれません。UK, US市場などはそれぞれざっくり20$/月ぐらいかかるみたいなので、しばらくは見送りで、当面はTSEからの予定。
まぁこんな感じの1週間です。