BitMex APIサンプルコード 第二回

さて第二回はストップ注文とwebsocketを使って注文をリアルタイムて取得します。

注文を出した後APIで注文が通ったかとか、注文管理してもいいのですが、リクエスト制限などもあるためできればsocketを使うといいでしょう。

※このnoteにあるコードはあくまで一例です。もっといい方法、早い方法などあるかもしれないので是非各自で研究して見てください!

今回もNode.jsで書いていきます。

ではまずストップ注文

var request = require('request');
var crypto = require('crypto');

var key = 'APIkey';
var secret = 'secret';

//価格>11111 になったら100枚買う
order_stop('Buy', 100, 11111);

//order_stop('Sell', 100, 5555);

function order_stop (_side, _size, _stopPx) {
   
   var timestamp = parseInt(Date.now() / 1000 + 60);
   var path = "/api/v1/order";
   var body = JSON.stringify({
                             symbol: "XBTUSD",
                             side: _side,
                             orderQty: _size,
                             //price: 0,
                             stopPx: _stopPx,
                             ordType: 'Stop',
                             //clOrdID: "clOrdID"
                             });
   var url = "https://www.bitmex.com" + path;
   var mathod = "POST";
   var text = mathod + path + timestamp + body;
   var sign = crypto.createHmac('sha256', secret).update(text).digest('hex');
   var options = {
   url: url,
   method: mathod,
   body: body,
   headers: {
       'Content-Type': 'application/json',
       'Accept': 'application/json',
       'X-Requested-With': 'XMLHttpRequest',
       'api-expires': timestamp,
       'api-key': key,
       'api-signature': sign,
   }
   };
   
   
   request(options, function (err, response, payload) {
           if (!payload) {return;}
           var getData = JSON.parse(payload);
           
           if (getData.error) {
           console.log("message:", getData.error.message);
           console.log("name:", getData.error.name);
           return;
           }
           
           console.log("orderID:", getData.orderID);
           console.log("clOrdID:", getData.clOrdID);
           console.log("clOrdLinkID:", getData.clOrdLinkID);
           console.log("account:", getData.account);
           console.log("symbol:", getData.symbol);
           console.log("side:", getData.side);
           console.log("simpleOrderQty:", getData.simpleOrderQty);
           console.log("orderQty:", getData.orderQty);
           console.log("price:", getData.price);
           console.log("displayQty:", getData.displayQty);
           console.log("stopPx:", getData.stopPx);
           console.log("pegOffsetValue:", getData.pegOffsetValue);
           console.log("pegPriceType:", getData.pegPriceType);
           console.log("currency:", getData.currency);
           console.log("settlCurrency:", getData.osettlCurrency);
           console.log("ordType:", getData.ordType);
           console.log("timeInForce:", getData.timeInForce);
           console.log("execInst:", getData.execInst);
           console.log("contingencyType:", getData.contingencyType);
           console.log("exDestination:", getData.exDestination);
           console.log("ordStatus:", getData.ordStatus);
           console.log("triggered:", getData.triggered);
           console.log("workingIndicator:", getData.workingIndicator);
           console.log("ordRejReason:", getData.ordRejReason);
           console.log("simpleLeavesQty:", getData.simpleLeavesQty);
           console.log("leavesQty:", getData.leavesQty);
           console.log("simpleCumQty:", getData.simpleCumQty);
           console.log("cumQty:", getData.cumQty);
           console.log("avgPx:", getData.avgPx);
           console.log("multiLegReportingType:", getData.multiLegReportingType);
           console.log("text:", getData.text);
           console.log("transactTime:", getData.transactTime);
           console.log("timestamp:", getData.timestamp);
           });
   
}

第一回とあまり変わらないですね

注意点としてstopPx(ストップのトリガー価格)を入れますが、price入れないことです。

はいこれだけですね笑

では次socketの方に行きます。

npm install ws
var request = require('request');
var crypto = require('crypto');

var key = 'APIkey';
var secret = 'secret';


BitMex_websocket();

function BitMex_websocket() {
   var WebSocket = require('ws')
   
   //opened
   var connection_bitmex = new WebSocket("wss://www.bitmex.com/realtime");

   connection_bitmex.onopen = function () {
       console.log("OPEN:BITMEX");
       
       var timestamp = parseInt(Date.now() / 1000 + 60);
       var text = 'GET/realtime' + timestamp;
       var sign = crypto.createHmac('sha256', secret).update(text).digest('hex');
       var signup = JSON.stringify({
                                     op:"authKey",
                                     args:[
                                           key,
                                           timestamp,
                                           sign
                                           ]
                                     });
       connection_bitmex.send(signup);
       //////////////////////////////
       var getMyOrder = JSON.stringify({
                                   op:"subscribe",
                                   args:['order']
                                   });
       connection_bitmex.send(getMyOrder);
       
   };
   
   connection_bitmex.onmessage = function (e) {
       if (!e) {
           return;
       }
       var getData = JSON.parse(e.data);
       if (getData.table == "order") {
           for (i in getData.data) {
               console.log(getData.data[i]);
               //getData.data[i].ordStatus の値によってちゃんと注文できたかがわかります。
               //例cancelならちゃんと注文できていない。
           }
       } else {
           console.log(getData);
       }
   };
   
   //ERROR
   connection_bitmex.onerror = function (error) {
       console.log('WebSocket Error (BITMEX)' + error);
   };
   
}


最初にsocketでアクセスするとその時点で既にある注文リストが送られてきます。そして以降新規注文、キャンセル、注文が約定するたびに

その情報が送られてきますので注文の管理がとても楽になります!

botで再起動しないといけなくなっても、初回アクセスで全注文リストが送られてくるのはありがたいですよね。


ちょっと走り気味になりましたが今回はこんなところで終わります!

ツイッターで質問、要望など何かありましたら遠慮なくどうぞ。


最後に一言、ccxtが有用すぎてこの記事の需要なさそう!くやしーw

この記事が気に入ったらサポートをしてみませんか?