critical: Fix Smart Entry Validation Queue wrong price display

- Bug: Validation queue used TradingView symbol format (SOLUSDT) to lookup market data cache
- Cache uses normalized Drift format (SOL-PERP)
- Result: Cache lookup failed, wrong/stale price shown in Telegram abandonment notifications
- Real incident: Signal at $126.00 showed $98.18 abandonment price (-22.08% impossible drop)
- Fix: Added normalizeTradingViewSymbol() call in check-risk endpoint before passing to validation queue
- Files changed: app/api/trading/check-risk/route.ts (import + symbol normalization)
- Impact: Validation queue now correctly retrieves current price from market data cache
- Deployed: Dec 1, 2025
This commit is contained in:
mindesbunister
2025-12-01 23:45:21 +01:00
parent 4fb301328d
commit 6cec2e8e71
6 changed files with 120 additions and 22 deletions

View File

@@ -6,7 +6,7 @@
*/
import { NextRequest, NextResponse } from 'next/server'
import { getMergedConfig, TradingConfig, getMinQualityScoreForDirection } from '@/config/trading'
import { getMergedConfig, TradingConfig, getMinQualityScoreForDirection, normalizeTradingViewSymbol } from '@/config/trading'
import { getInitializedPositionManager, ActiveTrade } from '@/lib/trading/position-manager'
import { getLastTradeTime, getLastTradeTimeForSymbol, getTradesInLastHour, getTodayPnL, createBlockedSignal } from '@/lib/database/trades'
import { getPythPriceMonitor } from '@/lib/pyth/price-monitor'
@@ -432,9 +432,16 @@ export async function POST(request: NextRequest): Promise<NextResponse<RiskCheck
// SMART VALIDATION QUEUE (Nov 30, 2025)
// Queue marginal quality signals (50-89) for validation instead of hard-blocking
const validationQueue = getSmartValidationQueue()
// CRITICAL FIX (Dec 1, 2025): Normalize TradingView symbol format to Drift format
// Bug: Market data cache uses "SOL-PERP" but TradingView sends "SOLUSDT"
// Without normalization, validation queue can't find matching price data
// Result: Wrong/stale price shown in Telegram abandonment notifications
const normalizedSymbol = normalizeTradingViewSymbol(body.symbol)
const queued = await validationQueue.addSignal({
blockReason: 'QUALITY_SCORE_TOO_LOW',
symbol: body.symbol,
symbol: normalizedSymbol, // Use normalized format for cache lookup
direction: body.direction,
originalPrice: currentPrice,
qualityScore: qualityScore.score,
@@ -448,7 +455,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<RiskCheck
})
if (queued) {
console.log(`🧠 Signal queued for smart validation: ${body.symbol} ${body.direction} (quality ${qualityScore.score})`)
console.log(`🧠 Signal queued for smart validation: ${normalizedSymbol} ${body.direction} (quality ${qualityScore.score})`)
}
} else {
console.warn('⚠️ Skipping blocked signal save: price unavailable (quality block)')