/** 가상매매 투자대상 목록 최대 개수 (설정 · gc_app_settings.virtual_target_max_count) */ export const DEFAULT_VIRTUAL_TARGET_MAX = 20; export const MIN_VIRTUAL_TARGET_MAX = 1; export const MAX_VIRTUAL_TARGET_MAX = 100; export function clampVirtualTargetMax(n: number): number { if (!Number.isFinite(n)) return DEFAULT_VIRTUAL_TARGET_MAX; return Math.min(MAX_VIRTUAL_TARGET_MAX, Math.max(MIN_VIRTUAL_TARGET_MAX, Math.floor(n))); } export function virtualTargetLimitMessage(max: number): string { return `투자대상은 최대 ${max}종목까지 등록할 수 있습니다. 설정 › 가상매매에서 한도를 확인하세요.`; } export function isVirtualTargetAddAllowed( currentCount: number, maxCount: number = DEFAULT_VIRTUAL_TARGET_MAX, ): boolean { return currentCount < clampVirtualTargetMax(maxCount); }