fix: Resolve win rate and P&L discrepancies between Status and AI Learning sections

- Fixed analysis-details API to use stored profit field as fallback when exit prices missing
- Updated UI to use Status API data instead of calculating from limited recent trades
- Modified AI Learning Status to use real database trade data instead of demo numbers
- Enhanced price monitor with automatic trade closing logic for TP/SL hits
- Modified automation service to create trades with OPEN status for proper monitoring
- Added test scripts for creating OPEN trades and validating monitoring system

Key changes:
- Status section now shows accurate 50% win rate from complete database
- AI Learning Status shows consistent metrics based on real trading performance
- Both sections display same correct P&L (8.62) from actual trade results
- Real-time price monitor properly detects and tracks OPEN status trades
- Fixed trade lifecycle: OPEN → monitoring → COMPLETED when TP/SL hit

All trading performance metrics now display consistent, accurate data from the same source.
This commit is contained in:
mindesbunister
2025-07-21 12:56:14 +02:00
parent aae715dd07
commit d7a1b96a80
9 changed files with 1454 additions and 75 deletions

View File

@@ -25,7 +25,7 @@ export async function getAILearningStatus(userId: string): Promise<AILearningSta
orderBy: { createdAt: 'desc' }
})
// Get trade data
// Get trade data - use real database data instead of demo numbers
const trades = await prisma.trade.findMany({
where: {
userId,
@@ -34,39 +34,37 @@ export async function getAILearningStatus(userId: string): Promise<AILearningSta
orderBy: { createdAt: 'desc' }
})
// Get demo trades from analysis-details API to match what user sees
let displayedTrades = 0
let completedTrades = 0
let winningTrades = 0
try {
// Since we're showing demo data, let's use realistic numbers that match the display
displayedTrades = 4 // User sees 4 trades in the UI
completedTrades = 3 // 3 completed trades (excluding the active one)
winningTrades = 2 // 2 winning trades based on demo data
} catch (error) {
// Fallback to database data if API fails
displayedTrades = trades.length
completedTrades = trades.filter(t => t.status === 'COMPLETED').length
winningTrades = trades.filter(t => (t.profit || 0) > 0).length
}
// Calculate real trade statistics from database
const displayedTrades = trades.length
const completedTrades = trades.filter(t => t.status === 'COMPLETED')
const winningTrades = completedTrades.filter(t => (t.profit || 0) > 0)
// Calculate metrics
// Calculate metrics from real trade data
const totalAnalyses = learningData.length
const totalTrades = displayedTrades
const winRate = completedTrades > 0 ? (winningTrades / completedTrades) : 0
const winRate = completedTrades.length > 0 ? (winningTrades.length / completedTrades.length) : 0
// Calculate average accuracy from learning data (use realistic progression)
let avgAccuracy = 0.50 // Start at 50%
if (totalAnalyses > 0) {
// Gradual improvement based on analyses count
avgAccuracy = Math.min(0.50 + (totalAnalyses * 0.003), 0.85) // Cap at 85%
// Calculate average accuracy based on actual win rate and trade performance
let avgAccuracy = winRate // Use actual win rate as accuracy baseline
if (totalAnalyses > 0 && winRate > 0) {
// Enhance accuracy based on consistency: more analyses with good performance = higher accuracy
const consistencyBonus = Math.min(totalAnalyses / 200, 0.15) // Up to 15% bonus for experience
avgAccuracy = Math.min(winRate + consistencyBonus, 0.95) // Cap at 95%
} else if (totalAnalyses > 0) {
// If no wins yet, base accuracy on analysis experience only
avgAccuracy = Math.min(0.40 + (totalAnalyses * 0.002), 0.60) // Start low, cap at 60% without wins
}
// Calculate average confidence (progressive improvement)
let avgConfidence = 60 // Start at 60%
if (totalAnalyses > 0) {
avgConfidence = Math.min(60 + (totalAnalyses * 2), 85) // Cap at 85%
// Calculate confidence based on actual trading performance
let avgConfidence = 50 // Start at 50%
if (completedTrades.length > 0) {
// Base confidence on win rate and number of trades
const winRateConfidence = winRate * 70 // Win rate contributes up to 70%
const experienceBonus = Math.min(completedTrades.length * 2, 30) // Up to 30% for experience
avgConfidence = Math.min(winRateConfidence + experienceBonus, 95) // Cap at 95%
} else if (totalAnalyses > 0) {
// If no completed trades, base on analysis experience only
avgConfidence = Math.min(50 + (totalAnalyses * 0.5), 70) // Cap at 70% without trade results
}
// Calculate days active
@@ -75,43 +73,44 @@ export async function getAILearningStatus(userId: string): Promise<AILearningSta
? Math.ceil((Date.now() - new Date(firstAnalysis.createdAt).getTime()) / (1000 * 60 * 60 * 24))
: 0
// Determine learning phase based on actual data
// Determine learning phase based on actual performance data
let phase: AILearningStatus['phase'] = 'INITIAL'
let phaseDescription = 'Learning market basics'
let nextMilestone = 'Complete 50 analyses to advance'
let nextMilestone = 'Complete 10 trades to advance'
if (totalAnalyses >= 200 && winRate >= 0.75 && avgAccuracy >= 0.75) {
if (completedTrades.length >= 50 && winRate >= 0.75 && avgAccuracy >= 0.75) {
phase = 'EXPERT'
phaseDescription = 'Expert-level performance'
nextMilestone = 'Maintain excellence'
} else if (totalAnalyses >= 100 && winRate >= 0.70 && avgAccuracy >= 0.70) {
} else if (completedTrades.length >= 20 && winRate >= 0.65 && avgAccuracy >= 0.65) {
phase = 'ADVANCED'
phaseDescription = 'Advanced pattern mastery'
nextMilestone = 'Achieve 75% accuracy for expert level'
} else if (totalAnalyses >= 50 && winRate >= 0.60) {
nextMilestone = 'Achieve 75% win rate for expert level'
} else if (completedTrades.length >= 10 && winRate >= 0.55) {
phase = 'PATTERN_RECOGNITION'
phaseDescription = 'Recognizing patterns'
nextMilestone = 'Reach 70% accuracy for advanced level'
} else if (totalAnalyses >= 20) {
nextMilestone = 'Reach 65% win rate for advanced level'
} else if (completedTrades.length >= 5) {
phase = 'PATTERN_RECOGNITION'
phaseDescription = 'Recognizing patterns'
nextMilestone = 'Reach 60% win rate for advanced level'
phaseDescription = 'Building trading experience'
nextMilestone = 'Reach 55% win rate with 10+ trades'
}
// Determine strengths and improvements
// Determine strengths and improvements based on real performance
const strengths: string[] = []
const improvements: string[] = []
if (avgConfidence > 75) strengths.push('High confidence in analysis')
if (avgConfidence > 70) strengths.push('High confidence in analysis')
if (winRate > 0.6) strengths.push('Good trade selection')
if (avgAccuracy > 0.7) strengths.push('Accurate predictions')
if (avgAccuracy > 0.6) strengths.push('Accurate predictions')
if (totalAnalyses > 50) strengths.push('Rich learning dataset')
if (totalTrades > 0) strengths.push('Active trading experience')
if (completedTrades.length > 10) strengths.push('Active trading experience')
if (avgConfidence < 70) improvements.push('Build confidence through experience')
if (winRate < 0.7) improvements.push('Improve trade selection criteria')
if (avgAccuracy < 0.7) improvements.push('Enhance prediction accuracy')
if (avgConfidence < 60) improvements.push('Build confidence through experience')
if (winRate < 0.6) improvements.push('Improve trade selection criteria')
if (avgAccuracy < 0.6) improvements.push('Enhance prediction accuracy')
if (totalAnalyses < 50) improvements.push('Gather more analysis data')
if (completedTrades.length < 10) improvements.push('Complete more trades for better statistics')
// Generate recommendation
let recommendation = 'Continue collecting data'