가상매매 기본전략 설정
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
import { saveLiveStrategySettings } from './backendApi';
|
||||
import { loadStrategies, saveLiveStrategySettings } from './backendApi';
|
||||
import { getVirtualTargetMaxCount } from '../hooks/useAppSettings';
|
||||
import {
|
||||
isVirtualTargetAddAllowed,
|
||||
virtualTargetLimitMessage,
|
||||
} from '../utils/virtualTargetLimits';
|
||||
import { syncVirtualTargetsToBackend } from './virtualLiveStrategySync';
|
||||
import { resolveVirtualTargetStrategyId } from './virtualTargetStrategy';
|
||||
import {
|
||||
ensureDefaultGlobalStrategyId,
|
||||
resolveVirtualTargetStrategyId,
|
||||
} from './virtualTargetStrategy';
|
||||
import {
|
||||
loadVirtualSession,
|
||||
loadVirtualTargets,
|
||||
@@ -41,11 +44,13 @@ export async function addVirtualTarget(
|
||||
}
|
||||
|
||||
const session = loadVirtualSession();
|
||||
const strategies = await loadStrategies().catch(() => []);
|
||||
const strategyId = ensureDefaultGlobalStrategyId(session.globalStrategyId, strategies);
|
||||
const en = meta.englishName ?? market.replace(/^KRW-/, '');
|
||||
const item: VirtualTargetItem = {
|
||||
market,
|
||||
/** 신규 추가 시점의 상단 기본전략(템플릿)을 종목에 고정 */
|
||||
strategyId: session.globalStrategyId,
|
||||
strategyId,
|
||||
koreanName: meta.koreanName,
|
||||
englishName: en,
|
||||
};
|
||||
@@ -55,7 +60,7 @@ export async function addVirtualTarget(
|
||||
|
||||
await saveLiveStrategySettings({
|
||||
market,
|
||||
strategyId: session.globalStrategyId,
|
||||
strategyId,
|
||||
isLiveCheck: session.running,
|
||||
isPinned: false,
|
||||
executionType: session.executionType,
|
||||
@@ -64,7 +69,7 @@ export async function addVirtualTarget(
|
||||
skipGlobalTemplate: true,
|
||||
});
|
||||
|
||||
if (session.running && session.globalStrategyId) {
|
||||
if (session.running && strategyId) {
|
||||
await syncVirtualTargetsToBackend(next, session, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { VirtualTargetItem } from './virtualTradingStorage';
|
||||
import type { VirtualTargetItem, VirtualSessionConfig } from './virtualTradingStorage';
|
||||
|
||||
/** 종목 전략 셀렉트 — 기본(전역) 전략 옵션 값 */
|
||||
export const VIRTUAL_DEFAULT_STRATEGY_VALUE = '__default__';
|
||||
@@ -49,6 +49,53 @@ export function parseTargetStrategySelectValue(value: string): number | null {
|
||||
return Number.isFinite(n) ? n : null;
|
||||
}
|
||||
|
||||
/** 전략 목록 첫 항목 ID (가상매매 기본 전략) */
|
||||
export function pickDefaultGlobalStrategyId(
|
||||
strategies: Array<{ id?: number | null }>,
|
||||
): number | null {
|
||||
for (const s of strategies) {
|
||||
const id = s.id;
|
||||
if (id != null && id > 0) return id;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** 저장된 globalStrategyId 가 유효하면 유지, 아니면 목록 첫 항목 */
|
||||
export function ensureDefaultGlobalStrategyId(
|
||||
globalStrategyId: number | null,
|
||||
strategies: Array<{ id?: number | null }>,
|
||||
): number | null {
|
||||
const validIds = new Set(
|
||||
strategies.map(s => s.id).filter((id): id is number => id != null && id > 0),
|
||||
);
|
||||
if (globalStrategyId != null && validIds.has(globalStrategyId)) {
|
||||
return globalStrategyId;
|
||||
}
|
||||
return pickDefaultGlobalStrategyId(strategies);
|
||||
}
|
||||
|
||||
/** 신규 종목 추가·세션 초기화 — 상단 기본전략 (없으면 목록 첫 항목) */
|
||||
export function resolveStrategyIdForNewTarget(
|
||||
globalStrategyId: number | null,
|
||||
strategies: Array<{ id?: number | null }>,
|
||||
): number | null {
|
||||
return ensureDefaultGlobalStrategyId(globalStrategyId, strategies);
|
||||
}
|
||||
|
||||
/** 전략 목록 로드 후 — 상단 기본전략을 첫 항목으로 자동 설정 */
|
||||
export function applyDefaultGlobalStrategyToSession(
|
||||
session: VirtualSessionConfig,
|
||||
strategies: Array<{ id?: number | null }>,
|
||||
appLiveStrategyId: number | null = null,
|
||||
): VirtualSessionConfig {
|
||||
let gid = ensureDefaultGlobalStrategyId(session.globalStrategyId, strategies);
|
||||
if (gid == null && appLiveStrategyId != null && appLiveStrategyId > 0) {
|
||||
gid = appLiveStrategyId;
|
||||
}
|
||||
if (gid === session.globalStrategyId) return session;
|
||||
return { ...session, globalStrategyId: gid };
|
||||
}
|
||||
|
||||
/** 종목 셀렉트 — 기본 전략(전역) 옵션 라벨 (신규 추가 시 적용되는 템플릿) */
|
||||
export function defaultStrategyOptionLabel(
|
||||
globalStrategyId: number | null,
|
||||
|
||||
Reference in New Issue
Block a user