新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)の値を使うしかなさそう