🤖 Analizador de Trading AI

Análisis automático de gráficos usando Inteligencia Artificial

🖼️

Subir Gráfico de Trading

Arrastra y suelta tu imagen de gráfico aquí o haz clic para seleccionar

Analizando imagen...

🧠 Insights de Inteligencia Artificial

📊 Patrones Detectados

📈 Análisis Visual con Puntos de Interés
log('🤖 Analizador de Trading AI inicializado'); } // Configuración de subida de archivos function initializeFileUpload() { const uploadBox = document.getElementById('uploadBox'); const fileInput = document.getElementById('fileInput'); uploadBox.addEventListener('click', () => fileInput.click()); fileInput.addEventListener('change', handleFileSelect); // Drag and drop uploadBox.addEventListener('dragover', (e) => { e.preventDefault(); uploadBox.classList.add('dragover'); }); uploadBox.addEventListener('dragleave', () => { uploadBox.classList.remove('dragover'); }); uploadBox.addEventListener('drop', (e) => { e.preventDefault(); uploadBox.classList.remove('dragover'); const files = e.dataTransfer.files; if (files.length > 0) { handleFile(files[0]); } }); } function initializeCanvas() { analysisCanvas = document.getElementById('analysisCanvas'); } function handleFileSelect(e) { const file = e.target.files[0]; if (file) handleFile(file); } async function handleFile(file) { if (!file.type.startsWith('image/')) { alert('Por favor selecciona un archivo de imagen válido.'); return; } showProcessingIndicator(true); const reader = new FileReader(); reader.onload = async function(e) { uploadedImage = e.target.result; await displayImagePreview(uploadedImage); await preprocessImage(uploadedImage); showProcessingIndicator(false); }; reader.readAsDataURL(file); } function showProcessingIndicator(show) { const indicator = document.getElementById('processingIndicator'); const uploadBox = document.getElementById('uploadBox'); if (show) { indicator.classList.add('show'); uploadBox.classList.add('processing'); } else { indicator.classList.remove('show'); uploadBox.classList.remove('processing'); } } async function displayImagePreview(imageSrc) { const imagePreview = document.getElementById('imagePreview'); return new Promise((resolve) => { imagePreview.innerHTML = `
Gráfico de trading
Preparando análisis...

✅ Imagen cargada - Lista para análisis AI

