40 lines
1.7 KiB
TypeScript
40 lines
1.7 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, candleType: timeframe },
|
|
{ showLimitAlert: false },
|
|
);
|
|
}
|
|
}
|