2020-08-22

【仮想通貨BOT】BinanceのWebsocketにNode.jsで接続

BinanceのRealtime APIにwsを使って接続する。既成のライブラリに頼らずできるだけ自前でコーディングする。

Article Image

BinanceのRealtime API

BinanceのAPIドキュメントは次

Change Log – Binance API Documentation

そのなかにWebsocket Market Streamsという項目がある。

またRealtime APIというワードを使ったがBinanceではWebsocketとあるだけでリアルタイムという単語は使用されない。

今回はこちらに接続してみたい。

今回の目的

今回はBinanceのWebsocket APIに接続しデータが取得するところまでを目標とする。

データの詳しい項目までは見ない。

Node.js

本日もNode.jsを使用する。基本的なプロジェクトの立ち上げ方などは解説しない。

Websocketの接続にはBitMEX同様wsというパッケージを利用する。

wsインストール用のコマンドは次

npm install ws

今回のコード

基本はBitMEXとほぼ同様のコードで動作する。

まずは今回私が書いたコード

import ws from 'ws'
const socket = new ws('wss://stream.binance.com:9443/ws')

socket.on('open', () => {
    console.log("Connected.")
    socket.send(JSON.stringify(
        {
            "method": "SUBSCRIBE",
            "params":
                [
                    "btcusdt@aggTrade"
                ],
            "id": 1
        }
    ));
})

socket.on('message', (data) => {
    console.log(`---- Message -----`) 
    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}`)
})

アカウントの認証なしでも接続できる。

実行結果

次のようなメッセージが流れてくる。目視では確認できない量である。

{
  e: 'aggTrade',
  E: 1597823268133,
  s: 'BTCUSDT',
  a: 357021403,
  p: '11791.49000000',
  q: '0.04648600',
  f: 389181059,
  l: 389181059,
  T: 1597823268131,
  m: true,
  M: true
}

メッセージの内容や受信するチャンネルの種類については今回は考慮しない。

接続とデータが取得できたので今回は完了。

コード解説

基本は前回のBitMEXで使用したコードではあるが、少し間違えやすい箇所を解説しておく。

エンドポイント

公式では

wss://stream.binance.com:9443

こちらに接続するよう書いてあるが、実際のコードにはアドレスに/wsを付与して

const socket = new ws('wss://stream.binance.com:9443/ws')

上のようにしなければ正しく接続できない。

※そうしないとunexpected-responseのイベントが発生する。

openイベントの中のsocket.send

socket.send(JSON.stringify(
    {
        "method": "SUBSCRIBE",
        "params":
        [
            "btcusdt@aggTrade"
        ],
        "id": 1
    }
));

こちらは公式の冒頭にある送信データのサンプル。

paramsの配列に複数のchを記載して同時に複数のデータを受信できる。

通貨ペア@データの種類で指定する模様。

BitMEX同様JSON形式で要求すれば良いようなのでJSON.stringifyを使う。

以上

本日はこれだけ。

とりあえずデータが取得できたので良い。

実際にデータを使用していく場合は中身の理解が必要なので次回はもう少し深堀りしてみたい。



この記事のタグ

この記事をシェア


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