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
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'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>
)
}