コバのシステムトレード構築日記(Dukascopy他)

IB証券/DukascopyとのAPI接続ナレッジや、トレステなど

IB証券:API接続検証、その6「履歴データ取得前の留意点」

Forex6通貨ペア、東証上場約3,900銘柄の 30sec/1min/2min/3min/5min/10min/20min/30min/1h/4h/1day/1weekの12種足を取得開始して2週間ほど経過しました。(4時間足は東証株価には不要だろうと除外)

いくつか経験からの留意点があるので書き留めておきます。

 

1:Exchange毎にレスポンスのキャップがある模様

 92通貨ペア全てだと年単位で時間がかかりそうだとは以前書きましたが、IB証券側のサーバレスポンスが遅いので覚悟が必要です。

 接続時に contractオブジェクトを生成してプロパティ値として Exchageを指定しますが、そのExchange毎に処理能力がアカウント毎に決まっているようなレスポンスを感じます。IBGatewayにソケットを開いて Forexの Exchange=IDEALPROを指定して例えばUSDJPY履歴データの取得を始めると打てば響く程度のレスポンスでドンドンデータが取れます。しかし新しくソケットを開いて EURUSD、EURJPY、GBPJPYと通貨を増やして並行処理させると増やした通貨ペアに比例するレスポンスの低下が起きます。厳密にははかっていませんが、サーバー側の付加を考えると致し方ないとは思います。これは Exchange=TSEJでも同じです。

 したがって、取得したい銘柄や通貨ペアなどに優先的に指定出来るようなプログラムのパラメータが必要かと思います。もしくは Exchangeが異なるデータ取得プログラムを複数早く揃えるのがよろしいかと思います。まだ IDEALPROと TSEJ用しか作っていないです。パターンは同じなのであとは課金とやる気の問題。

 東証約3,900銘柄の数年分の履歴取得に計算したくないほど膨大な時間がかかりそうなので、IB証券さんにはなんとかして欲しいなあとは思います。

 

2:Symbol(銘柄/通貨ペア)毎にレスポンスに微少な差がある。

 現在、6通貨 USDJPY, EURUSD, EURJPY, GBPJPY, GBPUSD, AUDJPYの履歴を取得中ですが、人気?の通貨単位が入ったペアは若干のレスポンスの遅さがあります。ざっくり5%~8%ぐらいと推測。上記6通貨ペアを1年分12種足取得するプログラムを同時に走らせると、EURUSDが一番遅く、次いでUSDJPY, EURJPY, GBPUSD, GBPJPYと続いて一番速いのが AUDJPYという傾向があります。サーバーの負荷が低そうな、不人気そうな通貨ほど速くデータが取得出来る可能性はあるかもしれません。数パーセントの誤差が履歴取得プログラムの制御に影響しそうであれば考慮しても良いかもしれません。

 あと2週間ほどで6通貨の履歴取得は終わりそうなので、その後のマイナー通貨ペアのダウンロードに取りかかればもう少し正確な傾向が判るかもしれません。

 

3:東証上場廃止銘柄の履歴データ

 過去に上場廃止になった銘柄のデータは query not foundで取得出来ません。あとはそのタイミングで何時からなのですが、2017/2/6に上場廃止になった日本デジタル研究所の場合では、最終取引日2/3 Friの24:00 JST頃にデータが取得出来なくなりました。MBOなどで上場廃止になり将来復活の可能性がある銘柄などはデータを持っておきたいところなので、早めに対応することが必要かと思います。

 

4:サーバの保守メンテナンス

 土曜日15:00頃 JST~翌週土曜日12:00 JST頃までは、IBGatewayが IB証券に基本的に接続出来るようです。上記期間中でもネット回線の状態によるのかもしれませんが希にセッションが切れて再接続を IBGatewayが試行しているようです。また、Exchange毎にメンテナンスがあるのか停止することも希にあります。東証の TSEJは土曜日の早朝に10分ほど止まっていたこともありましたが、同時刻帯に IDEALPROの Forexデータは取得出来ていたことからの推測です。

 プログラム側で履歴データ取得のレスポンス待ちを組み込んでその時間を長めにとるなどの対策を組み込みつつ、土曜日の12:00~15:00 JST頃は停止することを前提にプログラムの制御を考慮した方が良いかと思います。

 

