【问题标题】:Node.js, bitfinex-api-node: How-to set-up correctly to process data from the websocket-connectionNode.js、bitfinex-api-node:如何正确设置以处理来自 websocket-connection 的数据
【发布时间】:2018-06-10 06:43:52
【问题描述】:

请为这个问题的不精确的标题道歉,我不是一个经验丰富的程序员,在 node.js 中更是如此

我的意图很简单:我想使用我通过 npm 安装的 bitfinex-api-node 包(bitfinex 加密货币交换的 node.js 包装器)来读取各种价格数据来自交易所的货币对来计算更好的交易策略。

readme.md 中提供的示例代码工作正常,这是一个精简版本,它创建一个 BFX 对象,该对象订阅给定货币对的代码并不断输出代码数据:

const BFX = require('bitfinex-api-node')

const API_KEY = 'secret'
const API_SECRET = 'secret'

const opts = {
  version: 2,
  transform: true
}

const bws = new BFX(API_KEY, API_SECRET, opts).ws


bws.on('open', () => {
  bws.subscribeTicker('BTCUSD') 
})

bws.on('ticker', (pair, ticker) => {
  console.log('Ticker:', ticker)
})

bws.on('error', console.error)

到目前为止一切顺利。现在为了一个简单的例子,假设我想获取两个货币对(BTC/USD、ETH/USD)的当前价格并将它们添加到显示结果中。我明显幼稚的做法是这样的:

const BFX = require('bitfinex-api-node')

const API_KEY = 'secret'
const API_SECRET = 'secret'

const opts = {
  version: 2,
  transform: true
}

const bws1 = new BFX(API_KEY, API_SECRET, opts).ws
const bws2 = new BFX(API_KEY, API_SECRET, opts).ws

var priceBTCUSD;
var priceETHBTC;

bws1.on('open', () => {
  bws1.subscribeTicker('BTCUSD') 
})
bws2.on('open', () => {
  bws2.subscribeTicker('ETHUSD') 
})

bws1.on('ticker', (pair, ticker) => {
  //console.log('Ticker1:', ticker.LAST_PRICE)
  priceBTCUSD = ticker.LAST_PRICE
})
bws2.on('ticker', (pair, ticker) => {
  //console.log('Ticker2:', ticker.LAST_PRICE)
  priceETHBTC = ticker.LAST_PRICE
})

bws1.on('error', console.error)
bws2.on('error', console.error)
//HERE IT COMES:
console.log(priceBTCUSD+priceETHBTC)

最后一行的结果输出是“NaN”。似乎在 BFX 对象建立连接并接收任何数据之前执行了将所需结果记录到控制台的最后一行。

如何正确设置?如何从接收到的数据流中检索数据?我真的需要每个货币对一个 BFX-websocket 对象吗?我将如何读取一次价格数据,关闭 websocket 连接(读取一次价格后不需要)并重新连接以读取不同货币对的价格?

谢谢!如果我的问题不够清楚,请随时请求更多数据。

亲切的问候, s

【问题讨论】:

    标签: javascript node.js npm websocket


    【解决方案1】:

    哦,你的 console.log 太早了。试试这个(我跳过了几行):

    bws1.on('ticker', (pair, ticker) => {
      //console.log('Ticker1:', ticker.LAST_PRICE)
      priceBTCUSD = ticker.LAST_PRICE;
      printResults();
    })
    bws2.on('ticker', (pair, ticker) => {
      //console.log('Ticker2:', ticker.LAST_PRICE)
      priceETHBTC = ticker.LAST_PRICE
      printResults();
    })
    
    bws1.on('error', console.error)
    bws2.on('error', console.error)
    //HERE IT COMES:
    function printResults() {
      if (priceBTCUSD && priceETHBTC)
        console.log(priceBTCUSD+priceETHBTC)  
    }
    

    现在,这不是最好的方法,但它能让你脚踏实地。更好的方法是在同一个 websocket 上询问两个价格,所以当你得到两个价格时,调用这个函数来计算你的结果。

    【讨论】:

    • 谢谢!虽然这不是 postet 问题的完整答案,但它确实让我重新思考了我的方法。我现在没有让我的程序尝试从 websocket 流对象中获取数据,而是在 websocket 函数中“建立”我的程序(我希望你知道我的意思,就像你给出的例子一样)并从内部进行各种调用。不确定这是否是预期的方法,但现在它有效!再次感谢您!
    • 嗯,您通常将您的程序作为一组模块。一个模块旨在处理 websocket 通信。传入消息路由到适当的业务组件。任何“客户”都会调用此模块来发送消息。现在,您的业务组件,它们各自处理自己的事情。例如。一个将处理所有传入的“ticker”消息。一个将处理价格比较。等等所以你不要在“websocket内部”编写程序。您只有几个路由功能,根据传入的内容,将消息路由到适当的服务或模块。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2022-08-06
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多