`; setTimeout(resolve, 500); }); } async function preprocessImage(imageSrc) { return new Promise((resolve) => { const img = new Image(); img.onload = function() { const canvas = analysisCanvas; const ctx = canvas.getContext('2d'); // Ajustar tamaño del canvas canvas.width = Math.min(img.width, 800); canvas.height = Math.min(img.height, 600); // Dibujar imagen ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // Mostrar canvas document.getElementById('canvasContainer').style.display = 'block'; console.log('✅ Imagen preprocesada:', canvas.width, 'x', canvas.height); resolve(); }; img.src = imageSrc; }); } async function analyzeChartWithAI() { if (!uploadedImage) { alert('Por favor sube una imagen primero'); return; } const btn = document.getElementById('analyzeBtn'); btn.classList.add('loading'); btn.disabled = true; try { // Simular análisis AI progresivo await performImageAnalysis(); await detectPatterns(); await calculateTechnicalIndicators(); await generateInsights(); displayResults(); document.getElementById('results').classList.add('show'); document.getElementById('results').scrollIntoView({ behavior: 'smooth' }); } catch (error) { console.error('Error en análisis:', error); alert('Error durante el análisis. Por favor intenta de nuevo.'); } finally { btn.classList.remove('loading'); btn.disabled = false; } } async function performImageAnalysis() { console.log('🔍 Iniciando análisis de imagen...'); // Simular análisis con delay realista await new Promise(resolve => setTimeout(resolve, 1500)); const canvas = analysisCanvas; const ctx = canvas.getContext('2d'); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); // Análisis básico de colores y formas imageAnalysisData = { width: canvas.width, height: canvas.height, colorProfile: analyzeColorProfile(imageData), edges: detectEdges(imageData), regions: identifyRegions(imageData) }; console.log('✅ Análisis de imagen completado'); } function analyzeColorProfile(imageData) { const data = imageData.data; const colorCounts = { red: 0, green: 0, blue: 0, dark: 0, light: 0 }; for (let i = 0; i < data.length; i += 4) { const r = data[i]; const g = data[i + 1]; const b = data[i + 2]; const brightness = (r + g + b) / 3; if (r > g && r > b && r > 150) colorCounts.red++; if (g > r && g > b && g > 150) colorCounts.green++; if (brightness < 100) colorCounts.dark++; if (brightness > 200) colorCounts.light++; } return colorCounts; } function detectEdges(imageData) { // Implementación simplificada de detección de bordes const data = imageData.data; const width = imageData.width; const height = imageData.height; const edges = []; // Sobel edge detection simulado for (let y = 1; y < height - 1; y++) { for (let x = 1; x < width - 1; x++) { const idx = (y * width + x) * 4; const brightness = (data[idx] + data[idx + 1] + data[idx + 2]) / 3; // Calcular gradiente simplificado const neighbors = [ (data[((y-1) * width + x-1) * 4] + data[((y-1) * width + x-1) * 4 + 1] + data[((y-1) * width + x-1) * 4 + 2]) / 3, (data[((y-1) * width + x) * 4] + data[((y-1) * width + x) * 4 + 1] + data[((y-1) * width + x) * 4 + 2]) / 3, (data[((y-1) * width + x+1) * 4] + data[((y-1) * width + x+1) * 4 + 1] + data[((y-1) * width + x+1) * 4 + 2]) / 3 ]; const gradient = Math.abs(neighbors[0] - neighbors[2]); if (gradient > 50) { edges.push({ x, y, strength: gradient }); } } } return edges; } function identifyRegions(imageData) { // Identificar regiones de interés en el gráfico const regions = { topQuarter: { y: 0, height: imageData.height * 0.25, intensity: 0 }, middleHalf: { y: imageData.height * 0.25, height: imageData.height * 0.5, intensity: 0 }, bottomQuarter: { y: imageData.height * 0.75, height: imageData.height * 0.25, intensity: 0 } }; // Calcular intensidad promedio por región const data = imageData.data; const width = imageData.width; Object.keys(regions).forEach(regionKey => { const region = regions[regionKey]; let totalIntensity = 0; let pixelCount = 0; for (let y = region.y; y < region.y + region.height; y++) { for (let x = 0; x < width; x++) { const idx = (y * width + x) * 4; const intensity = (data[idx] + data[idx + 1] + data[idx + 2]) / 3; totalIntensity += intensity; pixelCount++; } } region.intensity = totalIntensity / pixelCount; }); return regions; } async function detectPatterns() { console.log('🎯 Detectando patrones...'); await new Promise(resolve => setTimeout(resolve, 1000)); const sensitivity = document.getElementById('sensitivity').value; const analysisType = document.getElementById('analysisType').value; // Simular detección de patrones basada en análisis de imagen const patterns = ANALYSIS_CONFIG.patterns; // Algoritmo simplificado de detección de patrones if (analysisType === 'comprehensive' || analysisType === 'patterns') { // Head and Shoulders patterns.head_shoulders.strength = calculatePatternProbability('head_shoulders', sensitivity); // Double Top/Bottom patterns.double_top.strength = calculatePatternProbability('double_top', sensitivity); patterns.double_bottom.strength = calculatePatternProbability('double_bottom', sensitivity); // Triangles and Wedges patterns.triangle.strength = calculatePatternProbability('triangle', sensitivity); patterns.wedge.strength = calculatePatternProbability('wedge', sensitivity); // Flags and Channels patterns.flag.strength = calculatePatternProbability('flag', sensitivity); patterns.channel.strength = calculatePatternProbability('channel', sensitivity); // Breakouts patterns.breakout.strength = calculatePatternProbability('breakout', sensitivity); } console.