백테스팅 목록 아이템 삭제 기능추가
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user