추세검색 설정 추가

This commit is contained in:
Macbook
2026-05-27 01:36:06 +09:00
parent c1bcf88c6c
commit 2e08c6b16f
42 changed files with 1507 additions and 226 deletions
@@ -0,0 +1,39 @@
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, candleType: timeframe },
{ showLimitAlert: false },
);
}
}