From 1b6845e8ab62ee6fea8b63e4eba04d3f904568ed Mon Sep 17 00:00:00 2001 From: Jack Waller Date: Thu, 27 Nov 2025 15:11:36 +1100 Subject: [PATCH] chore: test publish at least uncrossed 20 levels --- src/utils/utils.ts | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index fdea26d..b35c559 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -310,26 +310,39 @@ export function publishGroupings( asks: fullAggregatedAsks, }); - const aggregatedBids = fullAggregatedBids.slice(0, 20); - const aggregatedAsks = fullAggregatedAsks.slice(0, 20); + // Count crossed levels at the beginning + let crossedBids = 0; + const bestAsk = fullAggregatedAsks[0]?.[0]; + if (bestAsk !== undefined) { + for (const bid of fullAggregatedBids) { + if (bid[0] >= bestAsk) { + crossedBids++; + } else { + break; // Stop at first uncrossed level + } + } + } + + let crossedAsks = 0; + const bestBid = fullAggregatedBids[0]?.[0]; + if (bestBid !== undefined) { + for (const ask of fullAggregatedAsks) { + if (ask[0] <= bestBid) { + crossedAsks++; + } else { + break; // Stop at first uncrossed level + } + } + } + + const aggregatedBids = fullAggregatedBids.slice(0, 20 + crossedBids); + const aggregatedAsks = fullAggregatedAsks.slice(0, 20 + crossedAsks); + const l2Formatted_grouped20 = Object.assign({}, l2Formatted, { bids: aggregatedBids, asks: aggregatedAsks, }); - if ( - (['SOL-PERP', 'BTC-PERP', 'ETH-PERP'].includes( - l2Formatted_grouped20.marketName - ) && - aggregatedBids.length !== 20) || - aggregatedAsks.length !== 20 - ) { - logger.error( - `Error aggregating dlob levels: group=${group}, bids=${fullAggregatedBids.length}, asks=${fullAggregatedAsks.length}` - ); - logger.error(`Response: ${JSON.stringify(l2Formatted_grouped20)}`); - } - redisClient.publish( `${clientPrefix}orderbook_${marketType}_${ marketArgs.marketIndex