chore: use previous groupings for calc
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
import {
|
||||
BN,
|
||||
BigNum,
|
||||
DriftClient,
|
||||
DriftEnv,
|
||||
L2Level,
|
||||
L2OrderBook,
|
||||
L3OrderBook,
|
||||
MarketType,
|
||||
@@ -21,6 +21,16 @@ import { logger } from './logger';
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import FEATURE_FLAGS from './featureFlags';
|
||||
import { Connection } from '@solana/web3.js';
|
||||
import { wsMarketArgs } from 'src/dlob-subscriber/DLOBSubscriberIO';
|
||||
|
||||
export const GROUPING_OPTIONS = [1, 10, 100, 500, 1000];
|
||||
export const GROUPING_DEPENDENCIES = {
|
||||
1: null,
|
||||
10: 1,
|
||||
100: 10,
|
||||
500: 100,
|
||||
1000: 100,
|
||||
};
|
||||
|
||||
export const l2WithBNToStrings = (l2: L2OrderBook): any => {
|
||||
for (const key of Object.keys(l2)) {
|
||||
@@ -181,7 +191,7 @@ export function aggregatePrices(entries, side, pricePrecision) {
|
||||
const price = parseFloat(entry.price);
|
||||
const data = {
|
||||
size: parseFloat(entry.size),
|
||||
sources: entry.sources || {}
|
||||
sources: entry.sources || {},
|
||||
};
|
||||
|
||||
let bucketPrice, displayPrice;
|
||||
@@ -207,19 +217,85 @@ export function aggregatePrices(entries, side, pricePrecision) {
|
||||
bucketData.size += data.size;
|
||||
|
||||
if (data.sources) {
|
||||
Object.entries(data.sources).forEach(([sourceKey, sourceSize]: [string, string]) => {
|
||||
if (!bucketData.sources[sourceKey]) {
|
||||
bucketData.sources[sourceKey] = 0;
|
||||
Object.entries(data.sources).forEach(
|
||||
([sourceKey, sourceSize]: [string, string]) => {
|
||||
if (!bucketData.sources[sourceKey]) {
|
||||
bucketData.sources[sourceKey] = 0;
|
||||
}
|
||||
bucketData.sources[sourceKey] += parseFloat(sourceSize);
|
||||
}
|
||||
bucketData.sources[sourceKey] += parseFloat(sourceSize);
|
||||
});
|
||||
);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return Array.from(result.values());
|
||||
}
|
||||
|
||||
export function publishGroupings(
|
||||
l2Formatted,
|
||||
marketArgs: wsMarketArgs,
|
||||
redisClient: RedisClient,
|
||||
clientPrefix: string,
|
||||
marketType: string,
|
||||
indicativeQuotesRedisClient: RedisClient
|
||||
) {
|
||||
const groupingResults = new Map();
|
||||
|
||||
GROUPING_OPTIONS.forEach((group) => {
|
||||
const pricePrecision = BigNum.from(group).mul(marketArgs.tickSize).toNum();
|
||||
const dependency = GROUPING_DEPENDENCIES[group];
|
||||
|
||||
let fullAggregatedBids, fullAggregatedAsks;
|
||||
|
||||
if (dependency && groupingResults.has(dependency)) {
|
||||
const previousResults = groupingResults.get(dependency);
|
||||
|
||||
fullAggregatedBids = aggregatePrices(
|
||||
previousResults.bids,
|
||||
'bid',
|
||||
pricePrecision
|
||||
).sort((a, b) => b[0] - a[0]);
|
||||
|
||||
fullAggregatedAsks = aggregatePrices(
|
||||
previousResults.asks,
|
||||
'ask',
|
||||
pricePrecision
|
||||
).sort((a, b) => a[0] - b[0]);
|
||||
} else {
|
||||
fullAggregatedBids = aggregatePrices(
|
||||
l2Formatted.bids,
|
||||
'bid',
|
||||
pricePrecision
|
||||
).sort((a, b) => b[0] - a[0]);
|
||||
|
||||
fullAggregatedAsks = aggregatePrices(
|
||||
l2Formatted.asks,
|
||||
'ask',
|
||||
pricePrecision
|
||||
).sort((a, b) => a[0] - b[0]);
|
||||
}
|
||||
|
||||
groupingResults.set(group, {
|
||||
bids: fullAggregatedBids,
|
||||
asks: fullAggregatedAsks,
|
||||
});
|
||||
|
||||
const aggregatedBids = fullAggregatedBids.slice(0, 20);
|
||||
const aggregatedAsks = fullAggregatedAsks.slice(0, 20);
|
||||
const l2Formatted_grouped20 = Object.assign({}, l2Formatted, {
|
||||
bids: aggregatedBids,
|
||||
asks: aggregatedAsks,
|
||||
});
|
||||
|
||||
redisClient.publish(
|
||||
`${clientPrefix}orderbook_${marketType}_${
|
||||
marketArgs.marketIndex
|
||||
}_grouped_${group}${indicativeQuotesRedisClient ? '_indicative' : ''}`,
|
||||
l2Formatted_grouped20
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes in a req.query like: `{
|
||||
* marketName: 'SOL-PERP,BTC-PERP,ETH-PERP',
|
||||
|
||||
Reference in New Issue
Block a user