Files
goldenChart/frontend/src/utils/trendSearchAutoAddTargets.ts
T
2026-05-28 20:48:28 +09:00

40 lines
1.6 KiB
TypeScript

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<TrendSearchAppSettings, 'autoAddTargetsEnabled' | 'autoAddTopRank' | 'autoAddMinScore'>,
timeframe: string,
): Promise<void> {
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 },
{ showLimitAlert: false },
);
}
}