tardis-dev 12.6.2 → 12.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apikeyaccessinfo.js +1 -1
- package/dist/apikeyaccessinfo.js.map +1 -1
- package/dist/clearcache.js +12 -12
- package/dist/clearcache.js.map +1 -1
- package/dist/combine.js +1 -1
- package/dist/combine.js.map +1 -1
- package/dist/computable/booksnapshot.d.ts.map +1 -1
- package/dist/computable/booksnapshot.js +1 -1
- package/dist/computable/booksnapshot.js.map +1 -1
- package/dist/computable/tradebar.d.ts.map +1 -1
- package/dist/computable/tradebar.js.map +1 -1
- package/dist/debug.js +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/downloaddatasets.js +13 -13
- package/dist/downloaddatasets.js.map +1 -1
- package/dist/exchangedetails.js +1 -1
- package/dist/exchangedetails.js.map +1 -1
- package/dist/filter.js.map +1 -1
- package/dist/handy.js +8 -8
- package/dist/handy.js.map +1 -1
- package/dist/instrumentinfo.js +1 -1
- package/dist/instrumentinfo.js.map +1 -1
- package/dist/mappers/binance.d.ts.map +1 -1
- package/dist/mappers/binance.js +2 -2
- package/dist/mappers/binance.js.map +1 -1
- package/dist/mappers/binanceoptions.js +10 -10
- package/dist/mappers/binanceoptions.js.map +1 -1
- package/dist/mappers/bitflyer.js +1 -1
- package/dist/mappers/bitflyer.js.map +1 -1
- package/dist/mappers/coinbase.js +2 -2
- package/dist/mappers/coinbase.js.map +1 -1
- package/dist/mappers/ftx.js +2 -2
- package/dist/mappers/ftx.js.map +1 -1
- package/dist/mappers/huobi.d.ts.map +1 -1
- package/dist/mappers/huobi.js +11 -11
- package/dist/mappers/huobi.js.map +1 -1
- package/dist/mappers/okex.js +14 -14
- package/dist/mappers/okex.js.map +1 -1
- package/dist/mappers/phemex.d.ts.map +1 -1
- package/dist/mappers/phemex.js.map +1 -1
- package/dist/realtimefeeds/ascendex.js +2 -2
- package/dist/realtimefeeds/ascendex.js.map +1 -1
- package/dist/realtimefeeds/binance.js +1 -1
- package/dist/realtimefeeds/binance.js.map +1 -1
- package/dist/realtimefeeds/bitmex.js +1 -1
- package/dist/realtimefeeds/bitmex.js.map +1 -1
- package/dist/realtimefeeds/ftx.js +1 -1
- package/dist/realtimefeeds/ftx.js.map +1 -1
- package/dist/realtimefeeds/huobi.js +7 -7
- package/dist/realtimefeeds/huobi.js.map +1 -1
- package/dist/realtimefeeds/okex.js +1 -1
- package/dist/realtimefeeds/okex.js.map +1 -1
- package/dist/realtimefeeds/realtimefeed.js +9 -9
- package/dist/realtimefeeds/realtimefeed.js.map +1 -1
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +34 -36
- package/dist/replay.js.map +1 -1
- package/dist/stream.js +4 -4
- package/dist/stream.js.map +1 -1
- package/dist/worker.js +12 -12
- package/dist/worker.js.map +1 -1
- package/package.json +19 -18
- package/src/computable/booksnapshot.ts +4 -2
- package/src/computable/tradebar.ts +4 -1
- package/src/downloaddatasets.ts +188 -188
- package/src/filter.ts +69 -69
- package/src/instrumentinfo.ts +1 -1
- package/src/mappers/ascendex.ts +156 -156
- package/src/mappers/binance.ts +6 -3
- package/src/mappers/coinflex.ts +159 -159
- package/src/mappers/delta.ts +175 -175
- package/src/mappers/dydx.ts +303 -303
- package/src/mappers/gateio.ts +117 -117
- package/src/mappers/gateiofutures.ts +185 -185
- package/src/mappers/huobi.ts +4 -2
- package/src/mappers/phemex.ts +179 -177
- package/src/mappers/poloniex.ts +150 -150
- package/src/mappers/serum.ts +103 -103
- package/src/mappers/upbit.ts +104 -104
- package/src/realtimefeeds/ascendex.ts +65 -65
- package/src/realtimefeeds/coinflex.ts +29 -29
- package/src/realtimefeeds/delta.ts +27 -27
- package/src/realtimefeeds/dydx.ts +40 -40
- package/src/realtimefeeds/gateio.ts +41 -41
- package/src/realtimefeeds/gateiofutures.ts +90 -90
- package/src/realtimefeeds/poloniex.ts +28 -28
- package/src/realtimefeeds/realtimefeed.ts +2 -2
- package/src/realtimefeeds/upbit.ts +35 -35
- package/src/replay.ts +7 -8
- package/src/stream.ts +1 -1
package/src/mappers/gateio.ts
CHANGED
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
import { BookChange, Exchange, Trade } from '../types'
|
|
2
|
-
import { Mapper } from './mapper'
|
|
3
|
-
|
|
4
|
-
// https://www.gate.io/docs/websocket/index.html
|
|
5
|
-
|
|
6
|
-
export class GateIOTradesMapper implements Mapper<'gate-io', Trade> {
|
|
7
|
-
private readonly _seenSymbols = new Set<string>()
|
|
8
|
-
|
|
9
|
-
constructor(private readonly _exchange: Exchange) {}
|
|
10
|
-
|
|
11
|
-
canHandle(message: any) {
|
|
12
|
-
return message.method === 'trades.update'
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
getFilters(symbols?: string[]) {
|
|
16
|
-
return [
|
|
17
|
-
{
|
|
18
|
-
channel: 'trades',
|
|
19
|
-
symbols
|
|
20
|
-
} as const
|
|
21
|
-
]
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
*map(tradesMessage: GateIOTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
25
|
-
const symbol = tradesMessage.params[0]
|
|
26
|
-
|
|
27
|
-
// gate io sends trades from newest to oldest for some reason
|
|
28
|
-
for (const gateIOTrade of tradesMessage.params[1].reverse()) {
|
|
29
|
-
// always ignore first returned trade as it's a 'stale' trade, which has already been published before disconnect
|
|
30
|
-
if (this._seenSymbols.has(symbol) === false) {
|
|
31
|
-
this._seenSymbols.add(symbol)
|
|
32
|
-
break
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const timestamp = new Date(gateIOTrade.time * 1000)
|
|
36
|
-
timestamp.μs = Math.floor(gateIOTrade.time * 1000000) % 1000
|
|
37
|
-
yield {
|
|
38
|
-
type: 'trade',
|
|
39
|
-
symbol,
|
|
40
|
-
exchange: this._exchange,
|
|
41
|
-
id: gateIOTrade.id.toString(),
|
|
42
|
-
price: Number(gateIOTrade.price),
|
|
43
|
-
amount: Number(gateIOTrade.amount),
|
|
44
|
-
side: gateIOTrade.type == 'sell' ? 'sell' : 'buy',
|
|
45
|
-
timestamp,
|
|
46
|
-
localTimestamp: localTimestamp
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const mapBookLevel = (level: GateIODepthLevel) => {
|
|
53
|
-
const price = Number(level[0])
|
|
54
|
-
const amount = Number(level[1])
|
|
55
|
-
|
|
56
|
-
return { price, amount }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export class GateIOBookChangeMapper implements Mapper<'gate-io', BookChange> {
|
|
60
|
-
constructor(private readonly _exchange: Exchange) {}
|
|
61
|
-
|
|
62
|
-
canHandle(message: any) {
|
|
63
|
-
return message.method === 'depth.update'
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
getFilters(symbols?: string[]) {
|
|
67
|
-
return [
|
|
68
|
-
{
|
|
69
|
-
channel: 'depth',
|
|
70
|
-
symbols
|
|
71
|
-
} as const
|
|
72
|
-
]
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
*map(depthMessage: GateIODepth, localTimestamp: Date): IterableIterator<BookChange> {
|
|
76
|
-
const symbol = depthMessage.params[2]
|
|
77
|
-
const isSnapshot = depthMessage.params[0]
|
|
78
|
-
const bids = Array.isArray(depthMessage.params[1].bids) ? depthMessage.params[1].bids : []
|
|
79
|
-
const asks = Array.isArray(depthMessage.params[1].asks) ? depthMessage.params[1].asks : []
|
|
80
|
-
yield {
|
|
81
|
-
type: 'book_change',
|
|
82
|
-
symbol,
|
|
83
|
-
exchange: this._exchange,
|
|
84
|
-
isSnapshot,
|
|
85
|
-
bids: bids.map(mapBookLevel),
|
|
86
|
-
asks: asks.map(mapBookLevel),
|
|
87
|
-
timestamp: localTimestamp,
|
|
88
|
-
localTimestamp: localTimestamp
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
type GateIOTrade = {
|
|
94
|
-
id: number
|
|
95
|
-
time: number
|
|
96
|
-
price: string
|
|
97
|
-
amount: string
|
|
98
|
-
type: 'sell' | 'buy'
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
type GateIOTrades = {
|
|
102
|
-
method: 'trades.update'
|
|
103
|
-
params: [string, GateIOTrade[]]
|
|
104
|
-
}
|
|
105
|
-
type GateIODepthLevel = [string, string]
|
|
106
|
-
|
|
107
|
-
type GateIODepth = {
|
|
108
|
-
method: 'depth.update'
|
|
109
|
-
params: [
|
|
110
|
-
boolean,
|
|
111
|
-
{
|
|
112
|
-
bids?: GateIODepthLevel[]
|
|
113
|
-
asks?: GateIODepthLevel[]
|
|
114
|
-
},
|
|
115
|
-
string
|
|
116
|
-
]
|
|
117
|
-
}
|
|
1
|
+
import { BookChange, Exchange, Trade } from '../types'
|
|
2
|
+
import { Mapper } from './mapper'
|
|
3
|
+
|
|
4
|
+
// https://www.gate.io/docs/websocket/index.html
|
|
5
|
+
|
|
6
|
+
export class GateIOTradesMapper implements Mapper<'gate-io', Trade> {
|
|
7
|
+
private readonly _seenSymbols = new Set<string>()
|
|
8
|
+
|
|
9
|
+
constructor(private readonly _exchange: Exchange) {}
|
|
10
|
+
|
|
11
|
+
canHandle(message: any) {
|
|
12
|
+
return message.method === 'trades.update'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
getFilters(symbols?: string[]) {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
channel: 'trades',
|
|
19
|
+
symbols
|
|
20
|
+
} as const
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
*map(tradesMessage: GateIOTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
25
|
+
const symbol = tradesMessage.params[0]
|
|
26
|
+
|
|
27
|
+
// gate io sends trades from newest to oldest for some reason
|
|
28
|
+
for (const gateIOTrade of tradesMessage.params[1].reverse()) {
|
|
29
|
+
// always ignore first returned trade as it's a 'stale' trade, which has already been published before disconnect
|
|
30
|
+
if (this._seenSymbols.has(symbol) === false) {
|
|
31
|
+
this._seenSymbols.add(symbol)
|
|
32
|
+
break
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const timestamp = new Date(gateIOTrade.time * 1000)
|
|
36
|
+
timestamp.μs = Math.floor(gateIOTrade.time * 1000000) % 1000
|
|
37
|
+
yield {
|
|
38
|
+
type: 'trade',
|
|
39
|
+
symbol,
|
|
40
|
+
exchange: this._exchange,
|
|
41
|
+
id: gateIOTrade.id.toString(),
|
|
42
|
+
price: Number(gateIOTrade.price),
|
|
43
|
+
amount: Number(gateIOTrade.amount),
|
|
44
|
+
side: gateIOTrade.type == 'sell' ? 'sell' : 'buy',
|
|
45
|
+
timestamp,
|
|
46
|
+
localTimestamp: localTimestamp
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const mapBookLevel = (level: GateIODepthLevel) => {
|
|
53
|
+
const price = Number(level[0])
|
|
54
|
+
const amount = Number(level[1])
|
|
55
|
+
|
|
56
|
+
return { price, amount }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class GateIOBookChangeMapper implements Mapper<'gate-io', BookChange> {
|
|
60
|
+
constructor(private readonly _exchange: Exchange) {}
|
|
61
|
+
|
|
62
|
+
canHandle(message: any) {
|
|
63
|
+
return message.method === 'depth.update'
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
getFilters(symbols?: string[]) {
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
channel: 'depth',
|
|
70
|
+
symbols
|
|
71
|
+
} as const
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
*map(depthMessage: GateIODepth, localTimestamp: Date): IterableIterator<BookChange> {
|
|
76
|
+
const symbol = depthMessage.params[2]
|
|
77
|
+
const isSnapshot = depthMessage.params[0]
|
|
78
|
+
const bids = Array.isArray(depthMessage.params[1].bids) ? depthMessage.params[1].bids : []
|
|
79
|
+
const asks = Array.isArray(depthMessage.params[1].asks) ? depthMessage.params[1].asks : []
|
|
80
|
+
yield {
|
|
81
|
+
type: 'book_change',
|
|
82
|
+
symbol,
|
|
83
|
+
exchange: this._exchange,
|
|
84
|
+
isSnapshot,
|
|
85
|
+
bids: bids.map(mapBookLevel),
|
|
86
|
+
asks: asks.map(mapBookLevel),
|
|
87
|
+
timestamp: localTimestamp,
|
|
88
|
+
localTimestamp: localTimestamp
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type GateIOTrade = {
|
|
94
|
+
id: number
|
|
95
|
+
time: number
|
|
96
|
+
price: string
|
|
97
|
+
amount: string
|
|
98
|
+
type: 'sell' | 'buy'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
type GateIOTrades = {
|
|
102
|
+
method: 'trades.update'
|
|
103
|
+
params: [string, GateIOTrade[]]
|
|
104
|
+
}
|
|
105
|
+
type GateIODepthLevel = [string, string]
|
|
106
|
+
|
|
107
|
+
type GateIODepth = {
|
|
108
|
+
method: 'depth.update'
|
|
109
|
+
params: [
|
|
110
|
+
boolean,
|
|
111
|
+
{
|
|
112
|
+
bids?: GateIODepthLevel[]
|
|
113
|
+
asks?: GateIODepthLevel[]
|
|
114
|
+
},
|
|
115
|
+
string
|
|
116
|
+
]
|
|
117
|
+
}
|
|
@@ -1,185 +1,185 @@
|
|
|
1
|
-
import { BookChange, Exchange, Trade, DerivativeTicker } from '../types'
|
|
2
|
-
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
3
|
-
|
|
4
|
-
// https://www.gate.io/docs/futures/ws/index.html
|
|
5
|
-
|
|
6
|
-
export class GateIOFuturesTradesMapper implements Mapper<'gate-io-futures', Trade> {
|
|
7
|
-
constructor(private readonly _exchange: Exchange) {}
|
|
8
|
-
|
|
9
|
-
canHandle(message: any) {
|
|
10
|
-
return message.channel === 'futures.trades' && message.event === 'update'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
getFilters(symbols?: string[]) {
|
|
14
|
-
return [
|
|
15
|
-
{
|
|
16
|
-
channel: 'trades',
|
|
17
|
-
symbols
|
|
18
|
-
} as const
|
|
19
|
-
]
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
*map(tradesMessage: GateIOFuturesTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
23
|
-
for (const trade of tradesMessage.result) {
|
|
24
|
-
const timestamp = new Date(trade.create_time * 1000)
|
|
25
|
-
|
|
26
|
-
yield {
|
|
27
|
-
type: 'trade',
|
|
28
|
-
symbol: trade.contract,
|
|
29
|
-
exchange: this._exchange,
|
|
30
|
-
id: trade.id.toString(),
|
|
31
|
-
price: Number(trade.price),
|
|
32
|
-
amount: Math.abs(trade.size),
|
|
33
|
-
side: trade.size < 0 ? 'sell' : 'buy',
|
|
34
|
-
timestamp,
|
|
35
|
-
localTimestamp: localTimestamp
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const mapBookLevel = (level: GateIOFuturesSnapshotLevel) => {
|
|
42
|
-
const price = Number(level.p)
|
|
43
|
-
|
|
44
|
-
return { price, amount: Math.abs(level.s) }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export class GateIOFuturesBookChangeMapper implements Mapper<'gate-io-futures', BookChange> {
|
|
48
|
-
constructor(private readonly _exchange: Exchange) {}
|
|
49
|
-
|
|
50
|
-
canHandle(message: GateIOFuturesOrderBookSnapshot | GateIOFuturesOrderBookUpdate) {
|
|
51
|
-
return message.channel === 'futures.order_book' && (message.event === 'all' || message.event === 'update')
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
getFilters(symbols?: string[]) {
|
|
55
|
-
return [
|
|
56
|
-
{
|
|
57
|
-
channel: 'order_book',
|
|
58
|
-
symbols
|
|
59
|
-
} as const
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
*map(depthMessage: GateIOFuturesOrderBookSnapshot | GateIOFuturesOrderBookUpdate, localTimestamp: Date): IterableIterator<BookChange> {
|
|
64
|
-
if (depthMessage.event === 'all') {
|
|
65
|
-
// snapshot
|
|
66
|
-
yield {
|
|
67
|
-
type: 'book_change',
|
|
68
|
-
symbol: depthMessage.result.contract,
|
|
69
|
-
exchange: this._exchange,
|
|
70
|
-
isSnapshot: true,
|
|
71
|
-
bids: depthMessage.result.bids.map(mapBookLevel),
|
|
72
|
-
asks: depthMessage.result.asks.map(mapBookLevel),
|
|
73
|
-
timestamp: new Date(depthMessage.time * 1000),
|
|
74
|
-
localTimestamp: localTimestamp
|
|
75
|
-
}
|
|
76
|
-
} else if (depthMessage.result.length > 0) {
|
|
77
|
-
// update
|
|
78
|
-
yield {
|
|
79
|
-
type: 'book_change',
|
|
80
|
-
symbol: depthMessage.result[0].c,
|
|
81
|
-
exchange: this._exchange,
|
|
82
|
-
isSnapshot: false,
|
|
83
|
-
bids: depthMessage.result.filter((l) => l.s >= 0).map(mapBookLevel),
|
|
84
|
-
asks: depthMessage.result.filter((l) => l.s <= 0).map(mapBookLevel),
|
|
85
|
-
timestamp: new Date(depthMessage.time * 1000),
|
|
86
|
-
localTimestamp: localTimestamp
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export class GateIOFuturesDerivativeTickerMapper implements Mapper<'gate-io-futures', DerivativeTicker> {
|
|
93
|
-
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
94
|
-
|
|
95
|
-
canHandle(message: GateIOFuturesTicker) {
|
|
96
|
-
return message.channel === 'futures.tickers' && message.event === 'update'
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
getFilters(symbols?: string[]) {
|
|
100
|
-
return [
|
|
101
|
-
{
|
|
102
|
-
channel: 'tickers',
|
|
103
|
-
symbols
|
|
104
|
-
} as const
|
|
105
|
-
]
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
*map(message: GateIOFuturesTicker, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
109
|
-
for (const futuresTicker of message.result) {
|
|
110
|
-
if (futuresTicker.contract === undefined) {
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresTicker.contract, 'gate-io-futures')
|
|
114
|
-
|
|
115
|
-
pendingTickerInfo.updateFundingRate(Number(futuresTicker.funding_rate))
|
|
116
|
-
pendingTickerInfo.updatePredictedFundingRate(Number(futuresTicker.funding_rate_indicative))
|
|
117
|
-
pendingTickerInfo.updateIndexPrice(Number(futuresTicker.index_price))
|
|
118
|
-
pendingTickerInfo.updateMarkPrice(Number(futuresTicker.mark_price))
|
|
119
|
-
pendingTickerInfo.updateLastPrice(Number(futuresTicker.last))
|
|
120
|
-
pendingTickerInfo.updateTimestamp(new Date(message.time * 1000))
|
|
121
|
-
|
|
122
|
-
if (pendingTickerInfo.hasChanged()) {
|
|
123
|
-
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
type GateIOFuturesTrade = {
|
|
130
|
-
size: number
|
|
131
|
-
id: number
|
|
132
|
-
create_time: number
|
|
133
|
-
price: string
|
|
134
|
-
contract: string
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
type GateIOFuturesTrades = {
|
|
138
|
-
time: number
|
|
139
|
-
channel: 'futures.trades'
|
|
140
|
-
event: 'update'
|
|
141
|
-
|
|
142
|
-
result: GateIOFuturesTrade[]
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
type GateIOFuturesSnapshotLevel = { p: string; s: number }
|
|
146
|
-
|
|
147
|
-
type GateIOFuturesOrderBookSnapshot = {
|
|
148
|
-
time: number
|
|
149
|
-
channel: 'futures.order_book'
|
|
150
|
-
event: 'all'
|
|
151
|
-
|
|
152
|
-
result: {
|
|
153
|
-
contract: string
|
|
154
|
-
asks: GateIOFuturesSnapshotLevel[]
|
|
155
|
-
bids: GateIOFuturesSnapshotLevel[]
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
type GateIOFuturesOrderBookUpdate = {
|
|
160
|
-
time: number
|
|
161
|
-
channel: 'futures.order_book'
|
|
162
|
-
event: 'update'
|
|
163
|
-
result: {
|
|
164
|
-
p: string
|
|
165
|
-
s: number
|
|
166
|
-
c: string
|
|
167
|
-
}[]
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
type GateIOFuturesTicker = {
|
|
171
|
-
time: number
|
|
172
|
-
channel: 'futures.tickers'
|
|
173
|
-
event: 'update'
|
|
174
|
-
|
|
175
|
-
result: [
|
|
176
|
-
{
|
|
177
|
-
contract: string
|
|
178
|
-
last: string
|
|
179
|
-
funding_rate: string
|
|
180
|
-
mark_price: string
|
|
181
|
-
index_price: string
|
|
182
|
-
funding_rate_indicative: string
|
|
183
|
-
}
|
|
184
|
-
]
|
|
185
|
-
}
|
|
1
|
+
import { BookChange, Exchange, Trade, DerivativeTicker } from '../types'
|
|
2
|
+
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
3
|
+
|
|
4
|
+
// https://www.gate.io/docs/futures/ws/index.html
|
|
5
|
+
|
|
6
|
+
export class GateIOFuturesTradesMapper implements Mapper<'gate-io-futures', Trade> {
|
|
7
|
+
constructor(private readonly _exchange: Exchange) {}
|
|
8
|
+
|
|
9
|
+
canHandle(message: any) {
|
|
10
|
+
return message.channel === 'futures.trades' && message.event === 'update'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
getFilters(symbols?: string[]) {
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
channel: 'trades',
|
|
17
|
+
symbols
|
|
18
|
+
} as const
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
*map(tradesMessage: GateIOFuturesTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
23
|
+
for (const trade of tradesMessage.result) {
|
|
24
|
+
const timestamp = new Date(trade.create_time * 1000)
|
|
25
|
+
|
|
26
|
+
yield {
|
|
27
|
+
type: 'trade',
|
|
28
|
+
symbol: trade.contract,
|
|
29
|
+
exchange: this._exchange,
|
|
30
|
+
id: trade.id.toString(),
|
|
31
|
+
price: Number(trade.price),
|
|
32
|
+
amount: Math.abs(trade.size),
|
|
33
|
+
side: trade.size < 0 ? 'sell' : 'buy',
|
|
34
|
+
timestamp,
|
|
35
|
+
localTimestamp: localTimestamp
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const mapBookLevel = (level: GateIOFuturesSnapshotLevel) => {
|
|
42
|
+
const price = Number(level.p)
|
|
43
|
+
|
|
44
|
+
return { price, amount: Math.abs(level.s) }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class GateIOFuturesBookChangeMapper implements Mapper<'gate-io-futures', BookChange> {
|
|
48
|
+
constructor(private readonly _exchange: Exchange) {}
|
|
49
|
+
|
|
50
|
+
canHandle(message: GateIOFuturesOrderBookSnapshot | GateIOFuturesOrderBookUpdate) {
|
|
51
|
+
return message.channel === 'futures.order_book' && (message.event === 'all' || message.event === 'update')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getFilters(symbols?: string[]) {
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
channel: 'order_book',
|
|
58
|
+
symbols
|
|
59
|
+
} as const
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
*map(depthMessage: GateIOFuturesOrderBookSnapshot | GateIOFuturesOrderBookUpdate, localTimestamp: Date): IterableIterator<BookChange> {
|
|
64
|
+
if (depthMessage.event === 'all') {
|
|
65
|
+
// snapshot
|
|
66
|
+
yield {
|
|
67
|
+
type: 'book_change',
|
|
68
|
+
symbol: depthMessage.result.contract,
|
|
69
|
+
exchange: this._exchange,
|
|
70
|
+
isSnapshot: true,
|
|
71
|
+
bids: depthMessage.result.bids.map(mapBookLevel),
|
|
72
|
+
asks: depthMessage.result.asks.map(mapBookLevel),
|
|
73
|
+
timestamp: new Date(depthMessage.time * 1000),
|
|
74
|
+
localTimestamp: localTimestamp
|
|
75
|
+
}
|
|
76
|
+
} else if (depthMessage.result.length > 0) {
|
|
77
|
+
// update
|
|
78
|
+
yield {
|
|
79
|
+
type: 'book_change',
|
|
80
|
+
symbol: depthMessage.result[0].c,
|
|
81
|
+
exchange: this._exchange,
|
|
82
|
+
isSnapshot: false,
|
|
83
|
+
bids: depthMessage.result.filter((l) => l.s >= 0).map(mapBookLevel),
|
|
84
|
+
asks: depthMessage.result.filter((l) => l.s <= 0).map(mapBookLevel),
|
|
85
|
+
timestamp: new Date(depthMessage.time * 1000),
|
|
86
|
+
localTimestamp: localTimestamp
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class GateIOFuturesDerivativeTickerMapper implements Mapper<'gate-io-futures', DerivativeTicker> {
|
|
93
|
+
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
94
|
+
|
|
95
|
+
canHandle(message: GateIOFuturesTicker) {
|
|
96
|
+
return message.channel === 'futures.tickers' && message.event === 'update'
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
getFilters(symbols?: string[]) {
|
|
100
|
+
return [
|
|
101
|
+
{
|
|
102
|
+
channel: 'tickers',
|
|
103
|
+
symbols
|
|
104
|
+
} as const
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
*map(message: GateIOFuturesTicker, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
109
|
+
for (const futuresTicker of message.result) {
|
|
110
|
+
if (futuresTicker.contract === undefined) {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresTicker.contract, 'gate-io-futures')
|
|
114
|
+
|
|
115
|
+
pendingTickerInfo.updateFundingRate(Number(futuresTicker.funding_rate))
|
|
116
|
+
pendingTickerInfo.updatePredictedFundingRate(Number(futuresTicker.funding_rate_indicative))
|
|
117
|
+
pendingTickerInfo.updateIndexPrice(Number(futuresTicker.index_price))
|
|
118
|
+
pendingTickerInfo.updateMarkPrice(Number(futuresTicker.mark_price))
|
|
119
|
+
pendingTickerInfo.updateLastPrice(Number(futuresTicker.last))
|
|
120
|
+
pendingTickerInfo.updateTimestamp(new Date(message.time * 1000))
|
|
121
|
+
|
|
122
|
+
if (pendingTickerInfo.hasChanged()) {
|
|
123
|
+
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
type GateIOFuturesTrade = {
|
|
130
|
+
size: number
|
|
131
|
+
id: number
|
|
132
|
+
create_time: number
|
|
133
|
+
price: string
|
|
134
|
+
contract: string
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
type GateIOFuturesTrades = {
|
|
138
|
+
time: number
|
|
139
|
+
channel: 'futures.trades'
|
|
140
|
+
event: 'update'
|
|
141
|
+
|
|
142
|
+
result: GateIOFuturesTrade[]
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type GateIOFuturesSnapshotLevel = { p: string; s: number }
|
|
146
|
+
|
|
147
|
+
type GateIOFuturesOrderBookSnapshot = {
|
|
148
|
+
time: number
|
|
149
|
+
channel: 'futures.order_book'
|
|
150
|
+
event: 'all'
|
|
151
|
+
|
|
152
|
+
result: {
|
|
153
|
+
contract: string
|
|
154
|
+
asks: GateIOFuturesSnapshotLevel[]
|
|
155
|
+
bids: GateIOFuturesSnapshotLevel[]
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
type GateIOFuturesOrderBookUpdate = {
|
|
160
|
+
time: number
|
|
161
|
+
channel: 'futures.order_book'
|
|
162
|
+
event: 'update'
|
|
163
|
+
result: {
|
|
164
|
+
p: string
|
|
165
|
+
s: number
|
|
166
|
+
c: string
|
|
167
|
+
}[]
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
type GateIOFuturesTicker = {
|
|
171
|
+
time: number
|
|
172
|
+
channel: 'futures.tickers'
|
|
173
|
+
event: 'update'
|
|
174
|
+
|
|
175
|
+
result: [
|
|
176
|
+
{
|
|
177
|
+
contract: string
|
|
178
|
+
last: string
|
|
179
|
+
funding_rate: string
|
|
180
|
+
mark_price: string
|
|
181
|
+
index_price: string
|
|
182
|
+
funding_rate_indicative: string
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
}
|
package/src/mappers/huobi.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { asNumberIfValid, CircularBuffer } from '../handy'
|
|
|
6
6
|
// https://github.com/huobiapi/API_Docs_en/wiki/WS_api_reference_en
|
|
7
7
|
|
|
8
8
|
export class HuobiTradesMapper
|
|
9
|
-
implements Mapper<'huobi' | 'huobi-dm' | 'huobi-dm-swap' | 'huobi-dm-linear-swap' | 'huobi-dm-options', Trade>
|
|
9
|
+
implements Mapper<'huobi' | 'huobi-dm' | 'huobi-dm-swap' | 'huobi-dm-linear-swap' | 'huobi-dm-options', Trade>
|
|
10
|
+
{
|
|
10
11
|
constructor(private readonly _exchange: Exchange) {}
|
|
11
12
|
canHandle(message: HuobiDataMessage) {
|
|
12
13
|
if (message.ch === undefined) {
|
|
@@ -46,7 +47,8 @@ export class HuobiTradesMapper
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
export class HuobiBookChangeMapper
|
|
49
|
-
implements Mapper<'huobi' | 'huobi-dm' | 'huobi-dm-swap' | 'huobi-dm-linear-swap' | 'huobi-dm-options', BookChange>
|
|
50
|
+
implements Mapper<'huobi' | 'huobi-dm' | 'huobi-dm-swap' | 'huobi-dm-linear-swap' | 'huobi-dm-options', BookChange>
|
|
51
|
+
{
|
|
50
52
|
constructor(protected readonly _exchange: Exchange) {}
|
|
51
53
|
|
|
52
54
|
canHandle(message: HuobiDataMessage) {
|