@hackape/tardis-dev
Version:
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
176 lines (149 loc) • 4.8 kB
text/typescript
import { Mapper, PendingTickerInfoHelper } from './mapper'
import { Trade, BookChange, DerivativeTicker } from '../types'
const fromMicroSecondsToDate = (micros: number) => {
const timestamp = new Date(micros / 1000)
timestamp.μs = micros % 1000
return timestamp
}
export class DeltaTradesMapper implements Mapper<'delta', Trade> {
constructor(private _useV2Channels: boolean) {}
canHandle(message: DeltaTrade) {
return message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade')
}
getFilters(symbols?: string[]) {
return [
{
channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
symbols
} as const
]
}
*map(message: DeltaTrade, localTimestamp: Date): IterableIterator<Trade> {
yield {
type: 'trade',
symbol: message.symbol,
exchange: 'delta',
id: undefined,
price: Number(message.price),
amount: message.size,
side: message.buyer_role === 'taker' ? 'buy' : 'sell',
timestamp: fromMicroSecondsToDate(message.timestamp),
localTimestamp: localTimestamp
}
}
}
const mapBookLevel = (level: DeltaBookLevel) => {
return {
price: Number(level.limit_price),
amount: level.size
}
}
export const deltaBookChangeMapper: Mapper<'delta', BookChange> = {
canHandle(message: DeltaL2OrderBook) {
return message.type === 'l2_orderbook'
},
getFilters(symbols?: string[]) {
return [
{
channel: 'l2_orderbook',
symbols
} as const
]
},
*map(message: DeltaL2OrderBook, localTimestamp: Date): IterableIterator<BookChange> {
yield {
type: 'book_change',
symbol: message.symbol,
exchange: 'delta',
isSnapshot: true,
bids: message.buy.map(mapBookLevel),
asks: message.sell.map(mapBookLevel),
timestamp: message.timestamp !== undefined ? fromMicroSecondsToDate(message.timestamp) : localTimestamp,
localTimestamp
}
}
}
export class DeltaDerivativeTickerMapper implements Mapper<'delta', DerivativeTicker> {
constructor(private _useV2Channels: boolean) {}
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
canHandle(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate) {
return (
message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade') ||
message.type === 'funding_rate' ||
message.type === 'mark_price'
)
}
getFilters(symbols?: string[]) {
return [
{
channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
symbols
} as const,
{
channel: 'funding_rate',
symbols
} as const,
{
channel: 'mark_price',
symbols
} as const
]
}
*map(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate, localTimestamp: Date): IterableIterator<DerivativeTicker> {
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol.replace('MARK:', ''), 'delta')
if (message.type === 'recent_trade' || message.type === 'all_trades') {
pendingTickerInfo.updateLastPrice(Number(message.price))
}
if (message.type === 'mark_price') {
pendingTickerInfo.updateMarkPrice(Number(message.price))
}
if (message.type === 'funding_rate') {
if (message.funding_rate !== undefined) {
pendingTickerInfo.updateFundingRate(Number(message.funding_rate))
}
if (message.predicted_funding_rate !== undefined) {
pendingTickerInfo.updatePredictedFundingRate(Number(message.predicted_funding_rate))
}
if (message.next_funding_realization !== undefined) {
pendingTickerInfo.updateFundingTimestamp(fromMicroSecondsToDate(message.next_funding_realization))
}
}
pendingTickerInfo.updateTimestamp(fromMicroSecondsToDate(message.timestamp))
if (pendingTickerInfo.hasChanged()) {
yield pendingTickerInfo.getSnapshot(localTimestamp)
}
}
}
type DeltaTrade = {
buyer_role: 'taker' | 'maker'
price: string
size: number
symbol: string
timestamp: number
type: 'recent_trade' | 'all_trades'
}
type DeltaBookLevel = {
limit_price: string
size: number
}
type DeltaL2OrderBook = {
buy: DeltaBookLevel[]
sell: DeltaBookLevel[]
symbol: string
timestamp?: number
type: 'l2_orderbook'
}
type DeltaMarkPrice = {
price: string
symbol: string
timestamp: number
type: 'mark_price'
}
type DeltaFundingRate = {
funding_rate?: string | number
next_funding_realization?: number
predicted_funding_rate?: number
symbol: string
timestamp: number
type: 'funding_rate'
}