5: IB Gateway接続時には Trader Workstationにログイン出来ない

 Trader Workstationにログインすると排他制御なので、IB Gatewayのセッションが切れてデータ取得が Abortします。私のプログラムは精緻なリスタート機能は無いので面倒くさいことになります。不便なのですが、全てシステム売買にするか UIから行うかの2択なのかと思います。

 バックテスト環境構築優先でデータ取得しかしていませんが、余力がもったいないので暴落時に発注出来るようプログラム発注もそのうち試す予定です。3Q決算を出してきて値が下がった押し目買い候補がいくつかありますので。

IB証券:API接続検証、その5「ほぼ基本構造の完成とバグ取り終了」

不具合と効率性のチューニングで手間取りましたが、

為替(Forex)

東証(TSEJ)

の2種の IB証券のExchange指定から、

日本株と為替通貨ペアの詳細履歴を取得するプログラムが完成して、稼働開始しました。

ざくっと見積もると為替だけでサイズは 1TBぐらいになりそうです(汗)。

取得には2年ぐらいかかりそうです(滝汗)。

現実的では無いので、主要通貨だけの20ペア分ぐらいで良いかなと言う気もしてます。

東証株価の方はさっき出来たばかりなので、どれぐらいの期間とサイズになるか不明です。基本的に同じクラス構造の中で対応したので、さらに3つめの金融商品への対応も楽そうです。おそらくプライス情報が無料の中から UK Metalの Silve/Goldか、European BATS/Chi-X Equitiesか、OSE-Jの購読のActivationして各種指数あたりをざっくり確認中。

疲れたので途中経過のみ。

プログラミングのはまりどころや重要なポイントは次の週末ぐらいにはまとめます。たぶん。

トレステ:忘れてた諸々。

すっかり忘れてましたが、昨年の11月?、日本橋での杉原杏璃さんと、個人投資家3名の方と冷やし中華芸人を招いたプレス向けに一般参加してました。

 

実物で見るとえらい細くてびっくりしたのが杉原杏璃さん。

お腹いっぱいメシ食って好きなだけ酒飲むような生活しているオッサン女子には無理な体型だろうなあと想像。

それ以外は特に印象には残らず。マニアックな質問をしたかったけどなんか雰囲気が違ってて早々に退散しました。

 

 

あとは、メールで募集が来てた 「Easy Languageホームスタディコース」が届きました、年末に。PDFでも良いけど、最近は紙の本の見やすさにまた戻ってきてます。

5年ぐらい前に、断捨離で3,000冊ぐらいの本を裁断して全てPDF化しましたが、若干後悔しています。本って本棚での位置とラベルと厚みも調べ物をする際に大事な情報だということに気がついた次第です。

今から本をスキャンしようとしている人がもしいたら、考え直すことをお勧めします。

 

電子ファイルで事足りるのは資料性の無いどうでもいいものになります。

漫画でもたとえばゴルゴ13だと、あのダイヤを狙撃してかち割るダイヤカットダイヤって何巻だっけと思って本棚だとすぐに見つけて読めますが、電子ファイルだとそうはいかないです。

いずれ、ゴルゴとこち亀は全巻買い直しだなと思っています。

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 があるので実行。こんな感じ。

f:id:koba_tradestation:20170114101416j:plain

実際に動かすには、口座開設と1万ドル以上もしくは同等の任意の通貨での入金し、承認されて、データ情報を受け取る金融商品をアクティベートしてからになるので、ゼロから手続きすると半月ぐらいはかかると思います。

ドル円を、15分足で、midpoint中間値で、履歴データを表示させるとこんな画面になります。

f:id:koba_tradestation:20170114101809j:plain

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にリンクがありますが、各言語ごとのデモプログラムとソースが入手できます。

Interactive Brokers - API Software

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ソニーでのみチェック)

 

サンプルコードを解析しながら、データ取り込み出来るようになったらアウトライン概念からちゃんとまとめたいと思います。