Prechádzať zdrojové kódy

mat: work around FIO bug that shows old data

raylu 1 mesiac pred
rodič
commit
8053edc35c
1 zmenil súbory, kde vykonal 20 pridanie a 6 odobranie
  1. 20 6
      ts/mat.ts

+ 20 - 6
ts/mat.ts

@@ -31,25 +31,39 @@ async function render() {
 		getCXPC(tickerSelect.value, 'NC1'), getCXPC(tickerSelect.value, 'CI1'),
 		getCXPC(tickerSelect.value, 'IC1'), getCXPC(tickerSelect.value, 'AI1'),
 	]);
-	const maxPrice = Math.max(...cxpc.flatMap((cxPrices) => cxPrices.map((p) => p.High)));
-	const maxTraded = Math.max(...cxpc.flatMap((cxPrices) => cxPrices.map((t) => t.Traded)));
+
+	let minDate = null, maxDate = null;
+	let maxPrice = 0, maxTraded = 0;
+	for (const cxPrices of cxpc)
+		for (const p of cxPrices) {
+			if (minDate === null || p.DateEpochMs < minDate) minDate = p.DateEpochMs;
+			if (maxDate === null || p.DateEpochMs > maxDate) maxDate = p.DateEpochMs;
+			if (p.High > maxPrice) maxPrice = p.High;
+			if (p.Traded > maxTraded) maxTraded = p.Traded;
+		}
+	if (minDate === null || maxDate === null)
+		throw new Error('no data');
+
+	const dateRange: [Date, Date] = [new Date(minDate), new Date(maxDate)];
 	charts.append(
-		renderPriceChart('NC1', maxPrice, maxTraded, cxpc[0]), renderPriceChart('CI1', maxPrice, maxTraded, cxpc[1]),
-		renderPriceChart('IC1', maxPrice, maxTraded, cxpc[2]), renderPriceChart('AI1', maxPrice, maxTraded, cxpc[3]),
+		renderPriceChart('NC1', dateRange, maxPrice, maxTraded, cxpc[0]), renderPriceChart('CI1', dateRange, maxPrice, maxTraded, cxpc[1]),
+		renderPriceChart('IC1', dateRange, maxPrice, maxTraded, cxpc[2]), renderPriceChart('AI1', dateRange, maxPrice, maxTraded, cxpc[3]),
 	);
 }
 
 async function getCXPC(ticker: string, cx: string): Promise<PriceChartPoint[]> {
 	const cxpc: PriceChartPoint[] = await cachedFetchJSON(`https://rest.fnar.net/exchange/cxpc/${ticker}.${cx}`);
-	return cxpc.filter((p) => p.Interval === 'HOUR_TWELVE');
+	const threshold = Date.now() - 100 * 24 * 60 * 60 * 1000; // work around FIO bug that shows old data
+	return cxpc.filter((p) => p.Interval === 'HOUR_TWELVE' && p.DateEpochMs > threshold);
 }
 
-function renderPriceChart(cx: string, maxPrice: number, maxTraded: number, cxpc: PriceChartPoint[]):
+function renderPriceChart(cx: string, dateRange: [Date, Date], maxPrice: number, maxTraded: number, cxpc: PriceChartPoint[]):
 		SVGSVGElement | HTMLElement {
 	return Plot.plot({
 		grid: true,
 		width: charts.getBoundingClientRect().width / 2 - 10,
 		height: 400,
+		x: {domain: dateRange},
 		y: {axis: 'left', label: cx, domain: [0, maxPrice * 1.1]},
 		marks: [
 			Plot.axisY(d3.ticks(0, maxTraded * 1.5, 10), {