가상매매 목록 실시간 연결안됨 문제수정
This commit is contained in:
@@ -221,16 +221,17 @@ const VirtualTradingPage: React.FC<Props> = ({
|
||||
}, [session.running, refreshPaperData]);
|
||||
|
||||
const mergedLiveStatus = useMemo(() => {
|
||||
if (!session.running) return liveStatusByMarket;
|
||||
const merged = { ...liveStatusByMarket };
|
||||
const now = Date.now();
|
||||
/** 폴링 주기(3~5s) + 지연 여유 — 지표 스냅샷 갱신 시 STOMP 틱 없어도 실시간 표시 */
|
||||
const SNAP_LIVE_MS = 12_000;
|
||||
for (const [market, snap] of Object.entries(snapshots)) {
|
||||
if (snap?.updatedAt && now - snap.updatedAt < 8000) {
|
||||
if (snap?.updatedAt && now - snap.updatedAt < SNAP_LIVE_MS) {
|
||||
merged[market] = 'live';
|
||||
}
|
||||
}
|
||||
return merged;
|
||||
}, [liveStatusByMarket, snapshots, session.running]);
|
||||
}, [liveStatusByMarket, snapshots]);
|
||||
|
||||
const posQty = useMemo(() => {
|
||||
const p = summary?.positions?.find(x => x.symbol === selectedMarket);
|
||||
|
||||
@@ -9,7 +9,10 @@ import {
|
||||
type VirtualCardViewMode,
|
||||
type VirtualSessionConfig,
|
||||
} from '../../utils/virtualTradingStorage';
|
||||
import type { VirtualLiveStatus } from '../../hooks/useVirtualTargetLiveStatus';
|
||||
import {
|
||||
resolveVirtualLiveStatusFallback,
|
||||
type VirtualLiveStatus,
|
||||
} from '../../hooks/useVirtualTargetLiveStatus';
|
||||
import type { VirtualIndicatorSnapshot } from '../../hooks/useVirtualIndicatorSnapshots';
|
||||
import type { TickerData } from '../../hooks/useMarketTicker';
|
||||
import { resolveVirtualTargetStrategyId } from '../../utils/virtualTargetStrategy';
|
||||
@@ -141,7 +144,12 @@ const VirtualTargetGrid: React.FC<Props> = ({
|
||||
snapshot={snapshots[focusTarget.market]}
|
||||
signalLoading={snapshotLoadingByMarket[focusTarget.market]}
|
||||
running={session.running}
|
||||
liveStatus={liveStatusByMarket[focusTarget.market] ?? (session.running ? 'connecting' : 'idle')}
|
||||
liveStatus={resolveVirtualLiveStatusFallback(
|
||||
focusTarget.market,
|
||||
resolveVirtualTargetStrategyId(focusTarget, session.globalStrategyId),
|
||||
liveStatusByMarket,
|
||||
session.running,
|
||||
)}
|
||||
lastTickAt={lastTickAtByMarket[focusTarget.market]}
|
||||
viewMode={viewMode}
|
||||
onExit={() => setFocusMarket(null)}
|
||||
@@ -176,7 +184,8 @@ const VirtualTargetGrid: React.FC<Props> = ({
|
||||
aria-label="가상매매 종목 그리드"
|
||||
>
|
||||
{t => {
|
||||
const strat = strategies.find(s => s.id === resolveVirtualTargetStrategyId(t, session.globalStrategyId));
|
||||
const stratId = resolveVirtualTargetStrategyId(t, session.globalStrategyId);
|
||||
const strat = strategies.find(s => s.id === stratId);
|
||||
return (
|
||||
<VirtualTargetCard
|
||||
market={t.market}
|
||||
@@ -188,7 +197,12 @@ const VirtualTargetGrid: React.FC<Props> = ({
|
||||
snapshot={snapshots[t.market]}
|
||||
signalLoading={snapshotLoadingByMarket[t.market]}
|
||||
running={session.running}
|
||||
liveStatus={liveStatusByMarket[t.market] ?? (session.running ? 'connecting' : 'idle')}
|
||||
liveStatus={resolveVirtualLiveStatusFallback(
|
||||
t.market,
|
||||
stratId,
|
||||
liveStatusByMarket,
|
||||
session.running,
|
||||
)}
|
||||
lastTickAt={lastTickAtByMarket[t.market]}
|
||||
viewMode={viewMode}
|
||||
displayMode={resolveCardDisplayMode(t.market)}
|
||||
|
||||
Reference in New Issue
Block a user