UNPKG

@hackape/tardis-dev

Version:

Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js

160 lines 5.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FTXLiquidationsMapper = exports.FTXDerivativeTickerMapper = exports.FTXBookChangeMapper = exports.mapBookLevel = exports.FTXTradesMapper = void 0; const handy_1 = require("../handy"); const mapper_1 = require("./mapper"); // https://docs.ftx.com/#websocket-api class FTXTradesMapper { constructor(_exchange) { this._exchange = _exchange; } canHandle(message) { if (message.data == undefined) { return false; } return message.channel === 'trades'; } getFilters(symbols) { return [ { channel: 'trades', symbols } ]; } *map(ftxTrades, localTimestamp) { for (const ftxTrade of ftxTrades.data) { const timestamp = new Date(ftxTrade.time); timestamp.μs = handy_1.parseμs(ftxTrade.time); yield { type: 'trade', symbol: ftxTrades.market, exchange: this._exchange, id: ftxTrade.id !== null ? String(ftxTrade.id) : undefined, price: ftxTrade.price, amount: ftxTrade.size, side: ftxTrade.side, timestamp, localTimestamp }; } } } exports.FTXTradesMapper = FTXTradesMapper; exports.mapBookLevel = (level) => { const price = level[0]; const amount = level[1]; return { price, amount }; }; class FTXBookChangeMapper { constructor(_exchange) { this._exchange = _exchange; } canHandle(message) { if (message.data == undefined) { return false; } return message.channel === 'orderbook'; } getFilters(symbols) { return [ { channel: 'orderbook', symbols } ]; } *map(ftxOrderBook, localTimestamp) { const isEmptyUpdate = ftxOrderBook.type === 'update' && ftxOrderBook.data.bids.length === 0 && ftxOrderBook.data.asks.length === 0; if (isEmptyUpdate) { return; } const timestamp = new Date(ftxOrderBook.data.time * 1000); timestamp.μs = Math.floor(ftxOrderBook.data.time * 1000000) % 1000; yield { type: 'book_change', symbol: ftxOrderBook.market, exchange: this._exchange, isSnapshot: ftxOrderBook.type === 'partial', bids: ftxOrderBook.data.bids.map(exports.mapBookLevel), asks: ftxOrderBook.data.asks.map(exports.mapBookLevel), timestamp, localTimestamp }; } } exports.FTXBookChangeMapper = FTXBookChangeMapper; class FTXDerivativeTickerMapper { constructor(_exchange) { this._exchange = _exchange; this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper(); } canHandle(message) { if (message.data == undefined) { return false; } return message.channel === 'instrument'; } getFilters(symbols) { return [ { channel: 'instrument', symbols } ]; } *map(message, localTimestamp) { const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.market, this._exchange); const { stats, info } = message.data; if (stats.nextFundingTime !== undefined) { pendingTickerInfo.updateFundingTimestamp(new Date(stats.nextFundingTime)); pendingTickerInfo.updateFundingRate(stats.nextFundingRate); } pendingTickerInfo.updateIndexPrice(info.index); pendingTickerInfo.updateMarkPrice(info.mark); pendingTickerInfo.updateLastPrice(info.last); pendingTickerInfo.updateOpenInterest(stats.openInterest); pendingTickerInfo.updateTimestamp(localTimestamp); if (pendingTickerInfo.hasChanged()) { yield pendingTickerInfo.getSnapshot(localTimestamp); } } } exports.FTXDerivativeTickerMapper = FTXDerivativeTickerMapper; class FTXLiquidationsMapper { canHandle(message) { if (message.data == undefined) { return false; } return message.channel === 'trades'; } getFilters(symbols) { return [ { channel: 'trades', symbols } ]; } *map(ftxTrades, localTimestamp) { for (const ftxTrade of ftxTrades.data) { if (ftxTrade.liquidation) { const timestamp = new Date(ftxTrade.time); timestamp.μs = handy_1.parseμs(ftxTrade.time); yield { type: 'liquidation', symbol: ftxTrades.market, exchange: 'ftx', id: ftxTrade.id !== null ? String(ftxTrade.id) : undefined, price: ftxTrade.price, amount: ftxTrade.size, side: ftxTrade.side, timestamp, localTimestamp }; } } } } exports.FTXLiquidationsMapper = FTXLiquidationsMapper; //# sourceMappingURL=ftx.js.map