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