Files
trading_bot_v3/app/complete-learning/page.tsx
mindesbunister 167d7ff5bc feat: implement comprehensive AI decision display and reasoning panel
Major Features Added:
- Complete AI decision tracking system with detailed reasoning display
- Prominent gradient-styled AI reasoning panel on automation-v2 page
- Test AI decision generator with realistic trading scenarios
- Enhanced decision transparency showing entry/exit logic and leverage calculations

- Fixed orphaned order cleanup to preserve reduce-only SL/TP orders
- Integrated AI leverage calculator with 100x capability (up from 10x limit)
- Added lastDecision property to automation status for UI display
- Enhanced position monitoring with better cleanup triggers

- Beautiful gradient-styled AI Trading Analysis panel
- Color-coded confidence levels and recommendation displays
- Detailed breakdown of entry strategy, stop loss logic, and take profit targets
- Real-time display of AI leverage reasoning with safety buffer explanations
- Test AI button for demonstration of decision-making process

- SL/TP orders now execute properly (fixed cleanup interference)
- AI calculates sophisticated leverage (8.8x-42.2x vs previous 1x hardcoded)
- Complete decision audit trail with execution details
- Risk management transparency with liquidation safety calculations

- Why This Decision? - Prominent reasoning section
- Entry & Exit Strategy - Price levels with color coding
- AI Leverage Decision - Detailed calculation explanations
- Execution status with success/failure indicators
- Transaction IDs and comprehensive trade details

All systems now provide full transparency of AI decision-making process.
2025-07-26 22:41:55 +02:00

344 lines
14 KiB
TypeScript

