// 주요 종목·상품 시세 도메인 타입 — Backend Application/Features/Api/Stocks/GetMarketQuotes/Response.cs 대응 // 직렬화 주의: 필드명 camelCase. category 는 숫자값(enum), flucRateBp = %×100. // ── GET /api/market/quotes ── export interface MarketQuoteRow { symbol: string; name: string; category: number; // 0 Stock,1 Commodity,2 Futures,3 Fx,4 BondYield groupCode: string; // us-major | asia-major | commodity ... countryCode: string; close: number; changeVal: number; flucRateBp: number; // %×100 volume: number; tradeDate: string; // yyyy-MM-dd } export interface MarketQuotesResponse { list: MarketQuoteRow[]; } // 그룹 코드 → 표시 라벨 (탭) export const GROUP_LABELS: Record = { 'us-major': '미국 주요', 'asia-major': '아시아 주요', 'europe-major': '유럽 주요', 'commodity': '상품·선물', 'macro': '환율·금리' }; export function groupLabel(code: string): string { return GROUP_LABELS[code] ?? code; } // 심볼 → TradingView 심볼(드릴다운). 미국주만 확정 매핑 — 그 외는 null(차트 버튼 미표시). // Yahoo 미국주는 접미사 없는 순수 티커(AAPL)라 TradingView 동일 심볼. (구) Stooq 표기(aapl.us)도 하위호환. export function tvSymbolForQuote(symbol: string): string|null { const s = symbol.trim(); if (/\.us$/i.test(s)) { return s.slice(0, -3).toUpperCase(); } if (/^[A-Za-z]{1,6}$/.test(s)) { return s.toUpperCase(); } return null; } // 거래량 축약 — 0 이하는 "-", 백만/천 단위 축약 export function formatVolume(volume: number): string { if (volume <= 0) { return '-'; } if (volume >= 1_000_000) { return `${(volume / 1_000_000).toFixed(1)}M`; } if (volume >= 1_000) { return `${Math.round(volume / 1_000)}K`; } return volume.toLocaleString('ko-KR'); } // 전일비 — "+1.23" / "-0.45" (부호 + 천단위 콤마 + 소수 2자리) export function formatChangeVal(changeVal: number): string { const sign = changeVal > 0 ? '+' : ''; return `${sign}${changeVal.toLocaleString('ko-KR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; }