[#151] fill gaps in orderbook data
This commit is contained in:
parent
279acca6dc
commit
90ea4e4ab3
@ -217,14 +217,14 @@ describe('updateCompactedData', () => {
|
|||||||
resolution
|
resolution
|
||||||
);
|
);
|
||||||
expect(updatedData[0].ask).toEqual(20);
|
expect(updatedData[0].ask).toEqual(20);
|
||||||
expect(updatedData[0].askByLevel?.[120]).toEqual(10);
|
expect(updatedData[0].askByLevel?.['120']).toEqual(10);
|
||||||
expect(updatedData[0].cumulativeVol.ask).toEqual(60);
|
expect(updatedData[0].cumulativeVol.ask).toEqual(60);
|
||||||
expect(updatedData[2].bid).toEqual(20);
|
expect(updatedData[4].bid).toEqual(20);
|
||||||
expect(updatedData[2].bidByLevel?.[80]).toEqual(10);
|
expect(updatedData[4].bidByLevel?.['80']).toEqual(10);
|
||||||
expect(updatedData[2].cumulativeVol.bid).toEqual(60);
|
expect(updatedData[4].cumulativeVol.bid).toEqual(60);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('remove row', () => {
|
it('update with zero value volume', () => {
|
||||||
const sell: MarketDepthSubscription_marketDepthUpdate_sell = {
|
const sell: MarketDepthSubscription_marketDepthUpdate_sell = {
|
||||||
__typename: 'PriceLevel',
|
__typename: 'PriceLevel',
|
||||||
price: '121',
|
price: '121',
|
||||||
@ -243,7 +243,7 @@ describe('updateCompactedData', () => {
|
|||||||
[buy],
|
[buy],
|
||||||
resolution
|
resolution
|
||||||
);
|
);
|
||||||
expect(updatedData.length).toEqual(1);
|
expect(updatedData.length).toEqual(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('add new row at the end', () => {
|
it('add new row at the end', () => {
|
||||||
@ -265,11 +265,11 @@ describe('updateCompactedData', () => {
|
|||||||
[buy],
|
[buy],
|
||||||
resolution
|
resolution
|
||||||
);
|
);
|
||||||
expect(updatedData.length).toEqual(5);
|
expect(updatedData.length).toEqual(8);
|
||||||
expect(updatedData[0].price).toEqual('130');
|
expect(updatedData[0].price).toEqual('130');
|
||||||
expect(updatedData[0].cumulativeVol.ask).toEqual(55);
|
expect(updatedData[0].cumulativeVol.ask).toEqual(55);
|
||||||
expect(updatedData[4].price).toEqual('60');
|
expect(updatedData[7].price).toEqual('60');
|
||||||
expect(updatedData[4].cumulativeVol.bid).toEqual(55);
|
expect(updatedData[7].cumulativeVol.bid).toEqual(55);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('add new row in the middle', () => {
|
it('add new row in the middle', () => {
|
||||||
|
@ -95,6 +95,27 @@ const mapRawData =
|
|||||||
): OrderbookData =>
|
): OrderbookData =>
|
||||||
createData(data.price, Number(data.volume), dataType);
|
createData(data.price, Number(data.volume), dataType);
|
||||||
|
|
||||||
|
const fillGaps = (orderbookData: OrderbookData[], resolution: number) => {
|
||||||
|
if (orderbookData.length < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let index = 0;
|
||||||
|
while (index < orderbookData.length - 1) {
|
||||||
|
if (
|
||||||
|
BigInt(orderbookData[index].price) -
|
||||||
|
BigInt(orderbookData[index + 1].price) !==
|
||||||
|
BigInt(resolution)
|
||||||
|
) {
|
||||||
|
const data = createData(
|
||||||
|
(BigInt(orderbookData[index].price) - BigInt(resolution)).toString()
|
||||||
|
);
|
||||||
|
data.cumulativeVol = { ...orderbookData[index].cumulativeVol };
|
||||||
|
orderbookData.splice(index + 1, 0, data);
|
||||||
|
}
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @summary merges sell amd buy data, orders by price desc, group by price level, counts cumulative and relative values
|
* @summary merges sell amd buy data, orders by price desc, group by price level, counts cumulative and relative values
|
||||||
*/
|
*/
|
||||||
@ -163,6 +184,8 @@ export const compactData = (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// fill gaps between price levels
|
||||||
|
fillGaps(orderbookData, resolution);
|
||||||
// count relative volumes
|
// count relative volumes
|
||||||
updateRelativeData(orderbookData);
|
updateRelativeData(orderbookData);
|
||||||
return orderbookData;
|
return orderbookData;
|
||||||
@ -274,15 +297,8 @@ export const updateCompactedData = (
|
|||||||
draft[i - 1].cumulativeVol.bid + draft[i].bid;
|
draft[i - 1].cumulativeVol.bid + draft[i].bid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let index = 0;
|
// fill gaps between price levels
|
||||||
// remove levels that do not have any volume
|
fillGaps(draft, resolution);
|
||||||
while (index < draft.length) {
|
|
||||||
if (!draft[index].ask && !draft[index].bid) {
|
|
||||||
draft.splice(index, 1);
|
|
||||||
} else {
|
|
||||||
index += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// count relative volumes
|
// count relative volumes
|
||||||
updateRelativeData(draft);
|
updateRelativeData(draft);
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user