import { sortTrendSearchByStrength } from './trendSearchMetrics'; import { resolveVirtualTargetNames } from './virtualTargetNames'; import type { TrendSearchResultDto } from './backendApi'; import type { TrendSearchAppSettings } from './trendSearchAppSettings'; import { addVirtualTarget } from './virtualTargetMutations'; import { loadVirtualTargets } from './virtualTradingStorage'; import { isVirtualTargetAddAllowed } from './virtualTargetLimits'; import { getVirtualTargetMaxCount } from '../hooks/useAppSettings'; /** 추세검색 결과 상위 순위 → 가상매매 투자대상 자동추가 */ export async function autoAddTrendSearchTargets( results: TrendSearchResultDto[], settings: Pick, timeframe: string, ): Promise { if (!settings.autoAddTargetsEnabled || results.length === 0) return; const sorted = sortTrendSearchByStrength(results); const topN = Math.max(1, Math.min(50, settings.autoAddTopRank)); const minScore = Math.max(0, Math.min(100, settings.autoAddMinScore)); const candidates = sorted .slice(0, topN) .filter(r => r.matchRate >= minScore); let targets = loadVirtualTargets(); const maxCount = getVirtualTargetMaxCount(); for (const row of candidates) { if (!isVirtualTargetAddAllowed(targets.length, maxCount)) break; if (targets.some(t => t.market === row.market)) continue; const { koreanName, englishName } = resolveVirtualTargetNames(row.market, row.koreanName); targets = await addVirtualTarget( row.market, { koreanName, englishName, candleType: timeframe }, { showLimitAlert: false }, ); } }