From 7b765d884e513ab75c7268fabea75e4d2fd7f97b Mon Sep 17 00:00:00 2001 From: Sirttas Date: Wed, 13 Sep 2023 16:24:55 +0200 Subject: [PATCH] Market quartils --- src/market/Market.vue | 77 +++++++++++++++++++++++++- src/market/index.ts | 2 + src/market/market.ts | 59 ++++++++++++++++++++ src/market/type/MarketType.ts | 16 ++++++ src/reprocess/ReprocessResultTable.vue | 8 ++- src/reprocess/index.ts | 4 +- src/utils.ts | 1 + 7 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 src/market/index.ts create mode 100644 src/market/market.ts create mode 100644 src/market/type/MarketType.ts create mode 100644 src/utils.ts diff --git a/src/market/Market.vue b/src/market/Market.vue index 034b822..3684fb8 100644 --- a/src/market/Market.vue +++ b/src/market/Market.vue @@ -1,9 +1,80 @@ \ No newline at end of file diff --git a/src/market/index.ts b/src/market/index.ts new file mode 100644 index 0000000..0354896 --- /dev/null +++ b/src/market/index.ts @@ -0,0 +1,2 @@ +export * from './market'; + diff --git a/src/market/market.ts b/src/market/market.ts new file mode 100644 index 0000000..5bb3af7 --- /dev/null +++ b/src/market/market.ts @@ -0,0 +1,59 @@ +import { esiAxiosInstance } from "@/service"; + +export const jitaId = 10000002; + +export type MarketOrderHistory = { + average: number; + date: string; + highest: number; + lowest: number; + order_count: number; + volume: number; +} + +export const getHistory = async (regionId: number, tyeId: number): Promise => (await esiAxiosInstance.get(`/markets/${regionId}/history/`, { params: { type_id: tyeId } })).data; + +export const getHistoryQuartils = async (regionId: number, tyeId: number): Promise<[number, number, number]> => { + const history = await getHistory(regionId, tyeId); + const volumes = history + .flatMap(h => { + const volume = h.volume; + + if (volume === 0) { + 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 quartils; +} + +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)))); +} \ No newline at end of file diff --git a/src/market/type/MarketType.ts b/src/market/type/MarketType.ts new file mode 100644 index 0000000..b7c9d02 --- /dev/null +++ b/src/market/type/MarketType.ts @@ -0,0 +1,16 @@ +import { apiAxiosInstance } from "@/service"; + +export type MarketType = { + id: number; + group_id: number; + marketgroup_id: number; + name: string; + published: boolean; + description: string; + basePrice: number; + icon_id: number; + volume: number; + portionSize: number; +} + +export const searchMarketType = async (name: string): Promise => (await apiAxiosInstance.post("/sde/types/search", [["name", name]])).data[0]; diff --git a/src/reprocess/ReprocessResultTable.vue b/src/reprocess/ReprocessResultTable.vue index 87074c2..e0963e2 100644 --- a/src/reprocess/ReprocessResultTable.vue +++ b/src/reprocess/ReprocessResultTable.vue @@ -1,6 +1,7 @@