diff --git a/lib/trading/smart-validation-queue.ts b/lib/trading/smart-validation-queue.ts index 1341cd4..9ba9a31 100644 --- a/lib/trading/smart-validation-queue.ts +++ b/lib/trading/smart-validation-queue.ts @@ -111,8 +111,8 @@ class SmartValidationQueue { } this.queue.set(signalId, queuedSignal) - logger.log(`⏰ Smart validation queued: ${params.symbol} ${params.direction.toUpperCase()} @ $${params.originalPrice.toFixed(2)} (quality: ${params.qualityScore})`) - logger.log(` Watching for ${queuedSignal.entryWindowMinutes}min: +${queuedSignal.confirmationThreshold}% confirms, ${queuedSignal.maxDrawdown}% abandons`) + console.log(`⏰ Smart validation queued: ${params.symbol} ${params.direction.toUpperCase()} @ $${params.originalPrice.toFixed(2)} (quality: ${params.qualityScore})`) + console.log(` Watching for ${queuedSignal.entryWindowMinutes}min: +${queuedSignal.confirmationThreshold}% confirms, ${queuedSignal.maxDrawdown}% abandons`) // Send Telegram notification await sendValidationNotification({ @@ -140,7 +140,7 @@ class SmartValidationQueue { } this.isMonitoring = true - logger.log('πŸ‘οΈ Smart validation monitoring started (checks every 30s)') + console.log('πŸ‘οΈ Smart validation monitoring started (checks every 30s)') // Check every 30 seconds this.monitoringInterval = setInterval(async () => { @@ -157,7 +157,7 @@ class SmartValidationQueue { this.monitoringInterval = undefined } this.isMonitoring = false - logger.log('⏸️ Smart validation monitoring stopped') + console.log('⏸️ Smart validation monitoring stopped') } /** @@ -172,7 +172,7 @@ class SmartValidationQueue { return } - logger.log(`πŸ‘οΈ Smart validation check: ${pending.length} pending signals`) + console.log(`πŸ‘οΈ Smart validation check: ${pending.length} pending signals`) for (const signal of pending) { try { @@ -453,7 +453,55 @@ export function getSmartValidationQueue(): SmartValidationQueue { return queueInstance } -export function startSmartValidation(): void { +export async function startSmartValidation(): Promise { const queue = getSmartValidationQueue() - logger.log('🧠 Smart validation system ready') + + // CRITICAL FIX (Dec 9, 2025): Load pending signals from database on startup + // Bug: Queue is in-memory only, container restart loses all queued signals + // Solution: Query BlockedSignal table for signals within entry window + try { + const { getPrismaClient } = await import('../database/trades') + const prisma = getPrismaClient() + + // Find signals blocked within last 30 minutes (entry window) + const thirtyMinutesAgo = new Date(Date.now() - 30 * 60 * 1000) + + const recentBlocked = await prisma.blockedSignal.findMany({ + where: { + blockReason: 'QUALITY_SCORE_TOO_LOW', + signalQualityScore: { gte: 50, lt: 90 }, // Marginal quality range + createdAt: { gte: thirtyMinutesAgo }, + }, + orderBy: { createdAt: 'desc' }, + }) + + console.log(`πŸ”„ Restoring ${recentBlocked.length} pending signals from database`) + + // Re-queue each signal + for (const signal of recentBlocked) { + await queue.addSignal({ + blockReason: 'QUALITY_SCORE_TOO_LOW', + symbol: signal.symbol, + direction: signal.direction as 'long' | 'short', + originalPrice: signal.entryPrice, + qualityScore: signal.signalQualityScore || 0, + atr: signal.atr || undefined, + adx: signal.adx || undefined, + rsi: signal.rsi || undefined, + volumeRatio: signal.volumeRatio || undefined, + pricePosition: signal.pricePosition || undefined, + indicatorVersion: signal.indicatorVersion || 'v5', + timeframe: signal.timeframe || '5', + }) + } + + if (recentBlocked.length > 0) { + console.log(`βœ… Smart validation restored ${recentBlocked.length} signals, monitoring started`) + } else { + console.log('🧠 Smart validation system ready (no pending signals)') + } + } catch (error) { + console.error('❌ Error restoring smart validation queue:', error) + console.log('🧠 Smart validation system ready (error loading signals)') + } }