/** * BacktestResultModal / BacktestDashboard * ───────────────────────────────────────────────────────────────────── * BacktestDashboard — 카드 기반 대시보드 (재사용 가능) * BacktestResultModal — 드래그 팝업으로 Dashboard를 감싸는 래퍼 */ import React from 'react'; import type { BacktestAnalysis, BacktestSignal, BacktestStats } from '../utils/backendApi'; import { useDraggablePanel } from '../hooks/useDraggablePanel'; import { repairUtf8Mojibake } from '../utils/textEncoding'; import { pct, pctAbs, num, wonFmt, colorCls, SectionTitle, KpiCard, MetricRow, WinRateCircle, CompareBar, } from './shared/analysisDashboardUi'; import { analysisMethodLabel } from '../utils/analysisMethodLabels'; import BacktestSignalTable from './backtest/BacktestSignalTable'; const fmtDate = (ts: number) => { const d = new Date(ts * 1000); return `${d.getFullYear()}.${String(d.getMonth()+1).padStart(2,'0')}.${String(d.getDate()).padStart(2,'0')}`; }; const fmtDateStr = (iso: string) => { const d = new Date(iso); return `${d.getFullYear()}.${String(d.getMonth()+1).padStart(2,'0')}.${String(d.getDate()).padStart(2,'0')} ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}`; }; // ── Props ───────────────────────────────────────────────────────────────── export interface BacktestResultModalProps { analysis?: BacktestAnalysis | null; stats?: BacktestStats | null; signals?: BacktestSignal[]; strategyName: string; symbol: string; timeframe: string; barCount: number; onClose: () => void; embedded?: boolean; } export interface BacktestDashboardProps { analysis: BacktestAnalysis | null; signals: BacktestSignal[]; strategyName: string; symbol: string; timeframe: string; barCount: number; createdAt?: string; /** 레포트·PDF — 시그널 전체 표시·인쇄용 레이아웃 */ reportMode?: boolean; /** false — 거래 시그널 섹션 숨김 (별도 패널에 표시) */ hideSignals?: boolean; } // ── 시그널 타입 ─────────────────────────────────────────────────────────── // ══════════════════════════════════════════════════════════════════════════ // BacktestDashboard — 메인 대시보드 컴포넌트 (재사용 가능) // ══════════════════════════════════════════════════════════════════════════ export function BacktestDashboard({ analysis, signals, strategyName, symbol, timeframe, barCount, createdAt, reportMode = false, hideSignals = false, }: BacktestDashboardProps) { const a = analysis; if (!a) { return (
결과 데이터가 없습니다.