서버 가상매매 목록 지표없음 문제 개선

This commit is contained in:
Macbook
2026-06-07 19:14:13 +09:00
parent b294c2be5d
commit 2f3133d413
10 changed files with 299 additions and 62 deletions
@@ -4,6 +4,7 @@ import {
resolveVirtualTargetNames,
resolveVirtualTargetStrategyDisplayName,
} from '../../utils/virtualTargetNames';
import { resolveVirtualTargetStrategyId } from '../../utils/virtualTargetStrategy';
import type { VirtualIndicatorSnapshot } from '../../hooks/useVirtualIndicatorSnapshots';
import { useLiveReceiveFlash } from '../../hooks/useLiveReceiveFlash';
import type { ChartRealtimeSource } from '../../hooks/useChartRealtimeData';
@@ -57,6 +58,8 @@ interface Props {
readOnlyStrategyLabel?: string;
/** 헤더 우측 레이아웃 (알림 목록 신호 슬롯: inline-quote) */
headVariant?: VirtualCardHeadVariant;
/** gc_app_settings.liveStrategyId — ui 미동기화 시 지표 평가용 */
appLiveStrategyId?: number | null;
}
const VirtualTargetCard: React.FC<Props> = ({
@@ -88,6 +91,7 @@ const VirtualTargetCard: React.FC<Props> = ({
englishName,
readOnlyStrategyLabel,
headVariant = 'default',
appLiveStrategyId = null,
}) => {
const inlineHeadQuote = headVariant === 'inline-quote';
const { koreanName: displayKo, englishName: displayEn } = resolveVirtualTargetNames(
@@ -101,6 +105,11 @@ const VirtualTargetCard: React.FC<Props> = ({
readOnlyStrategyLabel,
);
const rows = snapshot?.rows ?? [];
const effectiveStrategyId = resolveVirtualTargetStrategyId(
{ strategyId },
globalStrategyId,
appLiveStrategyId,
);
const metrics = useMemo(() => buildConditionMetrics(rows), [rows]);
const metCount = metrics.filter(m => m.status === 'match').length;
@@ -232,6 +241,7 @@ const VirtualTargetCard: React.FC<Props> = ({
viewMode={viewMode}
receiving={highlightReceiving}
loading={signalLoading}
hasStrategy={effectiveStrategyId != null}
/>
)}
@@ -44,6 +44,7 @@ interface Props {
globalDisplayMode: VirtualCardDisplayMode;
onFocusMarketChange?: (market: string | null) => void;
gridPreset: TradeNotificationGridPresetId;
appLiveStrategyId?: number | null;
}
const VirtualTargetGrid: React.FC<Props> = ({
@@ -62,6 +63,7 @@ const VirtualTargetGrid: React.FC<Props> = ({
globalDisplayMode,
onFocusMarketChange,
gridPreset,
appLiveStrategyId = null,
}) => {
const gridCols = getTradeNotificationGridPreset(gridPreset).cols;
@@ -146,7 +148,7 @@ const VirtualTargetGrid: React.FC<Props> = ({
running={session.running}
liveStatus={resolveVirtualLiveStatusFallback(
focusTarget.market,
resolveVirtualTargetStrategyId(focusTarget, session.globalStrategyId),
resolveVirtualTargetStrategyId(focusTarget, session.globalStrategyId, appLiveStrategyId),
liveStatusByMarket,
session.running,
)}
@@ -184,7 +186,7 @@ const VirtualTargetGrid: React.FC<Props> = ({
aria-label="가상매매 종목 그리드"
>
{t => {
const stratId = resolveVirtualTargetStrategyId(t, session.globalStrategyId);
const stratId = resolveVirtualTargetStrategyId(t, session.globalStrategyId, appLiveStrategyId);
const strat = strategies.find(s => s.id === stratId);
return (
<VirtualTargetCard
@@ -219,6 +221,7 @@ const VirtualTargetGrid: React.FC<Props> = ({
ticker={tickers?.get(t.market)}
koreanName={t.koreanName}
englishName={t.englishName}
appLiveStrategyId={appLiveStrategyId}
/>
);
}}
@@ -18,6 +18,8 @@ interface Props {
receiving?: boolean;
/** 업비트 캔들 warm-up · live-conditions 수집 중 */
loading?: boolean;
/** false — 전략 미지정 안내 */
hasStrategy?: boolean;
className?: string;
}
@@ -26,6 +28,7 @@ const VirtualTargetSignalPanel: React.FC<Props> = ({
viewMode = 'summary',
receiving = false,
loading = false,
hasStrategy = true,
className = '',
}) => {
const rows = snapshot?.rows ?? [];
@@ -49,7 +52,9 @@ const VirtualTargetSignalPanel: React.FC<Props> = ({
<p className={`vtd-muted vtd-card-empty${loading ? ' vtd-card-empty--loading' : ''}${className ? ` ${className}` : ''}`}>
{loading
? '지표 데이터 수집 중… (업비트 캔들 · 실시간 연결)'
: '전략 조건·지표 데이터 없음'}
: !hasStrategy
? '투자전략을 선택하세요 (상단 또는 종목별 전략)'
: '전략 조건·지표 데이터 없음'}
</p>
);
}