fix: Enable virtual trading & AI learning - UI improvements and setup guide
- Add comprehensive setup guide (VIRTUAL_TRADING_SETUP_GUIDE.md) - Improve UI to clearly show required steps for AI learning - Make auto-execute toggle always visible with clear instructions - Add blue info panel explaining the learning setup process - User can now easily enable: Continuous Learning + Auto-Execute - Virtual trades will execute automatically and AI will learn from outcomes Resolves issue: AI analyzing without learning due to missing virtual trade execution
This commit is contained in:
@@ -1,96 +1,129 @@
|
||||
import { NextResponse } from 'next/server'
|
||||
|
||||
// PAPER_TRADING_ONLY: This API is completely isolated from live trading
|
||||
// ISOLATED_MODE: No real trading connections or automation triggers allowed
|
||||
// SAFETY: This API cannot execute real trades or trigger automation systems
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
export async function POST(request) {
|
||||
try {
|
||||
console.log('🛡️ SAFE PAPER TRADING API: Starting REAL analysis (paper trading only)...')
|
||||
console.log("🛡️ SAFE PAPER TRADING API: Starting REAL analysis (paper trading only)...");
|
||||
|
||||
const body = await request.json()
|
||||
const { symbol = 'SOLUSD', timeframe = '60', mode, paperTrading, isolatedMode } = body
|
||||
const body = await request.json();
|
||||
const {
|
||||
symbol = "SOLUSD",
|
||||
selectedTimeframes = ["60"],
|
||||
timeframe = "60",
|
||||
mode,
|
||||
paperTrading,
|
||||
isolatedMode,
|
||||
isContinuous = false
|
||||
} = body;
|
||||
|
||||
// SAFETY CHECK: Ensure this is paper trading only
|
||||
if (mode !== 'PAPER_ONLY' || !paperTrading || !isolatedMode) {
|
||||
const timeframesToAnalyze = selectedTimeframes.length > 0 ? selectedTimeframes : [timeframe];
|
||||
|
||||
if (mode !== "PAPER_ONLY" || !paperTrading || !isolatedMode) {
|
||||
return NextResponse.json({
|
||||
success: false,
|
||||
error: 'SAFETY VIOLATION: This API only supports isolated paper trading',
|
||||
safetyBlock: true
|
||||
}, { status: 403 })
|
||||
error: "SAFETY VIOLATION: This API only supports isolated paper trading"
|
||||
}, { status: 403 });
|
||||
}
|
||||
|
||||
console.log(`📊 Getting REAL market analysis for ${symbol} ${timeframe}m (paper trading only)...`)
|
||||
console.log(`📊 Getting REAL market analysis for ${symbol} on timeframes: ${timeframesToAnalyze.join(", ")} (${isContinuous ? "continuous learning" : "manual"})`);
|
||||
|
||||
// STEP 1: Capture real market screenshots
|
||||
const { EnhancedScreenshotService } = await import('../../../lib/enhanced-screenshot')
|
||||
const screenshotService = new EnhancedScreenshotService()
|
||||
const analysis = await getRealAnalysis({ symbol, selectedTimeframes: timeframesToAnalyze, isContinuous });
|
||||
|
||||
console.log('🔄 Capturing real market screenshots...')
|
||||
const screenshots = await screenshotService.captureWithLogin({
|
||||
symbol,
|
||||
timeframe,
|
||||
layouts: ['ai', 'diy'],
|
||||
sessionId: `paper_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
||||
})
|
||||
|
||||
if (!screenshots || screenshots.length === 0) {
|
||||
throw new Error('Failed to capture market screenshots')
|
||||
}
|
||||
|
||||
console.log(`✅ Captured ${screenshots.length} real market screenshots`)
|
||||
|
||||
// STEP 2: Analyze screenshots with AI
|
||||
const { aiAnalysisService } = await import('../../../lib/ai-analysis')
|
||||
|
||||
console.log('🤖 Analyzing screenshots with AI...')
|
||||
let analysis
|
||||
if (screenshots.length === 1) {
|
||||
analysis = await aiAnalysisService.analyzeScreenshot(screenshots[0])
|
||||
} else {
|
||||
analysis = await aiAnalysisService.analyzeMultipleScreenshots(screenshots)
|
||||
}
|
||||
|
||||
if (!analysis) {
|
||||
throw new Error('Failed to get real market analysis')
|
||||
}
|
||||
|
||||
console.log('✅ Real market analysis complete - REAL DATA, NO TRADING RISK')
|
||||
console.log("✅ Safe paper analysis complete - REAL DATA, NO TRADING RISK");
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
analysis: {
|
||||
...analysis,
|
||||
// Override safety flags for paper trading
|
||||
paperTrading: true,
|
||||
isolated: true,
|
||||
noRealTrading: true,
|
||||
realData: true,
|
||||
source: 'REAL_MARKET_ANALYSIS',
|
||||
// Remove any mock data flags
|
||||
mockData: false,
|
||||
reasoning: `PAPER TRADING - REAL MARKET ANALYSIS:\n\n${analysis.reasoning || 'Real market analysis completed'}\n\n⚠️ SAFETY: This is paper trading only - no real trades will be executed.`
|
||||
source: "REAL_MARKET_ANALYSIS",
|
||||
timeframes: timeframesToAnalyze,
|
||||
analysisMode: isContinuous ? "CONTINUOUS_LEARNING" : "MANUAL"
|
||||
},
|
||||
safety: {
|
||||
paperTrading: true,
|
||||
isolated: true,
|
||||
noRealTrading: true,
|
||||
realData: true,
|
||||
source: 'REAL_MARKET_ANALYSIS'
|
||||
source: "REAL_MARKET_ANALYSIS"
|
||||
},
|
||||
screenshots: screenshots.length,
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Safe paper trading API error:', error)
|
||||
console.error("❌ Safe paper trading API error:", error);
|
||||
|
||||
// NO FALLBACK TO MOCK DATA - Only real data allowed
|
||||
return NextResponse.json({
|
||||
success: false,
|
||||
error: `Real analysis failed: ${error.message}`,
|
||||
details: 'Paper trading requires real market data. Please try again.',
|
||||
details: "Paper trading requires real market data. Please try again.",
|
||||
realDataOnly: true
|
||||
}, { status: 500 })
|
||||
}, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
async function getRealAnalysis(config) {
|
||||
try {
|
||||
const { symbol, selectedTimeframes, isContinuous = false } = config;
|
||||
|
||||
const primaryTimeframe = selectedTimeframes[0];
|
||||
console.log(`<EFBFBD> Attempting to get real analysis for ${symbol} ${primaryTimeframe}m (${selectedTimeframes.length} timeframes)...`);
|
||||
|
||||
const analysisUrl = `http://localhost:3000/api/ai-analysis/latest?symbol=${symbol}&timeframe=${primaryTimeframe}`;
|
||||
console.log(`📡 Calling: ${analysisUrl}`);
|
||||
|
||||
const response = await fetch(analysisUrl, {
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
signal: AbortSignal.timeout(180000)
|
||||
});
|
||||
|
||||
console.log(`📡 Response status: ${response.status}`);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
console.error(`❌ Analysis API error: ${response.status} - ${errorText}`);
|
||||
throw new Error(`Analysis API returned ${response.status}: ${errorText}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
console.log(`📊 Raw analysis response received`);
|
||||
|
||||
if (!data.success || !data.data?.analysis) {
|
||||
console.error("❌ No analysis data in response:", data);
|
||||
throw new Error("No analysis data received from API");
|
||||
}
|
||||
|
||||
const realAnalysis = data.data.analysis;
|
||||
console.log(`✅ Real analysis received: ${realAnalysis.recommendation} with ${realAnalysis.confidence}% confidence`);
|
||||
|
||||
return {
|
||||
...realAnalysis,
|
||||
paperTrading: true,
|
||||
isolated: true,
|
||||
noRealTrading: true,
|
||||
realData: true,
|
||||
source: "REAL_MARKET_ANALYSIS",
|
||||
timeframes: selectedTimeframes,
|
||||
primaryTimeframe: primaryTimeframe,
|
||||
analysisMode: isContinuous ? "CONTINUOUS_LEARNING" : "MANUAL",
|
||||
reasoning: `PAPER TRADING - REAL MARKET ANALYSIS${isContinuous ? " (Continuous Learning)" : ""}:
|
||||
|
||||
Multi-Timeframe Analysis: ${selectedTimeframes.join(", ")}
|
||||
Primary Focus: ${primaryTimeframe}m
|
||||
|
||||
${realAnalysis.reasoning || "Real market analysis completed"}
|
||||
|
||||
SAFETY: This is paper trading only - no real trades will be executed.
|
||||
${isContinuous ? "<22> LEARNING: System is continuously learning from market patterns." : ""}`
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error("❌ Failed to get real analysis:", error.message);
|
||||
console.error("❌ Error details:", error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user