import React, { useCallback, useEffect, useState } from 'react'; import { loadStrategies, loadLiveStrategySettings, saveLiveStrategySettings, type LiveStrategySettingsDto, type PaperSummaryDto, type StrategyDto, } from '../../utils/backendApi'; import { fmtKrw } from '../TradeOrderPanel'; import PaperSplitPanel from './PaperSplitPanel'; const CANDLE_TYPES = ['1m', '3m', '5m', '15m', '30m', '1h', '4h', '1d'] as const; interface Props { market: string; summary: PaperSummaryDto | null; paperAutoTradeEnabled?: boolean; onMarketSelect?: (market: string) => void; } const PaperLeftStrategyTab: React.FC = ({ market, summary, paperAutoTradeEnabled = false, onMarketSelect, }) => { const [strategies, setStrategies] = useState([]); const [settings, setSettings] = useState(null); const [saving, setSaving] = useState(false); useEffect(() => { loadStrategies().then(setStrategies).catch(() => setStrategies([])); }, []); useEffect(() => { let cancelled = false; loadLiveStrategySettings(market) .then(s => { if (!cancelled) setSettings(s); }) .catch(() => { if (!cancelled) { setSettings({ market, strategyId: null, isLiveCheck: false, executionType: 'CANDLE_CLOSE', positionMode: 'LONG_ONLY', candleType: '1m', }); } }); return () => { cancelled = true; }; }, [market]); const persist = useCallback(async (patch: Partial) => { if (!settings) return; const next = { ...settings, ...patch, market }; const prev = settings; setSettings(next); setSaving(true); try { const saved = await saveLiveStrategySettings(next); if (saved) setSettings(saved); else setSettings(prev); } catch { setSettings(prev); } finally { setSaving(false); } }, [settings, market]); const selected = strategies.find(s => s.id === settings?.strategyId); const top = ( <>
{summary ? fmtKrw(summary.totalAsset) : '—'} KRW
= 0 ? 'up' : 'down'}`}> {summary ? `${(summary.totalReturnPct ?? 0) >= 0 ? '+' : ''}${summary.totalReturnPct.toFixed(2)}%` : '—'}
{selected &&

적용: {selected.name}

}

{paperAutoTradeEnabled ? '자동매매 ON' : '자동매매 OFF — 설정 탭에서 변경'}

); const bottom = ( {(summary?.positions ?? []).length === 0 ? ( ) : summary!.positions.map(p => { const code = p.symbol.replace(/^KRW-/, ''); const up = (p.profitLoss ?? 0) >= 0; return ( onMarketSelect?.(p.symbol)} > ); })}
자산수량손익
보유 없음
{code} {p.quantity.toFixed(4)} {p.profitLoss != null ? `${up ? '+' : ''}${fmtKrw(p.profitLoss)}` : '—'}
); return ( ); }; export default PaperLeftStrategyTab;