marketQuote.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // 주요 종목·상품 시세 도메인 타입 — Backend Application/Features/Api/Stocks/GetMarketQuotes/Response.cs 대응
  2. // 직렬화 주의: 필드명 camelCase. category 는 숫자값(enum), flucRateBp = %×100.
  3. // ── GET /api/market/quotes ──
  4. export interface MarketQuoteRow {
  5. symbol: string;
  6. name: string;
  7. category: number; // 0 Stock,1 Commodity,2 Futures,3 Fx,4 BondYield
  8. groupCode: string; // us-major | asia-major | commodity ...
  9. countryCode: string;
  10. close: number;
  11. changeVal: number;
  12. flucRateBp: number; // %×100
  13. volume: number;
  14. tradeDate: string; // yyyy-MM-dd
  15. }
  16. export interface MarketQuotesResponse {
  17. list: MarketQuoteRow[];
  18. }
  19. // 그룹 코드 → 표시 라벨 (탭)
  20. export const GROUP_LABELS: Record<string, string> = {
  21. 'us-major': '미국 주요',
  22. 'asia-major': '아시아 주요',
  23. 'europe-major': '유럽 주요',
  24. 'commodity': '상품·선물'
  25. };
  26. export function groupLabel(code: string): string {
  27. return GROUP_LABELS[code] ?? code;
  28. }
  29. // Stooq 심볼 → TradingView 심볼(드릴다운). 미국주(.us)만 확정 매핑 — 그 외는 null(차트 버튼 미표시).
  30. export function tvSymbolForQuote(symbol: string): string|null {
  31. const s = symbol.trim().toLowerCase();
  32. if (s.endsWith('.us')) {
  33. return s.slice(0, -3).toUpperCase();
  34. }
  35. return null;
  36. }
  37. // 거래량 축약 — 0 이하는 "-", 백만/천 단위 축약
  38. export function formatVolume(volume: number): string {
  39. if (volume <= 0) {
  40. return '-';
  41. }
  42. if (volume >= 1_000_000) {
  43. return `${(volume / 1_000_000).toFixed(1)}M`;
  44. }
  45. if (volume >= 1_000) {
  46. return `${Math.round(volume / 1_000)}K`;
  47. }
  48. return volume.toLocaleString('ko-KR');
  49. }
  50. // 전일비 — "+1.23" / "-0.45" (부호 + 천단위 콤마 + 소수 2자리)
  51. export function formatChangeVal(changeVal: number): string {
  52. const sign = changeVal > 0 ? '+' : '';
  53. return `${sign}${changeVal.toLocaleString('ko-KR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
  54. }