백테스팅 목록 아이템 삭제 기능추가

This commit is contained in:
Macbook
2026-06-12 00:43:07 +09:00
parent 423c60183e
commit 0d338fffe4
9 changed files with 244 additions and 34 deletions
@@ -8,6 +8,7 @@ import { MarketSearchPanel } from './MarketSearchPanel';
import {
loadBacktestResults,
deleteBacktestResult,
deletePaperTradesBatch,
loadPaperTrades,
loadPaperSummary,
loadStrategies,
@@ -41,7 +42,7 @@ import {
buildLiveReportModel,
} from '../utils/backtestReportModel';
import { buildLiveExecutionItems, paperTradesToSignals, type LiveExecutionItem } from '../utils/liveExecutionGroups';
import { PAPER_TRADES_CHANGED_EVENT } from '../utils/paperTradeEvents';
import { PAPER_TRADES_CHANGED_EVENT, notifyPaperTradesChanged } from '../utils/paperTradeEvents';
import {
readStoredSize,
storeSize,
@@ -222,6 +223,42 @@ export function BacktestHistoryPage({ theme = 'dark' }: Props) {
await fetchAll();
}, [records, fetchAll]);
const handleDeleteBacktest = useCallback(async (record: BacktestResultRecord) => {
if (record.id == null) return;
const market = toUpbitMarket(record.symbol);
const ko = getKoreanName(market);
if (!window.confirm(`"${ko}" 백테스팅 결과를 삭제하시겠습니까?`)) return;
try {
await deleteBacktestResult(record.id);
setRecords(prev => {
const next = prev.filter(r => r.id !== record.id);
setSelectedBacktest(sel => (sel?.id === record.id ? next[0] ?? null : sel));
return next;
});
} catch (e) {
window.alert(e instanceof Error ? e.message : '삭제에 실패했습니다.');
}
}, []);
const handleDeleteLive = useCallback(async (item: LiveExecutionItem) => {
const ids = item.trades.map(t => t.id).filter(id => id > 0);
if (ids.length === 0) return;
const market = toUpbitMarket(item.symbol);
const ko = getKoreanName(market);
if (!window.confirm(`"${ko}" ${item.strategyLabel} 실시간 매매 이력(${ids.length}건)을 삭제하시겠습니까?`)) return;
try {
const deleted = await deletePaperTradesBatch(ids);
if (deleted <= 0) {
window.alert('삭제할 체결 이력을 찾지 못했습니다.');
return;
}
await refreshLiveTrades();
notifyPaperTradesChanged();
} catch (e) {
window.alert(e instanceof Error ? e.message : '삭제에 실패했습니다.');
}
}, [refreshLiveTrades]);
const handleQuickRun = useCallback(async () => {
if (!runStrategyId) {
window.alert('전략을 선택해주세요.');
@@ -519,6 +556,8 @@ export function BacktestHistoryPage({ theme = 'dark' }: Props) {
selectedLiveId={selectedLive?.id ?? null}
onSelectBacktest={r => { setSelectedBacktest(r); setTab('backtest'); }}
onSelectLive={item => { setSelectedLive(item); setTab('live'); }}
onDeleteBacktest={r => void handleDeleteBacktest(r)}
onDeleteLive={item => void handleDeleteLive(item)}
/>
</aside>