пожалуйста, извините нечеткое название для этого вопроса, я не опытный программист, а тем более в 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 (которое не нужно после прочтения цены один раз) и повторно подключится, чтобы прочитать цену для другой валютной пары?
Спасибо! Не стесняйтесь запрашивать больше данных, если мой вопрос недостаточно ясен.
С наилучшими пожеланиями, с
О, ваш 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)
}
Теперь это не самый лучший подход, но он дает вам основание. Лучше всего иметь две цены, заданные на одном и том же веб-сайте, поэтому, когда вы получите обе цены обратно, вызовите эту функцию, чтобы вычислить ваши результаты.