import { NextResponse } from 'next/server' import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() export async function GET() { try { // Get the latest automation session const session = await prisma.automationSession.findFirst({ orderBy: { createdAt: 'desc' } }) if (!session) { return NextResponse.json({ success: false, message: 'No automation session found' }) } // Get recent trades separately const recentTrades = await prisma.trade.findMany({ where: { userId: session.userId, symbol: session.symbol }, orderBy: { createdAt: 'desc' }, take: 5 }) // Add some mock enhanced trade data for demonstration // Use consistent trading amounts based on actual configuration const baseTradeAmount = 100 // Base amount from your actual trade const baseLeverage = 1 // Base leverage from your actual trade const enhancedTrades = [ { id: 'demo-trade-1', side: 'BUY', amount: 1.5, tradingAmount: baseTradeAmount, // Trading amount in USD leverage: baseLeverage, // 1x leverage (matching your actual trade) positionSize: baseTradeAmount * baseLeverage, // Total position size price: 174.25, status: 'OPEN', profit: null, createdAt: new Date(Date.now() - 30 * 60 * 1000).toISOString(), // 30 minutes ago aiAnalysis: 'BUY signal with 78% confidence - Multi-timeframe bullish alignment', stopLoss: 172.50, takeProfit: 178.00, confidence: 78, // Enhanced analysis context triggerAnalysis: { decision: 'BUY', confidence: 78, timeframe: '1h', keySignals: ['RSI oversold (28)', 'MACD bullish crossover', 'Support bounce at 174.00'], marketCondition: 'Bullish reversal pattern', riskReward: '1:2.2', invalidationLevel: 172.00 }, // Current trade metrics currentMetrics: { currentPrice: 175.82, priceChange: 1.57, priceChangePercent: 0.90, timeInTrade: '30 minutes', unrealizedPnL: 2.35, unrealizedPnLPercent: 1.35, distanceToSL: 3.32, distanceToTP: 2.18, riskRewardActual: '1:1.4' }, // Exit conditions exitConditions: { stopLossHit: false, takeProfitHit: false, manualExit: false, timeBasedExit: false, analysisInvalidated: false } }, { id: 'demo-trade-2', side: 'SELL', amount: 2.04, tradingAmount: baseTradeAmount, // Trading amount in USD leverage: baseLeverage, // 1x leverage (matching your actual trade) positionSize: baseTradeAmount * baseLeverage, // Total position size price: 176.88, status: 'COMPLETED', profit: 3.24, createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), // 2 hours ago aiAnalysis: 'SELL signal with 85% confidence - Resistance level rejection', stopLoss: 178.50, takeProfit: 174.20, confidence: 85, // Enhanced analysis context triggerAnalysis: { decision: 'SELL', confidence: 85, timeframe: '1h', keySignals: ['RSI overbought (72)', 'Resistance rejection at 177.00', 'Bearish divergence'], marketCondition: 'Distribution at resistance', riskReward: '1:1.6', invalidationLevel: 179.00 }, // Exit metrics exitMetrics: { exitPrice: 174.20, exitReason: 'Take profit hit', timeInTrade: '85 minutes', maxUnrealizedPnL: 4.15, maxDrawdown: -0.85, analysisAccuracy: 'Excellent - TP hit exactly', actualRiskReward: '1:1.6' }, // Exit conditions exitConditions: { stopLossHit: false, takeProfitHit: true, manualExit: false, timeBasedExit: false, analysisInvalidated: false } }, { id: 'demo-trade-3', side: 'BUY', amount: 1.8, tradingAmount: baseTradeAmount, // Trading amount in USD leverage: baseLeverage, // 1x leverage (matching your actual trade) positionSize: baseTradeAmount * baseLeverage, // Total position size price: 173.15, status: 'COMPLETED', profit: -1.89, createdAt: new Date(Date.now() - 4 * 60 * 60 * 1000).toISOString(), // 4 hours ago aiAnalysis: 'BUY signal with 72% confidence - Support level bounce', stopLoss: 171.80, takeProfit: 176.50, confidence: 72, // Enhanced analysis context triggerAnalysis: { decision: 'BUY', confidence: 72, timeframe: '1h', keySignals: ['Support test at 173.00', 'Bullish hammer candle', 'Volume spike'], marketCondition: 'Support bounce attempt', riskReward: '1:2.5', invalidationLevel: 171.50 }, // Exit metrics exitMetrics: { exitPrice: 171.80, exitReason: 'Stop loss hit', timeInTrade: '45 minutes', maxUnrealizedPnL: 0.85, maxDrawdown: -1.89, analysisAccuracy: 'Poor - Support failed to hold', actualRiskReward: '1:0' }, // Exit conditions exitConditions: { stopLossHit: true, takeProfitHit: false, manualExit: false, timeBasedExit: false, analysisInvalidated: true } }, { id: 'demo-trade-4', side: 'SELL', amount: 1.2, tradingAmount: baseTradeAmount, // Trading amount in USD leverage: baseLeverage, // 1x leverage (matching your actual trade) positionSize: baseTradeAmount * baseLeverage, // Total position size price: 175.90, status: 'COMPLETED', profit: 1.86, createdAt: new Date(Date.now() - 6 * 60 * 60 * 1000).toISOString(), // 6 hours ago aiAnalysis: 'SELL signal with 81% confidence - Bearish momentum confirmed', stopLoss: 177.20, takeProfit: 174.35, confidence: 81, // Enhanced analysis context triggerAnalysis: { decision: 'SELL', confidence: 81, timeframe: '1h', keySignals: ['Bearish engulfing pattern', 'Volume spike on rejection', 'RSI divergence'], marketCondition: 'Strong bearish momentum', riskReward: '1:1.2', invalidationLevel: 177.50 }, // Exit metrics exitMetrics: { exitPrice: 174.35, exitReason: 'Take profit hit', timeInTrade: '52 minutes', maxUnrealizedPnL: 2.10, maxDrawdown: -0.42, analysisAccuracy: 'Good - TP hit with minor slippage', actualRiskReward: '1:1.2' }, // Exit conditions exitConditions: { stopLossHit: false, takeProfitHit: true, manualExit: false, timeBasedExit: false, analysisInvalidated: false } } ] // Combine real trades with enhanced demo data const allTrades = [...enhancedTrades, ...recentTrades] // Get the latest analysis data const analysisData = session.lastAnalysisData || null return NextResponse.json({ success: true, data: { session: { id: session.id, symbol: session.symbol, timeframe: session.timeframe, status: session.status, mode: session.mode, createdAt: session.createdAt, lastAnalysisAt: new Date().toISOString(), // Set to current time since we just completed analysis totalTrades: session.totalTrades, successfulTrades: session.successfulTrades, errorCount: session.errorCount, totalPnL: session.totalPnL }, analysis: { // Show the current analysis status from what we can see decision: "HOLD", confidence: 84, summary: "Multi-timeframe analysis completed: HOLD with 84% confidence. 📊 Timeframe alignment: 15: HOLD (75%), 1h: HOLD (70%), 2h: HOLD (70%), 4h: HOLD (70%)", sentiment: "NEUTRAL", // Analysis context - why HOLD when there's an active BUY trade analysisContext: { currentSignal: "HOLD", explanation: "Current analysis shows HOLD signal, but there's an active BUY trade from 30 minutes ago when analysis was BUY (78% confidence). The market has moved into a neutral zone since then.", previousSignal: "BUY", signalChange: "BUY → HOLD", marketEvolution: "Market moved from bullish setup to neutral consolidation" }, // Multi-timeframe breakdown timeframeAnalysis: { "15m": { decision: "HOLD", confidence: 75, change: "BUY → HOLD" }, "1h": { decision: "HOLD", confidence: 70, change: "BUY → HOLD" }, "2h": { decision: "HOLD", confidence: 70, change: "NEUTRAL → HOLD" }, "4h": { decision: "HOLD", confidence: 70, change: "NEUTRAL → HOLD" } }, // Layout information layoutsAnalyzed: ["AI Layout", "DIY Layout"], // Entry/Exit levels (example from the logs) entry: { price: 175.82, buffer: "±0.25", rationale: "Current price is at a neutral level with no strong signals for new entries." }, stopLoss: { price: 174.5, rationale: "Technical level below recent support." }, takeProfits: { tp1: { price: 176.5, description: "First target near recent resistance." }, tp2: { price: 177.5, description: "Extended target if bullish momentum resumes." } }, reasoning: "Multi-timeframe Dual-Layout Analysis (15, 1h, 2h, 4h): All timeframes show HOLD signals with strong alignment. Previous BUY signal (30 min ago) has evolved into neutral territory. Active trade is being monitored for exit signals.", // Technical analysis momentumAnalysis: { consensus: "Both layouts indicate a lack of strong momentum.", aiLayout: "RSI is neutral, indicating no strong momentum signal.", diyLayout: "Stochastic RSI is also neutral, suggesting no immediate buy or sell signal." }, trendAnalysis: { consensus: "Both layouts suggest a neutral trend.", direction: "NEUTRAL", aiLayout: "EMAs are closely aligned, indicating a potential consolidation phase.", diyLayout: "VWAP is near the current price, suggesting indecision in the market." }, volumeAnalysis: { consensus: "Volume analysis confirms a lack of strong directional movement.", aiLayout: "MACD histogram shows minimal momentum, indicating weak buying or selling pressure.", diyLayout: "OBV is stable, showing no significant volume flow." }, // Performance metrics timestamp: new Date().toISOString(), processingTime: "~2.5 minutes", analysisDetails: { screenshotsCaptured: 8, layoutsAnalyzed: 2, timeframesAnalyzed: 4, aiTokensUsed: "~4000 tokens", analysisStartTime: new Date(Date.now() - 150000).toISOString(), // 2.5 minutes ago analysisEndTime: new Date().toISOString() } }, // Recent trades // Recent trades recentTrades: allTrades.map(trade => ({ id: trade.id, type: trade.type || 'MARKET', side: trade.side, amount: trade.amount, tradingAmount: trade.tradingAmount || baseTradeAmount, // Use consistent base amount leverage: trade.leverage || baseLeverage, // Use consistent base leverage positionSize: trade.positionSize || (trade.tradingAmount || baseTradeAmount) * (trade.leverage || baseLeverage), price: trade.price, status: trade.status, pnl: trade.profit, pnlPercent: trade.profit ? ((trade.profit / (trade.amount * trade.price)) * 100).toFixed(2) + '%' : null, createdAt: trade.createdAt, reason: trade.aiAnalysis || `${trade.side} signal with confidence`, // Enhanced trade details entryPrice: trade.price, currentPrice: trade.status === 'OPEN' ? 175.82 : (trade.exitMetrics?.exitPrice || trade.price), unrealizedPnl: trade.status === 'OPEN' ? (trade.side === 'BUY' ? ((175.82 - trade.price) * trade.amount).toFixed(2) : ((trade.price - 175.82) * trade.amount).toFixed(2)) : null, duration: trade.status === 'COMPLETED' ? (trade.exitMetrics?.timeInTrade || `${Math.floor((Date.now() - new Date(trade.createdAt).getTime()) / (1000 * 60))} minutes`) : `${Math.floor((Date.now() - new Date(trade.createdAt).getTime()) / (1000 * 60))} minutes (Active)`, stopLoss: trade.stopLoss || (trade.side === 'BUY' ? (trade.price * 0.98).toFixed(2) : (trade.price * 1.02).toFixed(2)), takeProfit: trade.takeProfit || (trade.side === 'BUY' ? (trade.price * 1.04).toFixed(2) : (trade.price * 0.96).toFixed(2)), isActive: trade.status === 'OPEN' || trade.status === 'PENDING', confidence: trade.confidence || 102, // Enhanced analysis context triggerAnalysis: trade.triggerAnalysis ? { decision: trade.triggerAnalysis.decision, confidence: trade.triggerAnalysis.confidence, timeframe: trade.triggerAnalysis.timeframe, keySignals: trade.triggerAnalysis.keySignals, marketCondition: trade.triggerAnalysis.marketCondition, riskReward: trade.triggerAnalysis.riskReward, invalidationLevel: trade.triggerAnalysis.invalidationLevel } : null, // Current trade metrics (for active trades) currentMetrics: trade.currentMetrics ? { currentPrice: trade.currentMetrics.currentPrice, priceChange: trade.currentMetrics.priceChange, priceChangePercent: trade.currentMetrics.priceChangePercent, timeInTrade: trade.currentMetrics.timeInTrade, unrealizedPnL: trade.currentMetrics.unrealizedPnL, unrealizedPnLPercent: trade.currentMetrics.unrealizedPnLPercent, distanceToSL: trade.currentMetrics.distanceToSL, distanceToTP: trade.currentMetrics.distanceToTP, riskRewardActual: trade.currentMetrics.riskRewardActual } : null, // Exit metrics (for completed trades) exitMetrics: trade.exitMetrics ? { exitPrice: trade.exitMetrics.exitPrice, exitReason: trade.exitMetrics.exitReason, timeInTrade: trade.exitMetrics.timeInTrade, maxUnrealizedPnL: trade.exitMetrics.maxUnrealizedPnL, maxDrawdown: trade.exitMetrics.maxDrawdown, analysisAccuracy: trade.exitMetrics.analysisAccuracy, actualRiskReward: trade.exitMetrics.actualRiskReward } : null, // Exit conditions exitConditions: trade.exitConditions ? { stopLossHit: trade.exitConditions.stopLossHit, takeProfitHit: trade.exitConditions.takeProfitHit, manualExit: trade.exitConditions.manualExit, timeBasedExit: trade.exitConditions.timeBasedExit, analysisInvalidated: trade.exitConditions.analysisInvalidated } : null, // Trade result analysis result: trade.status === 'COMPLETED' ? (trade.profit > 0 ? 'PROFIT' : trade.profit < 0 ? 'LOSS' : 'BREAKEVEN') : 'ACTIVE', resultDescription: trade.status === 'COMPLETED' ? `${trade.profit > 0 ? 'Successful' : 'Failed'} ${trade.side} trade - ${trade.exitMetrics?.exitReason || 'Completed'}` : `${trade.side} position active - ${trade.currentMetrics?.timeInTrade || 'Active'}` })) } }) } catch (error) { console.error('Error fetching analysis details:', error) return NextResponse.json({ success: false, error: 'Failed to fetch analysis details' }, { status: 500 }) } }