worldIndex.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // 세계 주요국 증시지수 도메인 타입 — Backend Application/Features/Api/Stocks/GetWorldIndices/Response.cs 대응
  2. // 직렬화 주의: 필드명 camelCase. flucRateBp = 등락률 basis point(%×100). enum 없음(전부 primitive).
  3. // ── GET /api/market/world-indices ──
  4. export interface WorldIndexRow {
  5. countryCode: string; // ISO2 대문자 — EXCHANGE_GEO 좌표맵 키
  6. name: string; // 지수명 (예: "코스피", "S&P 500")
  7. exchangeName: string;
  8. close: number;
  9. changeVal: number;
  10. flucRateBp: number; // %×100 (예: -70 = -0.70%)
  11. tradeDate: string; // yyyy-MM-dd
  12. }
  13. export interface WorldIndicesResponse {
  14. list: WorldIndexRow[];
  15. }
  16. // ── 국가 → 지도 좌표(위경도) + 표시명. 나라당 1개(대표 지수) 기준 ──
  17. // 프론트가 국가 코드로 세계지도 핀 위치를 정한다(백엔드는 좌표를 보내지 않음 — 응답 경량화).
  18. export interface ExchangeGeo {
  19. lat: number;
  20. lng: number;
  21. label: string; // 국가 표시명 (한글)
  22. }
  23. export const EXCHANGE_GEO: Record<string, ExchangeGeo> = {
  24. US: { lat: 40.7, lng: -74.0, label: '미국' },
  25. KR: { lat: 37.5, lng: 127.0, label: '한국' },
  26. JP: { lat: 35.7, lng: 139.7, label: '일본' },
  27. CN: { lat: 31.2, lng: 121.5, label: '중국' },
  28. HK: { lat: 22.3, lng: 114.2, label: '홍콩' },
  29. TW: { lat: 25.0, lng: 121.6, label: '대만' },
  30. SG: { lat: 1.35, lng: 103.8, label: '싱가포르' },
  31. IN: { lat: 19.1, lng: 72.9, label: '인도' },
  32. GB: { lat: 51.5, lng: -0.1, label: '영국' },
  33. DE: { lat: 50.1, lng: 8.7, label: '독일' },
  34. FR: { lat: 48.9, lng: 2.3, label: '프랑스' },
  35. CA: { lat: 43.7, lng: -79.4, label: '캐나다' },
  36. BR: { lat: -23.5, lng: -46.6, label: '브라질' },
  37. AU: { lat: -33.9, lng: 151.2, label: '호주' }
  38. };
  39. // ── 등락 상태 ──
  40. export type MoveDir = 'up' | 'down' | 'flat';
  41. export function moveDir(flucRateBp: number): MoveDir {
  42. if (flucRateBp > 0) {
  43. return 'up';
  44. }
  45. if (flucRateBp < 0) {
  46. return 'down';
  47. }
  48. return 'flat';
  49. }
  50. // 등락률 Bp → "+1.45%" / "-0.70%" / "0.00%"
  51. export function formatFlucRate(flucRateBp: number): string {
  52. const pct = flucRateBp / 100;
  53. const sign = flucRateBp > 0 ? '+' : '';
  54. return `${sign}${pct.toFixed(2)}%`;
  55. }
  56. // 종가 표시 — 천단위 콤마 + 소수 2자리
  57. export function formatIndexClose(close: number): string {
  58. return close.toLocaleString('ko-KR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
  59. }