서버 가상매매 목록 지표없음 문제 개선
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user