'use client'
import React, { useState, useEffect } from 'react'
interface LearningData {
totalAnalyses: number
totalTrades: number
avgAccuracy: number
winRate: number
confidenceLevel: number
phase: string
phaseDescription: string
strengths: string[]
improvements: string[]
nextMilestone: string
recommendation: string
daysActive: number
}
interface LearningInsights {
totalAnalyses: number
avgAccuracy: number
bestTimeframe: string
worstTimeframe: string
recommendations: string[]
}
export default function CompleteLearningPage() {
const [learningData, setLearningData] = useState<LearningData | null>(null)
const [learningInsights, setLearningInsights] = useState<LearningInsights | null>(null)
const [loading, setLoading] = useState(true)
const [lastRefresh, setLastRefresh] = useState<Date>(new Date())
// Auto-refresh every 30 seconds
useEffect(() => {
fetchLearningData()
const interval = setInterval(() => {
fetchLearningData()
}, 30000)
return () => clearInterval(interval)
}, [])
const fetchLearningData = async () => {
try {
setLoading(true)
// Fetch AI learning status
const [statusResponse, insightsResponse] = await Promise.all([
fetch('/api/ai-learning-status'),
fetch('/api/automation/learning-insights')
])
if (statusResponse.ok) {
const statusData = await statusResponse.json()
if (statusData.success) {
setLearningData(statusData.data)
}
}
if (insightsResponse.ok) {
const insightsData = await insightsResponse.json()
if (insightsData.success) {
setLearningInsights(insightsData.insights)
}
}
setLastRefresh(new Date())
} catch (error) {
console.error('Failed to fetch learning data:', error)
} finally {
setLoading(false)
}
}
const getPhaseColor = (phase: string) => {
switch (phase) {
case 'EXPERT': return 'text-green-400'
case 'ADVANCED': return 'text-blue-400'
case 'PATTERN_RECOGNITION': return 'text-yellow-400'
default: return 'text-gray-400'
}
}
const getPhaseIcon = (phase: string) => {
switch (phase) {
case 'EXPERT': return '🚀'
case 'ADVANCED': return '🌳'
case 'PATTERN_RECOGNITION': return '🌿'
default: return '🌱'
}
}
if (loading && !learningData) {
return (
<div className="min-h-screen bg-gradient-to-br from-gray-900 via-gray-800 to-gray-900 p-6">
<div className="max-w-6xl mx-auto">
<div className="flex items-center justify-center py-20">
<div className="spinner border-blue-500"></div>
<span className="ml-3 text-white">Loading comprehensive learning data...</span>
</div>
</div>
</div>
)
}
return (
<div className="min-h-screen bg-gradient-to-br from-gray-900 via-gray-800 to-gray-900 p-6">
<div className="max-w-6xl mx-auto space-y-6">
{/* Header */}
<div className="text-center mb-8">
<h1 className="text-4xl font-bold text-white mb-4">🧠 Complete AI Learning Status</h1>
<p className="text-gray-300 text-lg">Comprehensive overview of your AI's learning progress and capabilities</p>
<div className="text-sm text-gray-400 mt-2">
Last updated: {lastRefresh.toLocaleTimeString()}
<span className="ml-3 text-blue-400">⟳ Auto-refreshes every 30 seconds</span>
</div>
</div>
{/* Quick Stats */}
<div className="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-blue-400">{learningData?.totalAnalyses || 0}</div>
<div className="text-gray-300 text-sm">Total Analyses</div>
</div>
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-green-400">{learningData?.totalTrades || 0}</div>
<div className="text-gray-300 text-sm">Total Trades</div>
</div>
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-purple-400">{((learningData?.avgAccuracy || 0) * 100).toFixed(1)}%</div>
<div className="text-gray-300 text-sm">Avg Accuracy</div>
</div>
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6 text-center">
<div className="text-3xl font-bold text-yellow-400">{((learningData?.winRate || 0) * 100).toFixed(1)}%</div>
<div className="text-gray-300 text-sm">Win Rate</div>
</div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
{/* AI Learning Phase */}
{learningData && (
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6">
<h2 className="text-2xl font-bold text-white mb-6 flex items-center">
<span className="mr-3">{getPhaseIcon(learningData.phase)}</span>
AI Learning Phase
</h2>
<div className="space-y-6">
{/* Current Phase */}
<div className="text-center">
<div className={`text-3xl font-bold ${getPhaseColor(learningData.phase)} mb-2`}>
{learningData.phase}
</div>
<div className="text-white text-lg mb-4">{learningData.phaseDescription}</div>
<div className="text-gray-300 text-sm">Active for {learningData.daysActive} days</div>
</div>
{/* Performance Metrics */}
<div className="grid grid-cols-2 gap-4">
<div className="text-center bg-gray-700/30 rounded-lg p-3">
<div className="text-xl font-bold text-white">{learningData.confidenceLevel.toFixed(1)}%</div>
<div className="text-xs text-gray-400">Confidence Level</div>
</div>
<div className="text-center bg-gray-700/30 rounded-lg p-3">
<div className="text-xl font-bold text-white">{((learningData.avgAccuracy || 0) * 100).toFixed(1)}%</div>
<div className="text-xs text-gray-400">Accuracy</div>
</div>
</div>
{/* Next Milestone */}
<div className="bg-blue-900/20 border border-blue-600/30 rounded-lg p-4">
<div className="text-sm font-medium text-blue-400 mb-2">Next Milestone</div>
<div className="text-white">{learningData.nextMilestone}</div>
</div>
{/* AI Recommendation */}
<div className="bg-green-900/20 border border-green-600/30 rounded-lg p-4">
<div className="text-sm font-medium text-green-400 mb-2">AI Recommendation</div>
<div className="text-white text-sm">{learningData.recommendation}</div>
</div>
</div>
</div>
)}
{/* Strengths & Improvements */}
{learningData && (
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6">
<h2 className="text-2xl font-bold text-white mb-6">📈 Performance Analysis</h2>
<div className="grid grid-cols-1 gap-6">
{/* Strengths */}
<div>
<h3 className="text-green-400 font-semibold mb-3 flex items-center">
<span className="mr-2">✅</span>
Current Strengths
</h3>
<ul className="space-y-2">
{learningData.strengths.map((strength, idx) => (
<li key={idx} className="text-sm text-gray-300 flex items-start">
<span className="text-green-400 mr-2 mt-0.5">✓</span>
{strength}
</li>
))}
</ul>
</div>
{/* Improvements */}
<div>
<h3 className="text-yellow-400 font-semibold mb-3 flex items-center">
<span className="mr-2">🎯</span>
Areas for Improvement
</h3>
<ul className="space-y-2">
{learningData.improvements.map((improvement, idx) => (
<li key={idx} className="text-sm text-gray-300 flex items-start">
<span className="text-yellow-400 mr-2 mt-0.5">•</span>
{improvement}
</li>
))}
</ul>
</div>
</div>
</div>
)}
{/* Learning Insights */}
{learningInsights && (
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6">
<h2 className="text-2xl font-bold text-white mb-6">🎯 Learning Insights</h2>
<div className="space-y-4">
<div className="flex justify-between items-center">
<span className="text-gray-300">Total Analyses:</span>
<span className="text-white font-semibold">{learningInsights.totalAnalyses}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-gray-300">Avg Accuracy:</span>
<span className="text-white font-semibold">{(learningInsights.avgAccuracy * 100).toFixed(1)}%</span>
</div>
<div className="flex justify-between items-center">
<span className="text-gray-300">Best Timeframe:</span>
<span className="text-green-400 font-semibold">{learningInsights.bestTimeframe}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-gray-300">Worst Timeframe:</span>
<span className="text-red-400 font-semibold">{learningInsights.worstTimeframe}</span>
</div>
{learningInsights.recommendations.length > 0 && (
<div className="mt-6">
<h4 className="text-lg font-semibold text-white mb-3">💡 AI Recommendations</h4>
<ul className="space-y-2">
{learningInsights.recommendations.map((rec, idx) => (
<li key={idx} className="text-sm text-gray-300 flex items-start">
<span className="text-blue-400 mr-2 mt-0.5">💡</span>
{rec}
</li>
))}
</ul>
</div>
)}
</div>
</div>
)}
{/* Refresh Control */}
<div className="bg-gray-800/50 backdrop-blur-sm border border-gray-700 rounded-lg p-6">
<h2 className="text-2xl font-bold text-white mb-6">🔄 Data Controls</h2>
<div className="space-y-4">
<div className="flex items-center justify-between">
<span className="text-gray-300">Auto Refresh:</span>
<span className="text-green-400 font-semibold">Every 30 seconds</span>
</div>
<div className="flex items-center justify-between">
<span className="text-gray-300">Last Updated:</span>
<span className="text-blue-400 font-semibold">{lastRefresh.toLocaleTimeString()}</span>
</div>
<button
onClick={fetchLearningData}
disabled={loading}
className="w-full bg-blue-600 hover:bg-blue-700 disabled:bg-gray-600 text-white font-semibold py-3 px-4 rounded-lg transition-colors duration-200 flex items-center justify-center"
>
{loading ? (
<>
<div className="spinner border-white mr-2"></div>
Refreshing...
</>
) : (
<>
<span className="mr-2">🔄</span>
Refresh Now
</>
)}
</button>
<div className="text-xs text-gray-400 text-center mt-2">
Data refreshes automatically to show the latest AI learning progress
</div>
</div>
</div>
</div>
{/* Status Messages */}
{!learningData && !loading && (
<div className="bg-yellow-900/20 border border-yellow-600/30 rounded-lg p-4 text-center">
<div className="text-yellow-400 font-semibold mb-2">⚠️ No Learning Data Available</div>
<div className="text-gray-300 text-sm">
The AI hasn't started learning yet. Run some analyses to see learning progress here.
</div>
</div>
)}
{/* Footer Info */}
<div className="text-center text-gray-400 text-sm border-t border-gray-700 pt-6">
<p>This page automatically refreshes every 30 seconds to show real-time AI learning progress.</p>
<p className="mt-1">Navigate to <span className="text-blue-400">/automation</span> to start the AI learning process.</p>
</div>
</div>
<style jsx>{`
.spinner {
width: 16px;
height: 16px;
border: 2px solid transparent;
border-top: 2px solid currentColor;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`}</style>
</div>
)
}