가상투자 화면 목록 선택 동작
This commit is contained in:
@@ -143,6 +143,29 @@ export function getTrafficLightState(matchRate: number, metrics: ConditionMetric
|
||||
return 'red';
|
||||
}
|
||||
|
||||
/** 매수·매도 조건 충족률 기준 타이밍 (TradeAlertModal: 매수=블루, 매도=레드) */
|
||||
export type VirtualTradeTiming = 'buy' | 'sell' | 'neutral';
|
||||
|
||||
function sideMatchRate(metrics: ConditionMetric[], side: 'buy' | 'sell'): number {
|
||||
const rows = metrics.filter(m => m.row.side === side && m.status !== 'unknown');
|
||||
if (rows.length === 0) return 0;
|
||||
const met = rows.filter(m => m.status === 'match').length;
|
||||
return Math.round((met / rows.length) * 100);
|
||||
}
|
||||
|
||||
export function resolveVirtualTradeTiming(metrics: ConditionMetric[]): VirtualTradeTiming {
|
||||
const buyRate = sideMatchRate(metrics, 'buy');
|
||||
const sellRate = sideMatchRate(metrics, 'sell');
|
||||
if (buyRate === 0 && sellRate === 0) return 'neutral';
|
||||
if (buyRate >= 100 && buyRate > sellRate) return 'buy';
|
||||
if (sellRate >= 100 && sellRate > buyRate) return 'sell';
|
||||
if (buyRate >= 100 && sellRate < 100) return 'buy';
|
||||
if (sellRate >= 100 && buyRate < 100) return 'sell';
|
||||
if (buyRate > sellRate && buyRate >= 50) return 'buy';
|
||||
if (sellRate > buyRate && sellRate >= 50) return 'sell';
|
||||
return 'neutral';
|
||||
}
|
||||
|
||||
export function formatUpdatedTime(ts: number | undefined): string {
|
||||
if (!ts) return '—';
|
||||
return new Date(ts).toLocaleTimeString('ko-KR', {
|
||||
|
||||
Reference in New Issue
Block a user