2020-08-04

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

前回は単純にAPIへの接続を試した。今回は「どんな情報が取れるのか」にフォーカスする。

Article Image

2020/08/14:更新

記事の中で「データが送られてこない」と思われていたデータがあったが

原因が「サンプルプログラムがデフォルトでテストネットに接続する仕様だったため」と判明した。

対象の箇所を再テストして記事を変更している。

前回のおさらい

前回はサンプルプログラムから認証なしで誰でも取得できる情報の一覧を記述した。

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

"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より

本日はこちらを詳しく見ていきたい。

こちらはサンプルプログラムよりaddStreamの第2引数に指定する。

client.addStream('XBTUSD', 'ここに設定!', function(data, symbol, tableName) {
  console.log(`Got update for ${tableName}:${symbol}. Current state:\n${JSON.stringify(data,null,"\t")}`);
  //省略

※ここに入ってくる変数dataには送られてきた生データではなく、送られてきたデータを内部のテーブルでinsertupdateを処理した後、そのテーブルそのものを返している可能性が高いので注意。

私も完全に把握していないが、詳細は最下部に記載。

よく使いそうなもの

BOT製作で使えそうなものから優先的に列挙する。

trade

約定履歴。

データ例は次。

        {
                "timestamp": "2020-08-04T09:35:26.037Z",
                "symbol": "XBTUSD",
                "side": "Sell",
                "size": 309,
                "price": 11389,
                "tickDirection": "ZeroMinusTick",
                "trdMatchID": "ed508a00-a219-9f68-da64-85592a2791c2",
                "grossValue": 2713020,
                "homeNotional": 0.0271302,
                "foreignNotional": 309
        }

funding

最新のスワップ資金調達率。 資金調達間隔ごとに送信 (通常8時間)

とりあえず接続した時点で1度情報が送られてくるので必ずしも配信を待つ必要はない。

ファンディングに関してはこの界隈では常識なので解説しない。

知らなければGoogleしてもらえらえればと思う。

サンプル

[
        {
                "timestamp": "2020-08-04T04:00:00.000Z",
                "symbol": "XBTUSD",
                "fundingInterval": "2000-01-01T08:00:00.000Z",
                "fundingRate": 0.00048,
                "fundingRateDaily": 0.00144
        }
]

恐らくファンディングが変わった時に送られてくると思うがかなりデータ頻度が低いので

サンプルでは自動でリコネクションが入りその度にデータを取得する形になる。

quote

ベストビット/ベストアスクの情報。

次がデータ例

    {
            "timestamp": "2020-08-04T09:37:52.086Z",
            "symbol": "XBTUSD",
            "bidSize": 677,
            "bidPrice": 11389,
            "askPrice": 11389.5,
            "askSize": 787
    }

1秒に約2回程度おくられてくる。

instrument

取引高とビッド/アスクなどの最新商品情報

1秒に約2回程度おくられてくる。

一回の情報が非常に多いので混乱するがbitFlyerで言うところのTicker感覚で使えるだろう。

サンプル

[
        {
                "symbol": "XBTUSD",
                "rootSymbol": "XBT",
                "state": "Open",
                "typ": "FFWCSX",
                "listing": "2016-05-04T12:00:00.000Z",
                "front": "2016-05-04T12:00:00.000Z",
                "expiry": null,
                "settle": null,
                "relistInterval": null,
                "inverseLeg": "",
                "sellLeg": "",
                "buyLeg": "",
                "optionStrikePcnt": null,
                "optionStrikeRound": null,
                "optionStrikePrice": null,
                "optionMultiplier": null,
                "positionCurrency": "USD",
                "underlying": "XBT",
                "quoteCurrency": "USD",
                "underlyingSymbol": "XBT=",
                "reference": "BMEX",
                "referenceSymbol": ".BXBT",
                "calcInterval": null,
                "publishInterval": null,
                "publishTime": null,
                "maxOrderQty": 10000000,
                "maxPrice": 1000000,
                "lotSize": 1,
                "tickSize": 0.5,
                "multiplier": -100000000,
                "settlCurrency": "XBt",
                "underlyingToPositionMultiplier": null,
                "underlyingToSettleMultiplier": -100000000,
                "quoteToSettleMultiplier": null,
                "isQuanto": false,
                "isInverse": true,
                "initMargin": 0.01,
                "maintMargin": 0.0035,
                "riskLimit": 20000000000,
                "riskStep": 10000000000,
                "limit": null,
                "capped": false,
                "taxed": true,
                "deleverage": true,
                "makerFee": -0.00025,
                "takerFee": 0.00075,
                "settlementFee": 0,
                "insuranceFee": 0,
                "fundingBaseSymbol": ".XBTBON8H",
                "fundingQuoteSymbol": ".USDBON8H",
                "fundingPremiumSymbol": ".XBTUSDPI8H",
                "fundingTimestamp": "2020-08-04T12:00:00.000Z",
                "fundingInterval": "2000-01-01T08:00:00.000Z",
                "fundingRate": -0.002145,
                "indicativeFundingRate": -0.00477,
                "rebalanceTimestamp": null,
                "rebalanceInterval": null,
                "openingTimestamp": "2020-08-04T07:00:00.000Z",
                "closingTimestamp": "2020-08-04T08:00:00.000Z",
                "sessionInterval": "2000-01-01T01:00:00.000Z",
                "prevClosePrice": 11231.01,
                "limitDownPrice": null,
                "limitUpPrice": null,
                "bankruptLimitDownPrice": null,
                "bankruptLimitUpPrice": null,
                "prevTotalVolume": 134666138804,
                "totalVolume": 134666182689,
                "volume": 43885,
                "volume24h": 12842521,
                "prevTotalTurnover": 1912833461391496,
                "totalTurnover": 1912833856145657,
                "turnover": 394754161,
                "turnover24h": 114417391765,
                "homeNotional24h": 1144.1739176499996,
                "foreignNotional24h": 12842521,
                "prevPrice24h": 11294.5,
                "vwap": 11224.6043,
                "highPrice": 11356,
                "lowPrice": 10900.5,
                "lastPrice": 11125.5,
                "lastPriceProtected": 11141,
                "lastTickDirection": "ZeroMinusTick",
                "lastChangePcnt": -0.015,
                "bidPrice": 11125.5,
                "midPrice": 11125.75,
                "askPrice": 11126,
                "impactBidPrice": 11125.5,
                "impactMidPrice": 11146.25,
                "impactAskPrice": 11166.9458,
                "hasLiquidity": false,
                "openInterest": 64491346,
                "openValue": 572489678442,
                "fairMethod": "FundingRate",
                "fairBasisRate": -2.3487750000000003,
                "fairBasis": -14.52,
                "fairPrice": 11265.42,
                "markMethod": "FairPrice",
                "markPrice": 11265.42,
                "indicativeTaxRate": 0,
                "indicativeSettlePrice": 11279.94,
                "optionUnderlyingPrice": null,
                "settledPrice": null,
                "timestamp": "2020-08-04T07:12:50.000Z"
        }
]

liquidation

ブックに記入される清算注文

つまり強制ロスカットの情報。

実は結構重要情報なのではないだろうか...?

※未確認だが非常に小口でも情報は流れてくるはず。

orderBook

こちらは「板」を表示する項目。

次の三種類がある

  1. "orderBookL2_25", // レベル 2 のオーダーブックの上位 25 レベル
  2. "orderBookL2", // フルレベル 2 のオーダーブック
  3. "orderBook10", // 従来のフルブックプッシュを使用する上位 10 レベル

レベル=階層という意味だと思われるが上の解説では理解不能。

公式サイトからチャートを見た時に

image-20200804175335013

このように表示されるのでレベルはどれだけたくさんの情報を取得するかの差だろう。

ただ、こちらも公式サイトが全く解説の役割を果たしていない。

次に参考になりそうな議論があった。

Which is the most realtime websocket orderbook subscription? orderBookL2 vs orderBook10 : BitMEX

すこし複雑になりそうなのでこれは別記事で調査。

人によっては使うもの

こちらはBOT製作自体には直接役に立たないものを挙げる。

ただ、BOTに組み込んでおく価値はあるかもしれない。

announcement

公式のお知らせが送られてくる模様。

API Announcements | BitMEX Blog

こちらで公開されている内容?

publicNotifications

システム全体への通知 (短期公開メッセージ用)

一時的な障害情報などだろうか?詳細不明。

insurance

デイリーの保険基金に関する最新情報

[
        {
                "currency": "XBt",
                "timestamp": "2020-08-03T12:00:00.000Z",
                "walletBalance": 1562829533595
        }
]

こちらも配信頻度が非常に低いためリコネクションで再取得になるパターンが多い。

解説に「デイリー」とあるので1日1回の更新?

walletBalanceとはなんだろうか。

BitMEX(保険基金の履歴)

ここの情報かと思われる。

BitMEX では、保険基金を使用して、取引ポジションの レバレッジの自動解消 を防いでいます。 この基金は、レバレッジ自動解消システムに引き継がれる前に、未約定の 清算 注文を取りまとめます。

保険基金は、特定のポジションの破産価格より有利な価格で清算注文が市場で執行可能な場合、清算によって増大します

こちらに解説がある

BitMEX保険基金 | BitMEX Blog

非常に難しい内容なので本当に詳しい人だけ使えばよいかと思う。

私もあまり難しいことはわからないが、単に取引所の透明性確保として公開しているデータか?

quoteBin

クォートビン。

次の種類がある。

  • "quoteBin1m", // 1 分足クォートビン
  • "quoteBin5m", // 5 分足クォートビン
  • "quoteBin1h", // 1 時間足クォートビン
  • "quoteBin1d", // 1 日足クォートビン

ビンとはなんだろうか。

1mにすると

        {
                "timestamp": "2020-08-04T09:11:00.000Z",
                "symbol": "XBTUSD",
                "bidSize": 326,
                "bidPrice": 11392,
                "askPrice": 11392.5,
                "askSize": 2141
        }

こちらの情報が1分毎に送られてくる。

それぞれの足のベストビットベストアスクに関する情報の模様。

quoteを使えばもっと細かく取れるのでどういうケースで使うべき情報なのかはわからない。

あまり使わないもの+使えないもの

あまり使わなそうなデータ類をまとめる。

chat

チャットが送られてくる。

テストネット側では殆ど発言がない。

connected

接続ユーザー/ボットの統計、とあるがこちらはデータはプログラムエラーで受信できない。

サンプルプログラムを作った時点からデータ形式が変更されているのだろうか。

詳しく調べていないがこれはテストネットでもメインネットでも同様の現象が起きる。

settlement

決済履歴関連。

決済履歴 - BitMEX

おそらくこちらの情報だと思うが、XBTUSDに関するデータが2016年のものが送られてくるだけでほの銘柄を指定しても何も取得出来ない。

肝心のXBTUSDに関しても2016年以降しばらく配信されていることになっているのだが、それすらも取得できない。

テストネットでもメインネットでも同様の状態だった。

使えないものに分類した。

[
        {
                "timestamp": "2016-08-28T12:00:00.000Z",
                "symbol": "XBTUSD",
                "settlementType": "Rebalance",
                "settledPrice": 571.71,
                "optionStrikePrice": null,
                "optionUnderlyingPrice": null,
                "bankrupt": null,
                "taxBase": null,
                "taxRate": null
        }
]

おまけ:公式サンプルプログラムの特徴

※分かる人だけ読む

※これはざっくり私がコードを確認しただけなので誤っている可能性があるので参考までに。

今回actionについては触れていないが(というかそもそも公式がactionを殆ど解説していないが)サンプルプログラムでは利用者がinsertupdateを意識せず利用できるようになっている模様。

プログラム内部で自動的にアップデートやデリートを行っている。

これはつまりデータが1回送られてくるごとにそのデータがaddstream内のdataに流れるのではなく

送られてきたデータを内部で所持しているテーブルにupdateinsertをかけたテーブル全体がdataとして表示されている。

さいごに

BitMEXのサンプルプログラムはかなり上級なコーディングがされており逆にこれをBOTに組み込もうと思うと

必然的に内部の処理の理解に工数を割く必要がありそう。

BOTで使う場合はWebsocketに接続するところから自前で組んだほうが良いかもしれない。

BitMEXと比べるとbitFlyerは初心者でもかんたんに理解できる親切設計であるということが相対的にわかる。

とはいえbitFlyerも遅延や約上の挙動が変だったり弱点があるので一長一短である。

各取引所のAPIを見て回ると色々おもしろそうだ。



この記事をシェア


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