Node.js, bitfinex-api-node: как правильно настроить обработку данных через соединение websocket

1

пожалуйста, извините нечеткое название для этого вопроса, я не опытный программист, а тем более в node.js

Мое намерение является простым: я хочу использовать пакет bitfinex-api-node (обертка node.js для обмена криптовалютами bitfinex), который я установил через npm, чтобы читать данные о ценах различных валютных пар из биржи, чтобы рассчитать лучшую торговлю стратегии.

Код примера, представленный в 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 (которое не нужно после прочтения цены один раз) и повторно подключится, чтобы прочитать цену для другой валютной пары?

Спасибо! Не стесняйтесь запрашивать больше данных, если мой вопрос недостаточно ясен.

С наилучшими пожеланиями, с

Теги:
websocket
npm

1 ответ

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)  
}

Теперь это не самый лучший подход, но он дает вам основание. Лучше всего иметь две цены, заданные на одном и том же веб-сайте, поэтому, когда вы получите обе цены обратно, вызовите эту функцию, чтобы вычислить ваши результаты.

  • 0
    Спасибо! хотя это не полный ответ на вопрос постета, это действительно заставило меня переосмыслить свой подход. Вместо того, чтобы моя программа пыталась извлечь данные из объекта потока веб-сокетов, я теперь «основываю» свою программу внутри функции веб-сокета (надеюсь, вы понимаете, что я имею в виду, так же, как и в приведенном вами примере), и выполняю различные вызовы изнутри. Не уверен, что это намеченный способ сделать это, но сейчас это работает! Еще раз спасибо!
  • 0
    Ну, вы обычно основываете свою программу как набор модулей. Один модуль предназначен для обработки веб-сокетов. Входящие сообщения направляются в соответствующие бизнес-компоненты. Любые «клиенты» вызывают этот модуль для исходящих сообщений. Теперь, ваши бизнес-компоненты, каждый из них справляется со своими задачами. Например, один будет обрабатывать все входящие сообщения о тикерах. Один будет обрабатывать сравнения цен. И т.д. Итак, вы не пишете программу "внутри websocket". У вас просто есть несколько функций маршрутизации, которые, в зависимости от того, что пришло, направляют сообщение в соответствующий сервис или модуль.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню