2020-08-20

【仮想通貨BOT】BitMEXのRealtime APIに自前コードで接続 #2

BitMEXのサンプルプログラムに依存せず自前コードで接続する。第二回目

Article Image

前回までのおさらい

前回の記事

【仮想通貨BOT】BitMEXのRealtime APIに自作コードで接続 | Blog

前回は単純にBitMEXのRealtime APIに接続するだけのコードだった。

今回の目標:購読(subscribe)

このままでは何も情報が送られてこないので「どの情報がほしいか」を送信してやることにより

データが送られてくる状態に進む。

この「どの情報がほしいか」を送信してデータの受信を開始することを「購読(subscribe)」と呼ぶ。

公式のドキュメント

ではどうやって購読を開始するのだろうか。

公式では次のように解説がある。

接続済みで新しいトピックの購読を希望する場合は、次の形式でメッセージを送信します。

{"op": "subscribe", "args": [<SubscriptionTopic>]}

なるほど、わからん。

公式は上級者向けなのでコーディングに関するヒントは殆ど無い。

データを「送信」する方法

今回は通信にwsというライブラリを使っている。こちらは公式サンプルでも使用しているWebsocket通信を行うもの。

ws - npm

また公式ドキュメントの通り { } でくくられたデータは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.", ...省略

といったデータが送信されてくる。

つまり接続は完了されているということと.onopenmessageイベントが発生している、ということがわかる。

openイベント内に購読コードを記載

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に関するデータの購読が完了した。

あとは自由に欲しいデータを購読すればどんどんデータを受信することができる。

データの内容まで深堀りしないが、ひとまず完了とする。



この記事のタグ

この記事をシェア


謎の技術研究部 (謎技研)