--- id: "US-ML-006" title: "Integrar Señales en Chart" type: "User Story" status: "Done" priority: "Media" epic: "OQI-006" project: "trading-platform" story_points: 3 created_date: "2025-12-05" updated_date: "2026-01-04" --- # US-ML-006: Integrar Señales en Chart ## Metadata | Campo | Valor | |-------|-------| | **ID** | US-ML-006 | | **Épica** | OQI-006 - Señales ML y Predicciones | | **Módulo** | ml-signals + trading-charts | | **Prioridad** | P0 | | **Story Points** | 5 | | **Sprint** | Sprint 7 | | **Estado** | Pendiente | | **Asignado a** | Por asignar | --- ## Historia de Usuario **Como** trader/inversor, **quiero** ver las señales de trading, niveles de TP/SL y predicciones directamente sobre el gráfico de velas, **para** visualizar de forma integrada el contexto del mercado y las recomendaciones del ML. ## Descripción Detallada El usuario debe poder visualizar directamente en el chart de TradingView/Lightweight Charts: - Marcadores de señales BUY/SELL en el punto de entrada - Líneas horizontales para TP1, TP2, TP3 y Stop Loss - Rangos de predicción (High/Low esperados) como bandas - Labels con información contextual - Todo integrado de forma limpia y no invasiva ## Mockups/Wireframes ``` ┌─────────────────────────────────────────────────────────────────────┐ │ BTCUSDT $89,400.00 +2.34% ▲ [1h] [ML Signals ON 🔘] │ ├─────────────────────────────────────────────────────────────────────┤ │ Chart + ML Overlay │ │ │ │ $92,000 ┼─────────────────────────────────────────────────────────│ │ │ │ │ $91,000 ┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ TP3: $89,900 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ (Green) │ │ │╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ TP2: $89,775 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ │ │ $90,000 ┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ TP1: $89,650 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ │ │ │ ▲ │ │ │ ████ │ ████ ████ │ │ │ ████ │ ████ ████ ████ [Predicted High] │ │ $89,400 ┼──────────●──────────────────────────────────────────── │ │ │ ENTRY 🟢 BUY (75% conf) │ │ │ ████ ████ ████ │ │ │ ████ ████ ████ ████ [Predicted Low] │ │ $89,000 ┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ SL: $89,150 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ (Red) │ │ │ │ │ $88,000 ┼─────────────────────────────────────────────────────────│ │ │ │ Legend: │ │ 🟢 BUY Signal 🔴 SELL Signal ─── Take Profit ─── Stop Loss │ │ ░░░ Predicted Range (30 min Scalping) │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## Criterios de Aceptación **Escenario 1: Ver señal BUY en chart** ```gherkin DADO que existe una señal BUY activa para BTCUSDT Y el usuario está viendo el chart de BTCUSDT Y "ML Signals" está activado (toggle ON) CUANDO el chart renderiza ENTONCES se muestra: - Marcador 🟢 en el precio de entrada (vela actual) - Label "BUY 75%" junto al marcador - Línea horizontal verde punteada para TP1 - Línea horizontal verde punteada para TP2 - Línea horizontal verde punteada para TP3 - Línea horizontal roja punteada para Stop Loss - Labels en cada línea ("TP1: $89,650", "SL: $89,150") ``` **Escenario 2: Ver rango de predicción** ```gherkin DADO que el usuario activó "Show Prediction Range" Y existe una predicción para Scalping (30 min) CUANDO el chart renderiza ENTONCES se muestra: - Banda superior en predicted_high (color verde transparente) - Banda inferior en predicted_low (color rojo transparente) - Fill entre bandas con color neutro (gris transparente) - Label "30 min range (69% conf)" en la banda ``` **Escenario 3: Toggle ON/OFF de señales** ```gherkin DADO que el usuario está viendo el chart CUANDO hace click en el toggle "ML Signals" ENTONCES: - Si OFF → ON: Se muestran todas las overlays (señales, TP/SL, rangos) - Si ON → OFF: Se ocultan todas las overlays - El estado persiste en localStorage ``` **Escenario 4: Señal SELL en chart** ```gherkin DADO que existe una señal SELL activa CUANDO el chart renderiza con ML Signals ON ENTONCES se muestra: - Marcador 🔴 en el precio de entrada - Label "SELL 68%" - TP1, TP2, TP3 en precios MENORES (líneas verdes hacia abajo) - Stop Loss en precio MAYOR (línea roja hacia arriba) ``` **Escenario 5: Actualización en tiempo real** ```gherkin DADO que el usuario está viendo el chart con ML Signals ON CUANDO se cierra una nueva vela de 5 minutos Y se genera una nueva señal o actualiza la predicción ENTONCES las overlays se actualizan automáticamente Y se muestra una animación suave de transición Y no se recarga todo el chart (solo las overlays) ``` **Escenario 6: Hover sobre línea de TP/SL** ```gherkin DADO que el usuario está viendo el chart con señales CUANDO pasa el cursor sobre una línea de TP1 ENTONCES se muestra tooltip con: - "Take Profit 1" - Precio: $89,650.00 - % desde entrada: +0.28% - "Conservative target" ``` ## Criterios Adicionales - [ ] Las overlays no deben interferir con las velas del chart - [ ] Los colores deben ser consistentes con el tema de la app - [ ] Debe funcionar en modo claro y oscuro - [ ] Las líneas deben ser no editables (solo visualización) - [ ] El toggle debe estar en el header del chart, bien visible --- ## Tareas Técnicas **Backend:** - No requiere cambios (usa endpoints existentes) **Frontend:** - [ ] FE-ML-020: Crear `ChartMLOverlay.tsx` (container de overlays) - [ ] FE-ML-021: Implementar `addSignalMarker()` en Lightweight Charts - [ ] FE-ML-022: Implementar `addPriceLine()` para TP/SL - [ ] FE-ML-023: Implementar `addPredictionBand()` para rangos - [ ] FE-ML-024: Crear toggle "ML Signals" en ChartHeader - [ ] FE-ML-025: Integrar WebSocket updates con chart overlays - [ ] FE-ML-026: Implementar tooltips para líneas - [ ] FE-ML-027: Persistir estado del toggle en localStorage **Tests:** - [ ] TEST-ML-010: Test unitario de posicionamiento de marcadores - [ ] TEST-ML-011: Test de renderizado de overlays - [ ] TEST-ML-012: Test E2E de toggle ML Signals ON/OFF --- ## Dependencias **Depende de:** - [ ] US-TRD-001: Ver chart - Estado: ✅ Completado - [ ] US-ML-001: Ver predicción - Estado: Pendiente - [ ] US-ML-002: Ver señal - Estado: Pendiente **Bloquea:** - Ninguna (historia final de la cadena) --- ## Notas Técnicas **Lightweight Charts API - Price Lines:** ```typescript // Agregar línea de Take Profit const tp1Line = series.createPriceLine({ price: 89650.00, color: '#22c55e', lineWidth: 2, lineStyle: LineStyle.Dashed, axisLabelVisible: true, title: 'TP1: $89,650', }); // Agregar línea de Stop Loss const slLine = series.createPriceLine({ price: 89150.00, color: '#ef4444', lineWidth: 2, lineStyle: LineStyle.Dashed, axisLabelVisible: true, title: 'SL: $89,150', }); ``` **Lightweight Charts API - Markers:** ```typescript // Agregar marcador de señal BUY series.setMarkers([ { time: currentTime, position: 'belowBar', color: '#22c55e', shape: 'arrowUp', text: 'BUY 75%', } ]); // Marcador de señal SELL series.setMarkers([ { time: currentTime, position: 'aboveBar', color: '#ef4444', shape: 'arrowDown', text: 'SELL 68%', } ]); ``` **Lightweight Charts API - Series de Bandas:** ```typescript // Agregar banda de predicción const predictionSeries = chart.addAreaSeries({ topColor: 'rgba(34, 197, 94, 0.2)', bottomColor: 'rgba(239, 68, 68, 0.2)', lineColor: 'rgba(156, 163, 175, 0.5)', lineWidth: 1, }); predictionSeries.setData([ { time: currentTime + 300, value: predictedHigh }, { time: currentTime + 1800, value: predictedHigh }, ]); ``` **Componentes UI:** - `ChartMLOverlay`: Gestor de todas las overlays ML - `MLToggle`: Switch para activar/desactivar overlays - `SignalMarker`: Lógica de marcadores de señales - `PriceLevels`: Lógica de líneas TP/SL - `PredictionBands`: Lógica de bandas de predicción **Estado (Zustand) - Integración con Chart Store:** ```typescript interface ChartStore { // ... existing chart state mlOverlaysEnabled: boolean; activeSignal: TradingSignal | null; prediction: Prediction | null; toggleMLOverlays: () => void; updateMLOverlays: () => void; } ``` **LocalStorage:** ```typescript // Persistir estado del toggle const ML_OVERLAYS_KEY = 'orbiquant:ml-overlays-enabled'; localStorage.setItem(ML_OVERLAYS_KEY, String(enabled)); ``` --- ## Definition of Ready (DoR) - [x] Historia claramente escrita (quién, qué, por qué) - [x] Criterios de aceptación definidos - [x] Story points estimados - [x] Dependencias identificadas - [ ] Sin bloqueadores (depende de US-ML-001 y US-ML-002) - [x] Diseño/mockup disponible - [x] Documentación de Lightweight Charts API revisada ## Definition of Done (DoD) - [ ] Código implementado según criterios - [ ] Tests unitarios escritos y pasando - [ ] Tests E2E pasando - [ ] Code review aprobado - [ ] Documentación actualizada - [ ] QA aprobado en staging - [ ] Funciona en light/dark mode - [ ] Toggle persiste estado correctamente - [ ] Overlays no interfieren con interactividad del chart - [ ] Desplegado en producción --- ## Historial de Cambios | Fecha | Cambio | Autor | |-------|--------|-------| | 2025-12-05 | Creación | Requirements-Analyst | --- **Creada por:** Requirements-Analyst **Fecha:** 2025-12-05 **Última actualización:** 2025-12-05