前回の記事
【仮想通貨BOT】BitMEXのRealtime APIに自作コードで接続 | Blog
前回は単純にBitMEXのRealtime APIに接続するだけのコードだった。
このままでは何も情報が送られてこないので「どの情報がほしいか」を送信してやることにより
データが送られてくる状態に進む。
この「どの情報がほしいか」を送信してデータの受信を開始することを「購読(subscribe)」と呼ぶ。
ではどうやって購読を開始するのだろうか。
公式では次のように解説がある。
接続済みで新しいトピックの購読を希望する場合は、次の形式でメッセージを送信します。
{"op": "subscribe", "args": [<SubscriptionTopic>]}
なるほど、わからん。
公式は上級者向けなのでコーディングに関するヒントは殆ど無い。
今回は通信にws
というライブラリを使っている。こちらは公式サンプルでも使用しているWebsocket
通信を行うもの。
また公式ドキュメントの通り { }
でくくられたデータはJavaScript
ではJSON
と呼ばれる形式だ。
JSON
というデータ形式に関しては他サイトに譲るが、とにかくこれを送信する方法を知らねばならない。
ws
ではsend
というメソッドでデータを送る。
まず前回のコードから「接続するだけ」の部分を抜き出すと
import ws from 'ws'
const socket = new ws('wss://www.bitmex.com/realtime')
socket.on('open', () => {
console.log("Connected.")
})
socket.on('message', (data, flags) => {
console.log(`message: ${data}, ${flags}`)
});
このコードを実行するだけで
Connected.
message: {"info":"Welcome to the BitMEX Realtime API.", ...省略
といったデータが送信されてくる。
つまり接続は完了されているということと.on
のopen
とmessage
イベントが発生している、ということがわかる。
message
イベントに書いてしまうとAPI側からなにかデータが送られてくる度に購読メッセージが送信されてしまうのでopen
の中に次のコードを追記する
socket.send(JSON.stringify({op: 'subscribe', args: ['funding:XBTUSD']}));
※実際の通信ではテキストデータで取りが行われるのでJSON.stringify
によりJSONデータをテキスト形式に変換して送る必要がある。
覚えておく点は
op
は'subscribe'
で固定args
の中に配列としていくつも並べられる'トピック:銘柄'
」で書く。ここでは'funding:XBTUSD'
あえて今回funding
にしたのは目視しやすいようデータ量が少ないものを選んだ。
指定できるトピック一覧はこちら
ではここで一度全体コードを貼り付ける
import ws from 'ws'
const socket = new ws('wss://www.bitmex.com/realtime')
socket.on('open', () => {
console.log("Connected.")
socket.send(JSON.stringify({op: 'subscribe', args: ['funding:XBTUSD']}));
})
socket.on('message', (data, flags) => {
console.log(`message: ${flags}`)
console.log(JSON.parse(data))
});
socket.on('close', (code) => {
console.log(code)
})
socket.on('error', (e) => {
console.log(e)
})
socket.on('unexpected-response', (request, response) => {
console.log(`unexpected-response: ${request}, ${response}`)
})
message
の中にデータを表示するデバッグコードを入れた
message: undefined
{
success: true,
subscribe: 'funding:XBTUSD',
request: { op: 'subscribe', args: [ 'funding:XBTUSD' ] }
}
message: undefined
{
table: 'funding',
action: 'partial',
keys: [ 'timestamp', 'symbol' ],
types: {
timestamp: 'timestamp',
symbol: 'symbol',
fundingInterval: 'timespan',
fundingRate: 'float',
fundingRateDaily: 'float'
},
foreignKeys: { symbol: 'instrument' },
attributes: { timestamp: 'sorted', symbol: 'grouped' },
filter: { symbol: 'XBTUSD' },
data: [
{
timestamp: '2020-08-17T04:00:00.000Z',
symbol: 'XBTUSD',
fundingInterval: '2000-01-01T08:00:00.000Z',
fundingRate: 0.0001,
fundingRateDaily: 0.00030000000000000003
}
]
}
しっかりデータがはいってきているので成功だ。
これでfunding
に関するデータの購読が完了した。
あとは自由に欲しいデータを購読すればどんどんデータを受信することができる。
データの内容まで深堀りしないが、ひとまず完了とする。