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

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
+1 -1
View File
@@ -1472,7 +1472,7 @@ export async function pinCandleWatch(market: string, candleType: string): Promis
try {
await fetch(
`${API_BASE}/candles/watch?market=${encodeURIComponent(market)}&type=${encodeURIComponent(candleType)}`,
{ method: 'POST' },
{ method: 'POST', headers: authHeaders() },
);
} catch {
/* pin 실패해도 평가 API는 시도 */
@@ -0,0 +1,78 @@
/**
* 가상투자 — ui_preferences·앱 설정·서버 live-strategy 행 간 전략 ID 정합
*/
import { loadLiveStrategySettings, type LiveStrategySettingsDto } from './backendApi';
import type { VirtualSessionConfig, VirtualTargetItem } from './virtualTradingStorage';
import { resolveVirtualTargetStrategyId } from './virtualTargetStrategy';
/** 종목별 effective strategyId (ui → 세션 → 앱 전역 liveStrategyId) */
export function resolveVirtualTargetStrategyIdWithApp(
target: Pick<VirtualTargetItem, 'strategyId'>,
session: Pick<VirtualSessionConfig, 'globalStrategyId'>,
appLiveStrategyId: number | null | undefined,
): number | null {
return resolveVirtualTargetStrategyId(
target,
session.globalStrategyId,
appLiveStrategyId ?? null,
);
}
/** 세션 globalStrategyId — ui_preferences 비었을 때 앱 전역 liveStrategyId 로 복구 */
export function mergeVirtualSessionWithAppLive(
session: VirtualSessionConfig,
appLiveStrategyId: number | null | undefined,
): VirtualSessionConfig {
if (session.globalStrategyId != null) return session;
const sid = appLiveStrategyId;
if (sid == null || sid <= 0) return session;
return { ...session, globalStrategyId: sid };
}
function applyLiveRow(
target: VirtualTargetItem,
live: LiveStrategySettingsDto,
globalStrategyId: number | null,
appLiveStrategyId: number | null | undefined,
): VirtualTargetItem {
if (target.strategyId != null) return target;
const effective = resolveVirtualTargetStrategyIdWithApp(
target,
{ globalStrategyId },
appLiveStrategyId,
);
if (effective != null) return target;
const sid = live.strategyId;
if (sid == null || sid <= 0 || !live.isLiveCheck) return target;
return { ...target, strategyId: sid };
}
/** 서버 gc_live_strategy_settings — ui에 strategyId 없을 때 per-market 복구 */
export async function mergeTargetsWithLiveStrategySettings(
targets: VirtualTargetItem[],
session: VirtualSessionConfig,
appLiveStrategyId: number | null | undefined,
): Promise<VirtualTargetItem[]> {
if (targets.length === 0) return targets;
const globalId = session.globalStrategyId;
const merged = await Promise.all(
targets.map(async t => {
const effective = resolveVirtualTargetStrategyIdWithApp(
t,
session,
appLiveStrategyId,
);
if (effective != null) return t;
try {
const live = await loadLiveStrategySettings(t.market);
return applyLiveRow(t, live, globalId, appLiveStrategyId);
} catch {
return t;
}
}),
);
const changed = merged.some((t, i) => t.strategyId !== targets[i]?.strategyId);
return changed ? merged : targets;
}
+5 -1
View File
@@ -11,9 +11,13 @@ export const VIRTUAL_DEFAULT_STRATEGY_VALUE = '__default__';
export function resolveVirtualTargetStrategyId(
target: Pick<VirtualTargetItem, 'strategyId'>,
globalStrategyId: number | null,
/** gc_app_settings.liveStrategyId — ui_preferences.globalStrategyId 미동기화 시 폴백 */
appLiveStrategyId: number | null = null,
): number | null {
if (target.strategyId != null) return target.strategyId;
return globalStrategyId;
if (globalStrategyId != null) return globalStrategyId;
if (appLiveStrategyId != null && appLiveStrategyId > 0) return appLiveStrategyId;
return null;
}
/** 기본전략 변경 직전 — null(기본 따름) 종목을 이전 기본전략 ID 로 고정 */