가상매매 기본전략 설정

This commit is contained in:
Macbook
2026-06-07 19:21:54 +09:00
parent 2f3133d413
commit 76d4de56bd
5 changed files with 102 additions and 32 deletions
+22 -13
View File
@@ -37,8 +37,11 @@ import {
import { pinStrategyEvaluationTimeframes } from '../utils/strategyTimeframePin';
import { persistVirtualTargetPinned } from '../utils/virtualTargetMutations';
import {
applyDefaultGlobalStrategyToSession,
ensureDefaultGlobalStrategyId,
freezeTargetsBeforeGlobalStrategyChange,
resolveVirtualTargetStrategyId,
resolveStrategyIdForNewTarget,
} from '../utils/virtualTargetStrategy';
import {
isVirtualTargetAddAllowed,
@@ -143,12 +146,13 @@ export function useVirtualTradingCore(options: UseVirtualTradingCoreOptions = {}
const validIds = new Set(
s.map(x => x.id).filter((id): id is number => id != null && id > 0),
);
setSession(prev => {
const next = prev.globalStrategyId != null && !validIds.has(prev.globalStrategyId)
? { ...prev, globalStrategyId: null }
: prev;
return mergeVirtualSessionWithAppLive(next, appLiveStrategyId);
});
setSession(prev =>
applyDefaultGlobalStrategyToSession(
mergeVirtualSessionWithAppLive(prev, appLiveStrategyId),
s,
appLiveStrategyId,
),
);
setTargets(prev =>
prev.map(t =>
t.strategyId != null && !validIds.has(t.strategyId)
@@ -285,13 +289,13 @@ export function useVirtualTradingCore(options: UseVirtualTradingCoreOptions = {}
const names = resolveVirtualTargetNames(market, meta?.koreanName, meta?.englishName);
setTargets(prev => [...prev, {
market,
strategyId: session.globalStrategyId,
strategyId: resolveStrategyIdForNewTarget(session.globalStrategyId, strategies),
koreanName: names.koreanName,
englishName: names.englishName,
}]);
setSelectedMarket(market);
return true;
}, [targets, session.globalStrategyId, virtualTargetMaxCount]);
}, [targets, session.globalStrategyId, strategies, virtualTargetMaxCount]);
const handleRemoveTarget = useCallback((market: string) => {
setTargets(prev => prev.filter(x => x.market !== market));
@@ -320,20 +324,25 @@ export function useVirtualTradingCore(options: UseVirtualTradingCoreOptions = {}
window.alert('투자대상 종목을 먼저 추가하세요.');
return;
}
if (!session.globalStrategyId) {
const globalStrategyId = ensureDefaultGlobalStrategyId(session.globalStrategyId, strategies);
if (!globalStrategyId) {
window.alert('투자전략을 선택하세요.');
return;
}
const globalStrat = strategies.find(s => s.id === session.globalStrategyId);
const sessionForStart = { ...session, globalStrategyId };
if (session.globalStrategyId !== globalStrategyId) {
setSession(sessionForStart);
}
const globalStrat = strategies.find(s => s.id === globalStrategyId);
const synced = await syncStrategyTimeframesFromLayoutIfNeeded(
session.globalStrategyId,
globalStrategyId,
globalStrat,
);
if (!synced) return;
const ok = await warnStrategyTimeframeMismatch(session.globalStrategyId, globalStrat);
const ok = await warnStrategyTimeframeMismatch(globalStrategyId, globalStrat);
if (!ok) return;
try {
await syncVirtualTargetsToBackend(targets, session, true);
await syncVirtualTargetsToBackend(targets, sessionForStart, true);
setSession(s => ({ ...s, running: true }));
} catch {
window.alert('가상투자 시작 설정 저장에 실패했습니다.');