87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
/** 가상투자 대상 종목·세션 설정 localStorage */
|
|
|
|
export interface VirtualTargetItem {
|
|
market: string;
|
|
strategyId: number | null;
|
|
koreanName?: string;
|
|
englishName?: string;
|
|
}
|
|
|
|
export interface VirtualSessionConfig {
|
|
globalStrategyId: number | null;
|
|
executionType: 'CANDLE_CLOSE' | 'REALTIME_TICK';
|
|
/** LONG_ONLY = 보유 자산 기준, SIGNAL_ONLY = 순수 지표 기준 */
|
|
positionMode: 'LONG_ONLY' | 'SIGNAL_ONLY';
|
|
running: boolean;
|
|
}
|
|
|
|
const TARGETS_KEY = 'gc_virtual_targets_v1';
|
|
const SESSION_KEY = 'gc_virtual_session_v1';
|
|
const CARD_VIEW_KEY = 'gc_virtual_card_view_v1';
|
|
|
|
/** 카드 표시: summary=이퀄라이저·신호등·푸터만, detail=지표 테이블 포함 전체 */
|
|
export type VirtualCardViewMode = 'summary' | 'detail';
|
|
|
|
export function loadVirtualTargets(): VirtualTargetItem[] {
|
|
try {
|
|
const raw = localStorage.getItem(TARGETS_KEY);
|
|
if (!raw) return [];
|
|
const parsed = JSON.parse(raw) as VirtualTargetItem[];
|
|
return Array.isArray(parsed) ? parsed : [];
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export function saveVirtualTargets(items: VirtualTargetItem[]): void {
|
|
try {
|
|
localStorage.setItem(TARGETS_KEY, JSON.stringify(items));
|
|
} catch { /* ignore */ }
|
|
}
|
|
|
|
export function loadVirtualSession(): VirtualSessionConfig {
|
|
try {
|
|
const raw = localStorage.getItem(SESSION_KEY);
|
|
if (!raw) return defaultSession();
|
|
const parsed = JSON.parse(raw) as Partial<VirtualSessionConfig>;
|
|
return {
|
|
globalStrategyId: parsed.globalStrategyId ?? null,
|
|
executionType: parsed.executionType === 'REALTIME_TICK' ? 'REALTIME_TICK' : 'CANDLE_CLOSE',
|
|
positionMode: parsed.positionMode === 'SIGNAL_ONLY' ? 'SIGNAL_ONLY' : 'LONG_ONLY',
|
|
running: parsed.running === true,
|
|
};
|
|
} catch {
|
|
return defaultSession();
|
|
}
|
|
}
|
|
|
|
export function saveVirtualSession(cfg: VirtualSessionConfig): void {
|
|
try {
|
|
localStorage.setItem(SESSION_KEY, JSON.stringify(cfg));
|
|
} catch { /* ignore */ }
|
|
}
|
|
|
|
function defaultSession(): VirtualSessionConfig {
|
|
return {
|
|
globalStrategyId: null,
|
|
executionType: 'CANDLE_CLOSE',
|
|
positionMode: 'LONG_ONLY',
|
|
running: false,
|
|
};
|
|
}
|
|
|
|
export function loadVirtualCardViewMode(): VirtualCardViewMode {
|
|
try {
|
|
const raw = localStorage.getItem(CARD_VIEW_KEY);
|
|
return raw === 'detail' ? 'detail' : 'summary';
|
|
} catch {
|
|
return 'summary';
|
|
}
|
|
}
|
|
|
|
export function saveVirtualCardViewMode(mode: VirtualCardViewMode): void {
|
|
try {
|
|
localStorage.setItem(CARD_VIEW_KEY, mode);
|
|
} catch { /* ignore */ }
|
|
}
|