首页 > 解决方案 > coin-base pro web socket 当前订单簿副本(2 级)

问题描述

嗨,是否可以将订单簿的最新副本保存在来自 2 级 Web 套接字提要的数组中,类似于它在网站上的方式或在作为快照返回的第一条消息中的方式

在此处输入图像描述

从 2 级更新返回的快照为 type="snapshot"

在此处输入图像描述

这就是我尝试使用 type="l2update" 重新创建的内容

在此处输入图像描述

问题是我如何使用 l2updade 来保留订单簿的准确副本,或者至少从网络套接字获取顶级询价和出价,而不是对“getProductOrderBook”进行查询

const websocket = new CoinbasePro.WebsocketClient(
  ["BTC-EUR"],
  "wss://ws-feed.pro.coinbase.com",
   null,
  { channels: [
    {
      "name": "level2"
    }
  ]
});


websocket.on('message', data => {

var bids = [];
var asks = [];
var x= 0;
var x2 = 0;

  if(data.changes[0][0] == "buy"){
      if(x <= 100){
        bids[x] = parseFloat(data.changes[0][1]);
        x++;
      }else{
        x = 0;
        bids[x] = parseFloat(data.changes[0][1]);
        x++;
      }
    }

    if(data.changes[0][0] == "sell"){
      if(x2 <= 100){
        asks[x2] = parseFloat(data.changes[0][1]);
        x2++;
      }else{
        x2 = 0;
        asks[x2] = parseFloat(data.changes[0][1]);
        x2++;
      }
    }
    console.log(data);
});

标签: javascriptnode.jswebsocketcoinbase-api

解决方案


直接在数组中做是没用的复杂。我会在对象中执行此操作,并在需要时将对象转换为数组。像(我假设product_id总是BTC-EUR):

let asks;
let bids;

websocket.on("message", data => {
  if(data.type == "snapshot") {
    asks = {};
    bids = {};

    data.asks.forEach(([price, amount]) => (asks[price] = parseFloat(amount)));
    data.bids.forEach(([price, amount]) => (bids[price] = parseFloat(amount)));

    return;
  }

  if(data.type == "l2update") data.changes.forEach(change => {
    const [action, price, amount] = change;
    const obj = action == "buy" ? bids : asks;
    const parsed = parseFloat(amount);

    if(parsed) obj[price] = parsed;
    else delete obj[price];
  });
});

比你总是可以得到数组(反之亦然,没有测试):

Object.entries(asks).map(([pr, am]) => [parseFloat(pr), am]).sort((a, b) => a[0] - b[0]);
Object.entries(bids).map(([pr, am]) => [parseFloat(pr), am]).sort((a, b) => b[0] - a[0]);

希望这可以帮助。


推荐阅读