/**
* Signal Reversal Exit Condition Checker
* Monitor new signals for reversal (opposite direction) and trigger exit
*/
import { PositionState, ExitCondition, ExitReason, Signal } from '../types'
export interface SignalReversalConfig {
enabled: boolean
confidenceThreshold: number // Minimum confidence for reversal signal (default: 60)
}
export function checkSignalReversal(
position: PositionState,
newSignal: Signal | null,
config: SignalReversalConfig
): ExitCondition | null {
if (!config.enabled || !newSignal) {
return null
}
const positionSide = position.side
const signalType = newSignal.signal
const signalConfidence = newSignal.confidence != null ? newSignal.confidence : 0
// Reversal detection logic
let isReversal = false
// Position LONG + New signal SHORT with confidence > threshold → REVERSAL
// Lower threshold for testing: use 50% if signal confidence is meaningful (>40%)
const effectiveThreshold = signalConfidence > 40 ? Math.min(config.confidenceThreshold, 50) : config.confidenceThreshold
if (positionSide === 'LONG' && signalType === 'sell_to_enter') {
if (signalConfidence >= effectiveThreshold) {
isReversal = true
console.log(`\x1b[33m🔄 SIGNAL REVERSAL DETECTED: ${position.symbol || position.coin || 'UNKNOWN'} - LONG position but SELL signal (confidence: ${signalConfidence.toFixed(1)}% >= ${effectiveThreshold.toFixed(1)}%)\x1b[0m`)
} else {
console.log(`\x1b[36m⚠️ Signal reversal potential: ${position.symbol || position.coin || 'UNKNOWN'} - LONG position + SELL signal, but confidence ${signalConfidence.toFixed(1)}% < ${effectiveThreshold.toFixed(1)}% (threshold)\x1b[0m`)
}
}
// Position SHORT + New signal LONG with confidence > threshold → REVERSAL
else if (positionSide === 'SHORT' && signalType === 'buy_to_enter') {
if (signalConfidence >= effectiveThreshold) {
isReversal = true
console.log(`\x1b[33m🔄 SIGNAL REVERSAL DETECTED: ${position.symbol || position.coin || 'UNKNOWN'} - SHORT position but BUY signal (confidence: ${signalConfidence.toFixed(1)}% >= ${effectiveThreshold.toFixed(1)}%)\x1b[0m`)
} else {
console.log(`\x1b[36m⚠️ Signal reversal potential: ${position.symbol || position.coin || 'UNKNOWN'} - SHORT position + BUY signal, but confidence ${signalConfidence.toFixed(1)}% < ${effectiveThreshold.toFixed(1)}% (threshold)\x1b[0m`)
}
}
// Position LONG + New signal LONG (lower confidence) → NO REVERSAL (confirmation)
// Position SHORT + New signal SHORT (lower confidence) → NO REVERSAL (confirmation)
// Position LONG/SHORT + New signal NEUTRAL/HOLD → NO REVERSAL (ignore)
if (!isReversal) {
return null
}
return {
reason: 'SIGNAL_REVERSAL' as ExitReason,
priority: 5, // After trailing stop
shouldExit: true,
exitSize: 100, // Full exit
metadata: {
newSignalType: signalType,
newSignalConfidence: signalConfidence,
oldPositionSide: positionSide,
threshold: config.confidenceThreshold
},
timestamp: Date.now(),
description: `Signal reversal detected: Position ${positionSide} but new signal ${signalType} with confidence ${signalConfidence.toFixed(1)}% (threshold: ${config.confidenceThreshold}%)`
}
}