記事の中で「データが送られてこない」と思われていたデータがあったが
原因が「サンプルプログラムがデフォルトでテストネットに接続する仕様だったため」と判明した。
対象の箇所を再テストして記事を変更している。
前回はサンプルプログラムから認証なしで誰でも取得できる情報の一覧を記述した。
【仮想通貨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 日足取引ビン
本日はこちらを詳しく見ていきたい。
こちらはサンプルプログラムより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
には送られてきた生データではなく、送られてきたデータを内部のテーブルでinsert
やupdate
を処理した後、そのテーブルそのものを返している可能性が高いので注意。
私も完全に把握していないが、詳細は最下部に記載。
BOT製作で使えそうなものから優先的に列挙する。
約定履歴。
データ例は次。
{
"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
}
最新のスワップ資金調達率。 資金調達間隔ごとに送信 (通常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
}
]
恐らくファンディングが変わった時に送られてくると思うがかなりデータ頻度が低いので
サンプルでは自動でリコネクションが入りその度にデータを取得する形になる。
ベストビット/ベストアスクの情報。
次がデータ例
{
"timestamp": "2020-08-04T09:37:52.086Z",
"symbol": "XBTUSD",
"bidSize": 677,
"bidPrice": 11389,
"askPrice": 11389.5,
"askSize": 787
}
1秒に約2回程度おくられてくる。
取引高とビッド/アスクなどの最新商品情報
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"
}
]
ブックに記入される清算注文
つまり強制ロスカットの情報。
実は結構重要情報なのではないだろうか...?
※未確認だが非常に小口でも情報は流れてくるはず。
こちらは「板」を表示する項目。
次の三種類がある
レベル=階層という意味だと思われるが上の解説では理解不能。
公式サイトからチャートを見た時に
このように表示されるのでレベルはどれだけたくさんの情報を取得するかの差だろう。
ただ、こちらも公式サイトが全く解説の役割を果たしていない。
次に参考になりそうな議論があった。
Which is the most realtime websocket orderbook subscription? orderBookL2 vs orderBook10 : BitMEX
すこし複雑になりそうなのでこれは別記事で調査。
こちらはBOT製作自体には直接役に立たないものを挙げる。
ただ、BOTに組み込んでおく価値はあるかもしれない。
公式のお知らせが送られてくる模様。
API Announcements | BitMEX Blog
こちらで公開されている内容?
システム全体への通知 (短期公開メッセージ用)
一時的な障害情報などだろうか?詳細不明。
デイリーの保険基金に関する最新情報
[
{
"currency": "XBt",
"timestamp": "2020-08-03T12:00:00.000Z",
"walletBalance": 1562829533595
}
]
こちらも配信頻度が非常に低いためリコネクションで再取得になるパターンが多い。
解説に「デイリー」とあるので1日1回の更新?
walletBalance
とはなんだろうか。
BitMEX(保険基金の履歴)
ここの情報かと思われる。
BitMEX では、保険基金を使用して、取引ポジションの レバレッジの自動解消 を防いでいます。 この基金は、レバレッジ自動解消システムに引き継がれる前に、未約定の 清算 注文を取りまとめます。
保険基金は、特定のポジションの破産価格より有利な価格で清算注文が市場で執行可能な場合、清算によって増大します
こちらに解説がある
非常に難しい内容なので本当に詳しい人だけ使えばよいかと思う。
私もあまり難しいことはわからないが、単に取引所の透明性確保として公開しているデータか?
クォートビン。
次の種類がある。
ビンとはなんだろうか。
1mにすると
{
"timestamp": "2020-08-04T09:11:00.000Z",
"symbol": "XBTUSD",
"bidSize": 326,
"bidPrice": 11392,
"askPrice": 11392.5,
"askSize": 2141
}
こちらの情報が1分毎に送られてくる。
それぞれの足のベストビットベストアスクに関する情報の模様。
quote
を使えばもっと細かく取れるのでどういうケースで使うべき情報なのかはわからない。
あまり使わなそうなデータ類をまとめる。
チャットが送られてくる。
テストネット側では殆ど発言がない。
接続ユーザー/ボットの統計、とあるがこちらはデータはプログラムエラーで受信できない。
サンプルプログラムを作った時点からデータ形式が変更されているのだろうか。
詳しく調べていないがこれはテストネットでもメインネットでも同様の現象が起きる。
決済履歴関連。
おそらくこちらの情報だと思うが、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
を殆ど解説していないが)サンプルプログラムでは利用者がinsert
やupdate
を意識せず利用できるようになっている模様。
プログラム内部で自動的にアップデートやデリートを行っている。
これはつまりデータが1回送られてくるごとにそのデータがaddstream
内のdata
に流れるのではなく
送られてきたデータを内部で所持しているテーブルにupdate
やinsert
をかけたテーブル全体がdata
として表示されている。
BitMEXのサンプルプログラムはかなり上級なコーディングがされており逆にこれをBOTに組み込もうと思うと
必然的に内部の処理の理解に工数を割く必要がありそう。
BOTで使う場合はWebsocket
に接続するところから自前で組んだほうが良いかもしれない。
BitMEXと比べるとbitFlyerは初心者でもかんたんに理解できる親切設計であるということが相対的にわかる。
とはいえbitFlyerも遅延や約上の挙動が変だったり弱点があるので一長一短である。
各取引所のAPIを見て回ると色々おもしろそうだ。