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/ascendex.ts
CHANGED
|
@@ -1,156 +1,156 @@
|
|
|
1
|
-
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
2
|
-
import { Trade, BookChange, DerivativeTicker } from '../types'
|
|
3
|
-
|
|
4
|
-
export class AscendexTradesMapper implements Mapper<'ascendex', Trade> {
|
|
5
|
-
canHandle(message: AscendexTrade) {
|
|
6
|
-
return message.m === 'trades'
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
getFilters(symbols?: string[]) {
|
|
10
|
-
return [
|
|
11
|
-
{
|
|
12
|
-
channel: 'trades',
|
|
13
|
-
symbols
|
|
14
|
-
} as const
|
|
15
|
-
]
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
*map(message: AscendexTrade, localTimestamp: Date): IterableIterator<Trade> {
|
|
19
|
-
for (let trade of message.data) {
|
|
20
|
-
yield {
|
|
21
|
-
type: 'trade',
|
|
22
|
-
symbol: message.symbol,
|
|
23
|
-
exchange: 'ascendex',
|
|
24
|
-
id: undefined,
|
|
25
|
-
price: Number(trade.p),
|
|
26
|
-
amount: Number(trade.q),
|
|
27
|
-
side: trade.bm === true ? 'sell' : 'buy',
|
|
28
|
-
timestamp: new Date(trade.ts),
|
|
29
|
-
localTimestamp: localTimestamp
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class AscendexBookChangeMapper implements Mapper<'ascendex', BookChange> {
|
|
36
|
-
canHandle(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot) {
|
|
37
|
-
return message.m === 'depth-realtime' || message.m === 'depth-snapshot-realtime'
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
getFilters(symbols?: string[]) {
|
|
41
|
-
return [
|
|
42
|
-
{
|
|
43
|
-
channel: 'depth-realtime',
|
|
44
|
-
symbols
|
|
45
|
-
} as const,
|
|
46
|
-
{
|
|
47
|
-
channel: 'depth-snapshot-realtime',
|
|
48
|
-
symbols
|
|
49
|
-
} as const
|
|
50
|
-
]
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
*map(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot, localTimestamp: Date): IterableIterator<BookChange> {
|
|
54
|
-
yield {
|
|
55
|
-
type: 'book_change',
|
|
56
|
-
symbol: message.symbol,
|
|
57
|
-
exchange: 'ascendex',
|
|
58
|
-
isSnapshot: message.m === 'depth-snapshot-realtime',
|
|
59
|
-
bids: message.data.bids.map(this.mapBookLevel),
|
|
60
|
-
asks: message.data.asks.map(this.mapBookLevel),
|
|
61
|
-
timestamp: message.data.ts > 0 ? new Date(message.data.ts) : localTimestamp,
|
|
62
|
-
localTimestamp
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
protected mapBookLevel(level: AscendexPriceLevel) {
|
|
67
|
-
const price = Number(level[0])
|
|
68
|
-
const amount = Number(level[1])
|
|
69
|
-
return { price, amount }
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export class AscendexDerivativeTickerMapper implements Mapper<'ascendex', DerivativeTicker> {
|
|
74
|
-
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
75
|
-
|
|
76
|
-
canHandle(message: AscendexFuturesData | AscendexTrade) {
|
|
77
|
-
return message.m === 'futures-pricing-data' || message.m === 'trades'
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
getFilters(symbols?: string[]) {
|
|
81
|
-
return [
|
|
82
|
-
{
|
|
83
|
-
channel: 'futures-pricing-data',
|
|
84
|
-
symbols: [] as string[]
|
|
85
|
-
} as const,
|
|
86
|
-
{
|
|
87
|
-
channel: 'trades',
|
|
88
|
-
symbols
|
|
89
|
-
} as const
|
|
90
|
-
]
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
*map(message: AscendexFuturesData | AscendexTrade, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
94
|
-
if (message.m === 'trades') {
|
|
95
|
-
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol, 'ascendex')
|
|
96
|
-
pendingTickerInfo.updateLastPrice(Number(message.data[message.data.length - 1].p))
|
|
97
|
-
return
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
for (const futuresData of message.con) {
|
|
101
|
-
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresData.s, 'ascendex')
|
|
102
|
-
|
|
103
|
-
pendingTickerInfo.updateIndexPrice(Number(futuresData.ip))
|
|
104
|
-
pendingTickerInfo.updateMarkPrice(Number(futuresData.mp))
|
|
105
|
-
pendingTickerInfo.updateOpenInterest(Number(futuresData.oi))
|
|
106
|
-
pendingTickerInfo.updateTimestamp(new Date(futuresData.t))
|
|
107
|
-
pendingTickerInfo.updateFundingTimestamp(new Date(futuresData.f))
|
|
108
|
-
pendingTickerInfo.updateFundingRate(Number(futuresData.r))
|
|
109
|
-
|
|
110
|
-
if (pendingTickerInfo.hasChanged()) {
|
|
111
|
-
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
type AscendexTrade = {
|
|
118
|
-
m: 'trades'
|
|
119
|
-
symbol: string
|
|
120
|
-
data: [{ p: string; q: string; ts: number; bm: boolean; seqnum: number }]
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
type AscendexPriceLevel = [string, string]
|
|
124
|
-
|
|
125
|
-
type AscendexDepthRealTime = {
|
|
126
|
-
m: 'depth-realtime'
|
|
127
|
-
symbol: 'XRP/USDT'
|
|
128
|
-
data: { ts: 1621814400204; seqnum: 39862426; asks: AscendexPriceLevel[]; bids: AscendexPriceLevel[] }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
type AscendexDepthRealTimeSnapshot = {
|
|
132
|
-
m: 'depth-snapshot-realtime'
|
|
133
|
-
symbol: 'XRP/USDT'
|
|
134
|
-
data: {
|
|
135
|
-
ts: 0
|
|
136
|
-
seqnum: 39862426
|
|
137
|
-
asks: AscendexPriceLevel[]
|
|
138
|
-
bids: AscendexPriceLevel[]
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
type AscendexFuturesData = {
|
|
143
|
-
m: 'futures-pricing-data'
|
|
144
|
-
con: [
|
|
145
|
-
{
|
|
146
|
-
t: 1621814404114
|
|
147
|
-
s: 'BTC-PERP'
|
|
148
|
-
mp: '34878.075977904'
|
|
149
|
-
ip: '34697.17'
|
|
150
|
-
oi: '80.6126'
|
|
151
|
-
r: '0.000093633'
|
|
152
|
-
f: 1621843200000
|
|
153
|
-
fi: 28800000
|
|
154
|
-
}
|
|
155
|
-
]
|
|
156
|
-
}
|
|
1
|
+
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
2
|
+
import { Trade, BookChange, DerivativeTicker } from '../types'
|
|
3
|
+
|
|
4
|
+
export class AscendexTradesMapper implements Mapper<'ascendex', Trade> {
|
|
5
|
+
canHandle(message: AscendexTrade) {
|
|
6
|
+
return message.m === 'trades'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
getFilters(symbols?: string[]) {
|
|
10
|
+
return [
|
|
11
|
+
{
|
|
12
|
+
channel: 'trades',
|
|
13
|
+
symbols
|
|
14
|
+
} as const
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
*map(message: AscendexTrade, localTimestamp: Date): IterableIterator<Trade> {
|
|
19
|
+
for (let trade of message.data) {
|
|
20
|
+
yield {
|
|
21
|
+
type: 'trade',
|
|
22
|
+
symbol: message.symbol,
|
|
23
|
+
exchange: 'ascendex',
|
|
24
|
+
id: undefined,
|
|
25
|
+
price: Number(trade.p),
|
|
26
|
+
amount: Number(trade.q),
|
|
27
|
+
side: trade.bm === true ? 'sell' : 'buy',
|
|
28
|
+
timestamp: new Date(trade.ts),
|
|
29
|
+
localTimestamp: localTimestamp
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class AscendexBookChangeMapper implements Mapper<'ascendex', BookChange> {
|
|
36
|
+
canHandle(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot) {
|
|
37
|
+
return message.m === 'depth-realtime' || message.m === 'depth-snapshot-realtime'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
getFilters(symbols?: string[]) {
|
|
41
|
+
return [
|
|
42
|
+
{
|
|
43
|
+
channel: 'depth-realtime',
|
|
44
|
+
symbols
|
|
45
|
+
} as const,
|
|
46
|
+
{
|
|
47
|
+
channel: 'depth-snapshot-realtime',
|
|
48
|
+
symbols
|
|
49
|
+
} as const
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
*map(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot, localTimestamp: Date): IterableIterator<BookChange> {
|
|
54
|
+
yield {
|
|
55
|
+
type: 'book_change',
|
|
56
|
+
symbol: message.symbol,
|
|
57
|
+
exchange: 'ascendex',
|
|
58
|
+
isSnapshot: message.m === 'depth-snapshot-realtime',
|
|
59
|
+
bids: message.data.bids.map(this.mapBookLevel),
|
|
60
|
+
asks: message.data.asks.map(this.mapBookLevel),
|
|
61
|
+
timestamp: message.data.ts > 0 ? new Date(message.data.ts) : localTimestamp,
|
|
62
|
+
localTimestamp
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
protected mapBookLevel(level: AscendexPriceLevel) {
|
|
67
|
+
const price = Number(level[0])
|
|
68
|
+
const amount = Number(level[1])
|
|
69
|
+
return { price, amount }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class AscendexDerivativeTickerMapper implements Mapper<'ascendex', DerivativeTicker> {
|
|
74
|
+
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
75
|
+
|
|
76
|
+
canHandle(message: AscendexFuturesData | AscendexTrade) {
|
|
77
|
+
return message.m === 'futures-pricing-data' || message.m === 'trades'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getFilters(symbols?: string[]) {
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
channel: 'futures-pricing-data',
|
|
84
|
+
symbols: [] as string[]
|
|
85
|
+
} as const,
|
|
86
|
+
{
|
|
87
|
+
channel: 'trades',
|
|
88
|
+
symbols
|
|
89
|
+
} as const
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
*map(message: AscendexFuturesData | AscendexTrade, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
94
|
+
if (message.m === 'trades') {
|
|
95
|
+
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol, 'ascendex')
|
|
96
|
+
pendingTickerInfo.updateLastPrice(Number(message.data[message.data.length - 1].p))
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for (const futuresData of message.con) {
|
|
101
|
+
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresData.s, 'ascendex')
|
|
102
|
+
|
|
103
|
+
pendingTickerInfo.updateIndexPrice(Number(futuresData.ip))
|
|
104
|
+
pendingTickerInfo.updateMarkPrice(Number(futuresData.mp))
|
|
105
|
+
pendingTickerInfo.updateOpenInterest(Number(futuresData.oi))
|
|
106
|
+
pendingTickerInfo.updateTimestamp(new Date(futuresData.t))
|
|
107
|
+
pendingTickerInfo.updateFundingTimestamp(new Date(futuresData.f))
|
|
108
|
+
pendingTickerInfo.updateFundingRate(Number(futuresData.r))
|
|
109
|
+
|
|
110
|
+
if (pendingTickerInfo.hasChanged()) {
|
|
111
|
+
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
type AscendexTrade = {
|
|
118
|
+
m: 'trades'
|
|
119
|
+
symbol: string
|
|
120
|
+
data: [{ p: string; q: string; ts: number; bm: boolean; seqnum: number }]
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
type AscendexPriceLevel = [string, string]
|
|
124
|
+
|
|
125
|
+
type AscendexDepthRealTime = {
|
|
126
|
+
m: 'depth-realtime'
|
|
127
|
+
symbol: 'XRP/USDT'
|
|
128
|
+
data: { ts: 1621814400204; seqnum: 39862426; asks: AscendexPriceLevel[]; bids: AscendexPriceLevel[] }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
type AscendexDepthRealTimeSnapshot = {
|
|
132
|
+
m: 'depth-snapshot-realtime'
|
|
133
|
+
symbol: 'XRP/USDT'
|
|
134
|
+
data: {
|
|
135
|
+
ts: 0
|
|
136
|
+
seqnum: 39862426
|
|
137
|
+
asks: AscendexPriceLevel[]
|
|
138
|
+
bids: AscendexPriceLevel[]
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
type AscendexFuturesData = {
|
|
143
|
+
m: 'futures-pricing-data'
|
|
144
|
+
con: [
|
|
145
|
+
{
|
|
146
|
+
t: 1621814404114
|
|
147
|
+
s: 'BTC-PERP'
|
|
148
|
+
mp: '34878.075977904'
|
|
149
|
+
ip: '34697.17'
|
|
150
|
+
oi: '80.6126'
|
|
151
|
+
r: '0.000093633'
|
|
152
|
+
f: 1621843200000
|
|
153
|
+
fi: 28800000
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
package/src/mappers/binance.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
|
6
6
|
// https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md
|
|
7
7
|
|
|
8
8
|
export class BinanceTradesMapper
|
|
9
|
-
implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', Trade>
|
|
9
|
+
implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', Trade>
|
|
10
|
+
{
|
|
10
11
|
constructor(private readonly _exchange: Exchange) {}
|
|
11
12
|
|
|
12
13
|
canHandle(message: BinanceResponse<any>) {
|
|
@@ -53,7 +54,8 @@ export class BinanceTradesMapper
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
export class BinanceBookChangeMapper
|
|
56
|
-
implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', BookChange>
|
|
57
|
+
implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', BookChange>
|
|
58
|
+
{
|
|
57
59
|
protected readonly symbolToDepthInfoMapping: {
|
|
58
60
|
[key: string]: LocalDepthInfo
|
|
59
61
|
} = {}
|
|
@@ -213,7 +215,8 @@ export class BinanceBookChangeMapper
|
|
|
213
215
|
|
|
214
216
|
export class BinanceFuturesBookChangeMapper
|
|
215
217
|
extends BinanceBookChangeMapper
|
|
216
|
-
implements Mapper<'binance-futures' | 'binance-delivery', BookChange>
|
|
218
|
+
implements Mapper<'binance-futures' | 'binance-delivery', BookChange>
|
|
219
|
+
{
|
|
217
220
|
constructor(protected readonly exchange: Exchange, protected readonly ignoreBookSnapshotOverlapError: boolean) {
|
|
218
221
|
super(exchange, ignoreBookSnapshotOverlapError)
|
|
219
222
|
}
|
package/src/mappers/coinflex.ts
CHANGED
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
import { BookChange, Trade, DerivativeTicker } from '../types'
|
|
2
|
-
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
3
|
-
|
|
4
|
-
// https://docs.coinflex.com/v2/#websocket-api-subscriptions-public
|
|
5
|
-
|
|
6
|
-
export const coinflexTradesMapper: Mapper<'coinflex', Trade> = {
|
|
7
|
-
canHandle(message: CoinflexTrades) {
|
|
8
|
-
return message.table === 'trade'
|
|
9
|
-
},
|
|
10
|
-
|
|
11
|
-
getFilters(symbols?: string[]) {
|
|
12
|
-
return [
|
|
13
|
-
{
|
|
14
|
-
channel: 'trade',
|
|
15
|
-
symbols
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
*map(coinflexTrades: CoinflexTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
21
|
-
for (const trade of coinflexTrades.data) {
|
|
22
|
-
yield {
|
|
23
|
-
type: 'trade',
|
|
24
|
-
symbol: trade.marketCode,
|
|
25
|
-
exchange: 'coinflex',
|
|
26
|
-
id: trade.tradeId,
|
|
27
|
-
price: Number(trade.price),
|
|
28
|
-
amount: Number(trade.quantity),
|
|
29
|
-
side: trade.side === 'SELL' ? 'sell' : 'buy',
|
|
30
|
-
timestamp: new Date(Number(trade.timestamp)),
|
|
31
|
-
localTimestamp: localTimestamp
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const mapBookLevel = (level: CoinflexBookLevel) => {
|
|
38
|
-
const price = Number(level[0])
|
|
39
|
-
const amount = Number(level[1])
|
|
40
|
-
|
|
41
|
-
return { price, amount }
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export const coinflexBookChangeMapper: Mapper<'coinflex', BookChange> = {
|
|
45
|
-
canHandle(message: CoinflexBookDepthMessage) {
|
|
46
|
-
return message.table === 'futures/depth'
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
getFilters(symbols?: string[]) {
|
|
50
|
-
return [
|
|
51
|
-
{
|
|
52
|
-
channel: 'futures/depth',
|
|
53
|
-
symbols
|
|
54
|
-
}
|
|
55
|
-
]
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
*map(depthMessage: CoinflexBookDepthMessage, localTimestamp: Date): IterableIterator<BookChange> {
|
|
59
|
-
for (const change of depthMessage.data) {
|
|
60
|
-
yield {
|
|
61
|
-
type: 'book_change',
|
|
62
|
-
symbol: change.instrumentId,
|
|
63
|
-
exchange: 'coinflex',
|
|
64
|
-
isSnapshot: depthMessage.action === 'partial',
|
|
65
|
-
bids: change.bids.map(mapBookLevel),
|
|
66
|
-
asks: change.asks.map(mapBookLevel),
|
|
67
|
-
timestamp: new Date(Number(change.timestamp)),
|
|
68
|
-
localTimestamp
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export class CoinflexDerivativeTickerMapper implements Mapper<'coinflex', DerivativeTicker> {
|
|
75
|
-
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
76
|
-
|
|
77
|
-
canHandle(message: CoinflexTickerMessage) {
|
|
78
|
-
return message.table === 'ticker'
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
getFilters(symbols?: string[]) {
|
|
82
|
-
return [
|
|
83
|
-
{
|
|
84
|
-
channel: 'ticker',
|
|
85
|
-
symbols
|
|
86
|
-
} as const
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
*map(message: CoinflexTickerMessage, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
91
|
-
for (const ticker of message.data) {
|
|
92
|
-
// exclude spot symbols
|
|
93
|
-
if (ticker.marketCode.split('-').length === 2) {
|
|
94
|
-
continue
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(ticker.marketCode, 'coinflex')
|
|
98
|
-
|
|
99
|
-
if (ticker.markPrice !== undefined) {
|
|
100
|
-
pendingTickerInfo.updateMarkPrice(Number(ticker.markPrice))
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (ticker.openInterest !== undefined) {
|
|
104
|
-
pendingTickerInfo.updateOpenInterest(Number(ticker.openInterest))
|
|
105
|
-
}
|
|
106
|
-
if (ticker.last !== undefined) {
|
|
107
|
-
pendingTickerInfo.updateLastPrice(Number(ticker.last))
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
pendingTickerInfo.updateTimestamp(new Date(Number(ticker.timestamp)))
|
|
111
|
-
|
|
112
|
-
if (pendingTickerInfo.hasChanged()) {
|
|
113
|
-
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
type CoinflexTrades = {
|
|
120
|
-
data: [
|
|
121
|
-
{
|
|
122
|
-
side: 'SELL' | 'BUY'
|
|
123
|
-
quantity: string
|
|
124
|
-
price: string
|
|
125
|
-
marketCode: string
|
|
126
|
-
tradeId: string
|
|
127
|
-
timestamp: string
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
table: 'trade'
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
type CoinflexBookLevel = [number | string, number | string]
|
|
134
|
-
|
|
135
|
-
type CoinflexBookDepthMessage = {
|
|
136
|
-
data: [
|
|
137
|
-
{
|
|
138
|
-
instrumentId: string
|
|
139
|
-
asks: CoinflexBookLevel[]
|
|
140
|
-
bids: CoinflexBookLevel[]
|
|
141
|
-
timestamp: string
|
|
142
|
-
}
|
|
143
|
-
]
|
|
144
|
-
action: 'partial'
|
|
145
|
-
table: 'futures/depth'
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
type CoinflexTickerMessage = {
|
|
149
|
-
data: [
|
|
150
|
-
{
|
|
151
|
-
last: string
|
|
152
|
-
markPrice?: string
|
|
153
|
-
marketCode: string
|
|
154
|
-
openInterest: string
|
|
155
|
-
timestamp: string
|
|
156
|
-
}
|
|
157
|
-
]
|
|
158
|
-
table: 'ticker'
|
|
159
|
-
}
|
|
1
|
+
import { BookChange, Trade, DerivativeTicker } from '../types'
|
|
2
|
+
import { Mapper, PendingTickerInfoHelper } from './mapper'
|
|
3
|
+
|
|
4
|
+
// https://docs.coinflex.com/v2/#websocket-api-subscriptions-public
|
|
5
|
+
|
|
6
|
+
export const coinflexTradesMapper: Mapper<'coinflex', Trade> = {
|
|
7
|
+
canHandle(message: CoinflexTrades) {
|
|
8
|
+
return message.table === 'trade'
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
getFilters(symbols?: string[]) {
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
channel: 'trade',
|
|
15
|
+
symbols
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
*map(coinflexTrades: CoinflexTrades, localTimestamp: Date): IterableIterator<Trade> {
|
|
21
|
+
for (const trade of coinflexTrades.data) {
|
|
22
|
+
yield {
|
|
23
|
+
type: 'trade',
|
|
24
|
+
symbol: trade.marketCode,
|
|
25
|
+
exchange: 'coinflex',
|
|
26
|
+
id: trade.tradeId,
|
|
27
|
+
price: Number(trade.price),
|
|
28
|
+
amount: Number(trade.quantity),
|
|
29
|
+
side: trade.side === 'SELL' ? 'sell' : 'buy',
|
|
30
|
+
timestamp: new Date(Number(trade.timestamp)),
|
|
31
|
+
localTimestamp: localTimestamp
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const mapBookLevel = (level: CoinflexBookLevel) => {
|
|
38
|
+
const price = Number(level[0])
|
|
39
|
+
const amount = Number(level[1])
|
|
40
|
+
|
|
41
|
+
return { price, amount }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const coinflexBookChangeMapper: Mapper<'coinflex', BookChange> = {
|
|
45
|
+
canHandle(message: CoinflexBookDepthMessage) {
|
|
46
|
+
return message.table === 'futures/depth'
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
getFilters(symbols?: string[]) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
channel: 'futures/depth',
|
|
53
|
+
symbols
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
*map(depthMessage: CoinflexBookDepthMessage, localTimestamp: Date): IterableIterator<BookChange> {
|
|
59
|
+
for (const change of depthMessage.data) {
|
|
60
|
+
yield {
|
|
61
|
+
type: 'book_change',
|
|
62
|
+
symbol: change.instrumentId,
|
|
63
|
+
exchange: 'coinflex',
|
|
64
|
+
isSnapshot: depthMessage.action === 'partial',
|
|
65
|
+
bids: change.bids.map(mapBookLevel),
|
|
66
|
+
asks: change.asks.map(mapBookLevel),
|
|
67
|
+
timestamp: new Date(Number(change.timestamp)),
|
|
68
|
+
localTimestamp
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export class CoinflexDerivativeTickerMapper implements Mapper<'coinflex', DerivativeTicker> {
|
|
75
|
+
private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
|
|
76
|
+
|
|
77
|
+
canHandle(message: CoinflexTickerMessage) {
|
|
78
|
+
return message.table === 'ticker'
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
getFilters(symbols?: string[]) {
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
channel: 'ticker',
|
|
85
|
+
symbols
|
|
86
|
+
} as const
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
*map(message: CoinflexTickerMessage, localTimestamp: Date): IterableIterator<DerivativeTicker> {
|
|
91
|
+
for (const ticker of message.data) {
|
|
92
|
+
// exclude spot symbols
|
|
93
|
+
if (ticker.marketCode.split('-').length === 2) {
|
|
94
|
+
continue
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(ticker.marketCode, 'coinflex')
|
|
98
|
+
|
|
99
|
+
if (ticker.markPrice !== undefined) {
|
|
100
|
+
pendingTickerInfo.updateMarkPrice(Number(ticker.markPrice))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (ticker.openInterest !== undefined) {
|
|
104
|
+
pendingTickerInfo.updateOpenInterest(Number(ticker.openInterest))
|
|
105
|
+
}
|
|
106
|
+
if (ticker.last !== undefined) {
|
|
107
|
+
pendingTickerInfo.updateLastPrice(Number(ticker.last))
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
pendingTickerInfo.updateTimestamp(new Date(Number(ticker.timestamp)))
|
|
111
|
+
|
|
112
|
+
if (pendingTickerInfo.hasChanged()) {
|
|
113
|
+
yield pendingTickerInfo.getSnapshot(localTimestamp)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
type CoinflexTrades = {
|
|
120
|
+
data: [
|
|
121
|
+
{
|
|
122
|
+
side: 'SELL' | 'BUY'
|
|
123
|
+
quantity: string
|
|
124
|
+
price: string
|
|
125
|
+
marketCode: string
|
|
126
|
+
tradeId: string
|
|
127
|
+
timestamp: string
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
table: 'trade'
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
type CoinflexBookLevel = [number | string, number | string]
|
|
134
|
+
|
|
135
|
+
type CoinflexBookDepthMessage = {
|
|
136
|
+
data: [
|
|
137
|
+
{
|
|
138
|
+
instrumentId: string
|
|
139
|
+
asks: CoinflexBookLevel[]
|
|
140
|
+
bids: CoinflexBookLevel[]
|
|
141
|
+
timestamp: string
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
action: 'partial'
|
|
145
|
+
table: 'futures/depth'
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
type CoinflexTickerMessage = {
|
|
149
|
+
data: [
|
|
150
|
+
{
|
|
151
|
+
last: string
|
|
152
|
+
markPrice?: string
|
|
153
|
+
marketCode: string
|
|
154
|
+
openInterest: string
|
|
155
|
+
timestamp: string
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
table: 'ticker'
|
|
159
|
+
}
|