diff --git a/frontend/src/components/EChartsIntraday.tsx b/frontend/src/components/EChartsIntraday.tsx index dae6b00..8b777da 100644 --- a/frontend/src/components/EChartsIntraday.tsx +++ b/frontend/src/components/EChartsIntraday.tsx @@ -30,7 +30,8 @@ interface Props { showAvgLine?: boolean } -function fmtAmt(v: number): string { +function fmtAmt(v: number | null | undefined): string { + if (v == null || !Number.isFinite(v)) return '—' if (v >= 1_000_000_000) return `${(v / 1_000_000_000).toFixed(2)}亿` if (v >= 10_000) return `${(v / 10_000).toFixed(0)}万` return v.toFixed(0) diff --git a/frontend/src/components/EChartsMultiDayIntraday.tsx b/frontend/src/components/EChartsMultiDayIntraday.tsx index 1db4dc3..8012726 100644 --- a/frontend/src/components/EChartsMultiDayIntraday.tsx +++ b/frontend/src/components/EChartsMultiDayIntraday.tsx @@ -29,7 +29,8 @@ interface InfoPoint { prevClose: number | null } -function formatAmount(value: number): string { +function formatAmount(value: number | null | undefined): string { + if (value == null || !Number.isFinite(value)) return '—' if (value >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(2)}亿` if (value >= 10_000) return `${(value / 10_000).toFixed(0)}万` return value.toFixed(0) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index a5efd2d..0f20fa5 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -208,7 +208,7 @@ export interface MinuteKlineRow { low: number close: number volume: number - amount: number + amount: number | null } export interface MinuteKlineSession { diff --git a/frontend/src/lib/intraday-chart.ts b/frontend/src/lib/intraday-chart.ts index eac5aff..2d96c8f 100644 --- a/frontend/src/lib/intraday-chart.ts +++ b/frontend/src/lib/intraday-chart.ts @@ -11,10 +11,15 @@ export function computeIntradayAverage(data: MinuteKlineRow[]): number[] { const result: number[] = [] let amount = 0 let volume = 0 + let hasAmount = true for (const row of data) { - amount += row.amount + if (typeof row.amount === 'number' && Number.isFinite(row.amount)) { + amount += row.amount + } else { + hasAmount = false + } volume += row.volume * 100 - result.push(volume > 0 ? amount / volume : row.close) + result.push(hasAmount && volume > 0 ? amount / volume : row.close) } return result }