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

@@ -107,17 +107,32 @@ export async function GET() {
}
}
// Determine result based on actual profit
// Determine result based on actual profit - use profit field as fallback
let result = 'ACTIVE'
if (trade.status === 'COMPLETED') {
if (calculatedProfit === null || calculatedProfit === undefined) {
result = 'UNKNOWN' // When we truly don't have enough data
} else if (Math.abs(calculatedProfit) < 0.01) { // Within 1 cent
result = 'BREAKEVEN'
} else if (calculatedProfit > 0) {
result = 'WIN'
// First try to use the stored profit field
const storedProfit = trade.profit || 0
if (calculatedProfit !== null && calculatedProfit !== undefined) {
// Use calculated profit if available
if (Math.abs(calculatedProfit) < 0.01) {
result = 'BREAKEVEN'
} else if (calculatedProfit > 0) {
result = 'WIN'
} else {
result = 'LOSS'
}
} else if (storedProfit !== null) {
// Fallback to stored profit field
if (Math.abs(storedProfit) < 0.01) {
result = 'BREAKEVEN'
} else if (storedProfit > 0) {
result = 'WIN'
} else {
result = 'LOSS'
}
} else {
result = 'LOSS'
result = 'UNKNOWN' // When we truly don't have any profit data
}
}