Javascript Node.js,bitfinex api节点:如何正确设置以处理来自websocket连接的数据
请为这个问题的标题不准确表示歉意,我不是一个有经验的程序员,在node.js中更是如此 我的意图很简单:我想使用我通过npm安装的bitfinex api节点包(bitfinex cryptocurrency exchange的node.js包装),从交易所读取各种货币对的价格数据,以计算更好的交易策略 readme.md中提供的示例代码运行良好,这是一个精简版本,创建一个BFX对象,该对象订阅给定货币对的股票代码,并不断输出股票代码数据:Javascript Node.js,bitfinex api节点:如何正确设置以处理来自websocket连接的数据,javascript,node.js,npm,websocket,Javascript,Node.js,Npm,Websocket,请为这个问题的标题不准确表示歉意,我不是一个有经验的程序员,在node.js中更是如此 我的意图很简单:我想使用我通过npm安装的bitfinex api节点包(bitfinex cryptocurrency exchange的node.js包装),从交易所读取各种货币对的价格数据,以计算更好的交易策略 readme.md中提供的示例代码运行良好,这是一个精简版本,创建一个BFX对象,该对象订阅给定货币对的股票代码,并不断输出股票代码数据: const BFX = require('bitfin
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太快了。试试这个(我跳过了几行):
现在,这不是最好的方法,但它让你的地面。更好的方法是在同一个websocket上查询两个价格,因此当您返回两个价格时,请调用此函数计算结果。谢谢!虽然这不是postet问题的完整答案,但它确实让我重新思考了我的方法。我的程序不再试图从websocket流对象获取数据,而是将我的程序“基于”在websocket函数中(我希望您知道我的意思,就像您给出的示例一样),并从内部进行各种调用。不确定这是否是预期的方式,但现在它的工作!再次感谢你!嗯,你通常把你的程序建立在一组模块的基础上。一个模块用于处理websocket通信。传入消息路由到适当的业务组件。任何“客户机”都会调用此模块以获取传出消息。现在,您的业务组件,它们各自处理自己的事情。例如,其中一个将处理所有传入的“ticker”消息。其中一个将处理价格比较。等等,所以你不写程序“在websocket内部”。您只有一些路由功能,根据传入的内容,将消息路由到适当的服务或模块。
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)
}