import React, { useState } from 'react' import { OHLCVPoint } from '../api/stockApi' interface Props { data: OHLCVPoint[] rows?: number } function fmt(v: number | undefined): string { if (v == null) return '—' const abs = Math.abs(v) const sign = v < 0 ? '-' : '+' if (abs >= 1_000_000) return `${sign}${(abs / 1_000_000).toFixed(2)}M` if (abs >= 1_000) return `${sign}${(abs / 1_000).toFixed(0)}K` return `${sign}${Math.round(abs)}` } function cls(v: number | undefined): string { if (v == null || v === 0) return 'text-slate-400' return v > 0 ? 'text-green-400' : 'text-red-400' } export const InstitutionalFlowTable: React.FC = ({ data, rows = 20 }) => { const [expanded, setExpanded] = useState(false) const visible = expanded ? rows : 10 const filtered = data .filter((d) => d.institutional_available) .slice(-rows) .reverse() .slice(0, visible) if (!filtered.length) return (

尚無三大法人資料(僅台股 TWSE/TPEx)

) return (
{filtered.map((d, i) => ( ))}
日期 外資買 外資賣 外資淨 投信買 投信賣 投信淨 自營買 自營賣 自營淨 合計淨
{d.date} {d.institutional_carry_forward && ( )} {fmt(d.foreign_buy)} {d.foreign_sell != null ? fmt(-d.foreign_sell) : '—'} {fmt(d.foreign_net)} {fmt(d.trust_buy)} {d.trust_sell != null ? fmt(-d.trust_sell) : '—'} {fmt(d.trust_net)} {fmt(d.dealer_buy)} {d.dealer_sell != null ? fmt(-d.dealer_sell) : '—'} {fmt(d.dealer_net)} {fmt(d.institutional_net)}
{filtered.length >= 10 && rows > 10 && ( )}
) }