59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { MarketOrderHistory } from "@/market";
|
|
|
|
export type HistoryQuartils = {
|
|
totalVolume: number,
|
|
q1: number,
|
|
median: number,
|
|
q3: number,
|
|
}
|
|
|
|
export const getHistoryQuartils = (history: MarketOrderHistory[], days?: number): HistoryQuartils => {
|
|
const now = Date.now();
|
|
|
|
const volumes = history
|
|
.flatMap(h => {
|
|
const volume = h.volume;
|
|
|
|
if (volume === 0 || (days && new Date(h.date).getTime() < now - days * 24 * 60 * 60 * 1000)) {
|
|
return [];
|
|
}
|
|
|
|
const e = estimateVolume(h);
|
|
|
|
return [[h.highest, e], [h.lowest, volume - e]];
|
|
})
|
|
.filter(h => h[1] > 0)
|
|
.sort((a, b) => a[0] - b[0]);
|
|
|
|
const totalVolume = volumes.reduce((acc, [_, v]) => acc + v, 0);
|
|
const quartilVolume = totalVolume / 4;
|
|
const quartils: [number, number, number] = [0, 0, 0];
|
|
|
|
let currentVolume = 0;
|
|
let quartil = 0;
|
|
|
|
for (const [price, volume] of volumes) {
|
|
currentVolume += volume;
|
|
|
|
if (currentVolume >= quartilVolume * (quartil + 1)) {
|
|
quartils[quartil] = price;
|
|
if (quartil === 2) {
|
|
break;
|
|
}
|
|
quartil++;
|
|
}
|
|
}
|
|
return {
|
|
totalVolume,
|
|
q1: quartils[0],
|
|
median: quartils[1],
|
|
q3: quartils[2],
|
|
};
|
|
}
|
|
|
|
const estimateVolume = (history: MarketOrderHistory): number => {
|
|
if (history.volume === 0) {
|
|
return 0;
|
|
}
|
|
return Math.max(1, Math.round(history.volume * ((history.average - history.lowest) / (history.highest - history.lowest))));
|
|
} |