bitflyer

bitFlyerの板情報をリアルタイムに取る

新APIとPubNub配信の廃止

公式のAPIドキュメントが更新されて、PubNubでの配信は廃止を検討中となっていた。
廃止時期は不明。
bitflyer Realtime API

  • Socket.IO 2.0 (WebSocket)
  • JSON-RPC 2.0 の2つが新しく追加されていた。

twitterの評判を眺めた限りだと、JSON-RPCのほうが抜け漏れが少ないらしいので、そちらに移行予定。

概要

bitFlyerのリアルタイムAPIをつかって、板情報を取得するのを試したメモ
価格のサンプルはあるが、板のサンプルがないため作ってみた

API情報

bitFlyerのAPIは、PubNubを利用してリアルタイムの更新情報を配信している。
板情報は口座や認証なしで取得が可能
レスポンスの量が多いせいか、2つのチャンネルに分かれている。

  • lightning_board_snapshot_BTC_JPY
    • 板情報全体が流れてくるチャンネル
    • だいたい10分毎ぐらいにながれてくる。
  • lightning_board_BTC_JPY
    • 差分情報がリアルタイムに流れてくるチャンネル こちらはほぼリアルタイム
  • lightning_ticker_BTC_JPY
    • 本来は必要ないが、差分の抜け漏れが発生する場合、このチャネルを使って補正する

取得サンプル

pubnubのsubscribeで一度にchannelを複数指定できる。

channel名が流れてくるので、スナップショットか差分情報かも判断がつく。
スナップショットを取得した後、差分情報をつかって更新することで板情報を再現できそう。

var PubNub = require('pubnub');
var pubnub = new PubNub({
  subscribeKey: 'sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f'
});
pubnub.addListener({
  message: function (message) {
    // pubnubの配信時刻 unixtime+ナノ秒
    // console.log(message.channel, message.timetoken);
    console.log(message.channel, message.message);
  }                                                                                                                                                                        });

//複数のchannelをsubscribeすることができる
pubnub.subscribe({                                                                                                                                                           
  channels: ["lightning_board_BTC_JPY",
             "lightning_board_snapshot_BTC_JPY"],
});

消えた価格帯はどうなるか

priceに価格帯、sizeが0として流れてくる

lightning_board_BTC_JPY { mid_price: 2150320,
  bids: [ { price: 2147720, size: 0 } ],
  asks: [ { price: 2150632, size: 0.432 }, { price: 2153639, size: 0 } ] }

罠1

ただし差分の抜け漏れが2017年9月から2017年12月末ごろまで発生していた。
約定して消えたはずの板が残り続ける減少が発生していた。
暫定対策として、tickerのチャネルを受信してbest ask, best bid間の板を消すようにした

参考情報

https://twitter.com/bF_TASK/status/911568891960188928
https://twitter.com/ksudo/status/908949830612873216

罠2

bitflyerは毎日日本時間の4:00~4:10は定期メンテとなる。
4:11ごろから板寄せが行われる。
(注文はできるが約定しない?)この間もリアルタイムAPIに、データが流れてくる。
加えて、price:0のデータが流れてくる(何を表すものなのか不明)
このデータも差分の抜け漏れが発生することがある

ちなみに、cryptowatchのグラフではこの時間帯はデータなし扱いになっている。

残り課題

  • 差分の時刻情報がレスポンスにないので、スナップショットの配信が遅延するとずれそうな気がする。。。
    • pubnubの配信時刻(message.timetoken)の値を使うしかなさそう