2020-08-03

【仮想通貨BOT】BitMEXのRealtime APIからNode.jsでデータを取得するだけのシンプルな記事

既に日本からトレードすることは出来ないBitMEXだが価格情報などをリアルタイムで取得するAPIに接続することはできる。BOT製作はデータが命。まずはデータを取得してみる。

Article Image

なぜBitMEX?

この記事はBitMEXのRealtime APIから価格等の情報を取得することを目的としている。

2020/08現在は日本から仮想通貨取引を行うことが出来ないが、大きな取引所であることは間違いないため有用なデータが配信されていると考える。

image-20200803180133293

Top Crypto Exchanges Ranked By Volume | Nomicsより、BitMEXのTransparency Ranking(取引所自身が取引量を水増ししている等の不正がないかをレイティングに加味したランキング)で年間2位のBitMEX。BB,BFが3,5位となっているのも面白い。取引量ではBitMEXは5位。

日本人ならbitFlyerが先かと思うがデータに関しての取得記事は執筆済みなのでまだの方は先にそちらを参照。

Node.jsで仮想通貨の自動取引(bitFlyer編 #1) - 初めに知っておくこと

データを取得するだけなら日本からでもOK

Realtime APIに接続するのにアカウント等必要なくデータを取得するだけならBitMEXを利用することは可能だ(IPで弾かれたりもない)

以前に使ってたユーザーも多く取引所としても比較的大きいため未だデータ取りとしては有用な取引所だと考えられる。

それに従って今からでもデータ取得をしてみたいユーザーも多いのでは、と考えた。

前提条件:Node.js

読者はNode.jsのインストールが終わっていることと最小限のNode.jsのスキルが前提。

仮想通貨Botterが使うの言語としてはPythonが多い中、これまで通りあえてNode.jsで進める。

今回はある程度初心者でも起動できるよう考慮した。

公式サンプル

リアルタイムで配信されるAPIに関して公式のサイトは次。

WebSocket API - BitMEX

ただ、どうしても英語を日本語に翻訳したような文章なので難解な表現が多い。

とりあえず面倒なことは置いておいて公式がサンプルが公開されているので使ってみる。

とりあえず動かしてみよう

サンプルをDLして実行するまでの手順を記す。

ダウンロード

公式にリンクは張ってあるがプログラム本体のトップページのリンクではないためダウンロードが出来ない。

というわけで次のトップページからDLする。

GitHub - BitMEX/api-connectors: Libraries for connecting to the BitMEX API.

CodeをクリックしDownload ZIP

image-20200803182444214

Visual Studio Codeで開く

※VS Codeである必要はないので好きなエディタで。

解凍フォルダの中のoffisial-ws > node.jsのフォルダを開く。

image-20200803182720077

上のようなファイル構成(node_modulesは最初は存在しない)

TerminalからNew Terminalを開いて

image-20200803182801261

まずは

image-20200803190315302

npm install

を実行する。

これによってパッケージにファイルにかかれてあるライブラリを自動でダウンロードしてインストールする。

初心者向けに書いておくとNode.jsnpm installというコマンドはインストールという名前が付いているが単純に同じディレクトリのnode_modulesに必要なファイルを展開するだけでパソコンのシステムに関するフォルダを一切汚さない。

私がNode.jsを好んで利用する一つの理由がこれ。いらなくなったプログラムは上のフォルダごと削除してしまえば完全にアンインストール出来るのだ。

さて、続いて同じフォルダ内で

image-20200803183215423

node example.js

と打ち込めばexample.jsが実行できる。

nodeでエラーの場合はnode.jsそのものがインストールしてないかも

DLサイト:Node.js ※最新版をDL、全部デフォルトでOK

image-20200803183502111

{"timestamp....が最下部に出ていればこれで成功。

表示するデータは内部で省略するようになっているが、受信は出来ている。

時間が経つに連れこのメッセージは更新されどんどん追加されていく。

このままでは永遠に終わらないのでctrl+cでプログラムを停止できる。

Unkown or expired symbol.

気づいた人もいるかも知れないがUnkown or expired symbol.という不穏なメッセージが出ている。

この記事執筆は2020/08で第2四半期の取り扱い先物にコードに有る「XBTZ19」が存在しないことが原因。

example.jsにて存在しないものを指定している。

client.addStream('XBTZ19', 'quote', function(data, symbol, tableName) {
//略

image-20200803184157523

2020年Q2 四半期先物リスト | BitMEX Blog

つまり上のページを見て「コード」となっているところをclient.addStreamの第一引数に入れてやれば対象のデータが流れてくるようになる。

例えばXBTU20を見たい場合は

client.addStream('XBTU20', 'quote', function(data, symbol, tableName) {
//略

このように先物はコードは期限で変わってくるので覚えておきたい。

生データを見てみよう

サンプルコードでは送られてくるデータの一部しか表示していない。

生のデータを見てみる。

client.addStream('XBTUSD', 'quote', function(data, symbol, tableName) {
  console.log(`Got update for ${tableName}:${symbol}. Current state:\n${JSON.stringify(data).slice(0, 100)}...`);
  // Do something with the table data...
});

データはJSON形式で送られてくるのでstringifyメソッドによって文字列に変換しているが

slice(0,100)というコードにより100文字に削っている。

これをカットして全文表示、更に丁度いいインデントと改行を入れてくれるコードに変換すると

console.log(`Got update for ${tableName}:${symbol}. Current state:\n${JSON.stringify(data,null,"\t")}`);

こんなかんじでどうか。

JSON.stringify()の詳細が知りたければ:JSON.stringify() - JavaScript | MDN

結果は...

Got update for quote:XBTUSD. Current state:
[
        {
                "timestamp": "2020-08-03T09:46:34.477Z",
                "symbol": "XBTUSD",
                "bidSize": 1790,
                "bidPrice": 11259,
                "askPrice": 11259.5,
                "askSize": 901
        },
        {
                "timestamp": "2020-08-03T09:46:57.667Z",
                "symbol": "XBTUSD",
                "bidSize": 1790,
                "bidPrice": 11259,
                "askPrice": 11259.5,
                "askSize": 401
        },
        {
                "timestamp": "2020-08-03T09:47:00.040Z",
                "symbol": "XBTUSD",
                "bidSize": 1520,
                "bidPrice": 11259,
                "askPrice": 11259.5,
                "askSize": 401
        },
        
        //まだ続く

データの全内容が見れた。

タイムスタンプ、シンボルの他にbid, askに関する一部データが入っている。

いわゆる板情報のベストビッド、ベストアスクの情報が送られてきているようだ。

受信するデータを変えるには

これは一部のデータに過ぎずBitMEXでは様々なデータを見ることが出来る。

このデータの種類を切り替えるには...

client.addStream('XBTUSD', 'ここに種類を入力!', function(//省略

第2引数に種類をいれてやればよい。

では、何が有るのか。

こちらも公式サイトにのっている一覧

"announcement",        // サイトのお知らせ
"chat",                // Trollbox チャット
"connected",           // 接続ユーザー/ボットの統計
"funding",             // 最新のスワップ資金調達率。 資金調達間隔ごとに送信 (通常8時間)
"instrument",          // 取引高とビッド/アスクなどの最新商品情報
"insurance",           // デイリーの保険基金に関する最新情報
"liquidation",         // ブックに記入される清算注文
"orderBookL2_25",      // レベル 2 のオーダーブックの上位 25 レベル
"orderBookL2",         // フルレベル 2 のオーダーブック
"orderBook10",         // 従来のフルブックプッシュを使用する上位 10 レベル
"publicNotifications", // システム全体への通知 (短期公開メッセージ用)
"quote",               // ブックの上位レベル
"quoteBin1m",          // 1 分足クォートビン
"quoteBin5m",          // 5 分足クォートビン
"quoteBin1h",          // 1 時間足クォートビン
"quoteBin1d",          // 1 日足クォートビン
"settlement",          // 決済
"trade",               // ライブ取引
"tradeBin1m",          // 1 分足取引ビン
"tradeBin5m",          // 5 分足取引ビン
"tradeBin1h",          // 1 時間足取引ビン
"tradeBin1d",          // 1 日足取引ビン

WebSocket API - BitMEXより

これは認証なしで見れるデータ一覧である。

認証が必要なデータは個人のポジションや約定に関するデータなので、どのみち必要ない(日本からは取引禁止)

tradeを入れてみる

第2引数をtradeにしてみる。

        {
                "timestamp": "2020-08-03T09:59:16.993Z",
                "symbol": "XBTUSD",
                "side": "Sell",
                "size": 20,
                "price": 11254,
                "tickDirection": "MinusTick",
                "trdMatchID": "b5771256-ebed-b0c6-50bc-bdae58fa996b",
                "grossValue": 177720,
                "homeNotional": 0.0017772,
                "foreignNotional": 20
        }

このような感じのデータに切り替わった。

sidesizeが有るのでどうやら約定データだ。

ざっくり見た感じでは約定データもいくつかのデータがまとまってから配信される。

したがってリアルタイムではあるがそこそこ遅延があるとも言える。

本日は以上

あまりやりすぎると混乱するのでこのあたりにする。

Node.jsに関しても最低限の知識があれば起動できてしまうシンプル設計だ。

特別マニアックなことをやらなければサンプルプログラムから受信できるデータだけで十分そうだ。

次回?

次回があるとすればclient.addStreamの第2引数に入れる項目にて「どんなデータが受信できるのか」を見ていくのが良さそうだ。

2020/08/04:次の記事を公開

【仮想通貨BOT】BitMEXのRealtime APIからどんな情報が取れるか



この記事をシェア


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