--- id: "RF-TRD-003" title: "Gestion de Watchlists" type: "Requirement" status: "Done" priority: "Alta" module: "trading" epic: "OQI-003" version: "1.0" created_date: "2025-12-05" updated_date: "2026-01-04" --- # RF-TRD-003: Gestión de Watchlists **Versión:** 1.0.0 **Fecha:** 2025-12-05 **Épica:** OQI-003 - Trading y Charts **Prioridad:** P1 **Story Points:** 5 --- ## Descripción El sistema debe permitir a los usuarios crear y gestionar listas de vigilancia (watchlists) personalizadas para hacer seguimiento de múltiples activos de manera organizada y eficiente. --- ## Requisitos Funcionales ### RF-TRD-003.1: Crear Watchlists El sistema debe permitir: - Crear watchlists con nombres personalizados - Establecer una watchlist como favorita - Crear máximo 10 watchlists por usuario - Nombrar watchlists con 3-50 caracteres - Asignar iconos/colores a watchlists (opcional) ### RF-TRD-003.2: Gestionar Símbolos El sistema debe permitir: - Añadir símbolos a una watchlist - Eliminar símbolos de una watchlist - Reordenar símbolos con drag & drop - Buscar símbolos para añadir - Máximo 50 símbolos por watchlist - Un símbolo puede estar en múltiples watchlists ### RF-TRD-003.3: Visualización El sistema debe mostrar para cada símbolo: | Campo | Descripción | Formato | |-------|-------------|---------| | Symbol | Par de trading | BTCUSDT | | Last Price | Precio actual | $50,234.56 | | 24h Change | Variación 24h | +4.23% | | 24h High | Máximo 24h | $51,000.00 | | 24h Low | Mínimo 24h | $48,500.00 | | Volume | Volumen 24h | 1.2B | ### RF-TRD-003.4: Actualización en Tiempo Real El sistema debe: - Actualizar precios cada 1 segundo vía WebSocket - Mostrar animación flash en cambios de precio - Indicar dirección con colores (verde/rojo) - Mostrar sparkline (mini-gráfico) de 24h ### RF-TRD-003.5: Filtros y Ordenamiento El sistema debe permitir ordenar por: - Nombre del símbolo (A-Z, Z-A) - Precio (mayor a menor, menor a mayor) - Variación 24h (mayor a menor, menor a mayor) - Volumen (mayor a menor, menor a mayor) - Orden personalizado (drag & drop) El sistema debe permitir filtrar por: - Búsqueda por nombre/símbolo - Solo ganadores (change > 0) - Solo perdedores (change < 0) - Variación > X% ### RF-TRD-003.6: Watchlist por Defecto El sistema debe: - Crear watchlist "My Favorites" automáticamente - Incluir por defecto: BTCUSDT, ETHUSDT, BNBUSDT - Permitir cambiar watchlist por defecto ### RF-TRD-003.7: Acciones Rápidas El sistema debe permitir desde la watchlist: - Click en símbolo → abrir chart - Botón "Trade" → abrir formulario de orden - Botón "Alert" → crear alerta de precio - Click derecho → menú contextual --- ## Datos de Entrada ### Crear Watchlist ```typescript interface CreateWatchlistDto { name: string; // 3-50 caracteres description?: string; icon?: string; // Emoji o nombre de icono color?: string; // Hex color symbols?: string[]; // Símbolos iniciales } ``` ### Añadir Símbolo ```typescript interface AddSymbolToWatchlistDto { watchlistId: string; symbol: string; position?: number; // Para insertar en posición específica } ``` --- ## Datos de Salida ### Watchlist ```typescript interface Watchlist { id: string; userId: string; name: string; description: string | null; icon: string | null; color: string | null; isDefault: boolean; isFavorite: boolean; symbols: WatchlistSymbol[]; createdAt: string; updatedAt: string; } interface WatchlistSymbol { symbol: string; position: number; addedAt: string; // Datos en tiempo real lastPrice: number; priceChange24h: number; priceChangePercent24h: number; high24h: number; low24h: number; volume24h: number; sparkline: number[]; // Últimas 24 precios horarios } ``` --- ## Reglas de Negocio 1. **Límite de watchlists:** Máximo 10 por usuario 2. **Límite de símbolos:** Máximo 50 por watchlist 3. **Nombre único:** No pueden existir 2 watchlists con mismo nombre 4. **Watchlist por defecto:** Siempre debe haber una marcada como default 5. **Eliminación:** No se puede eliminar la última watchlist 6. **Símbolos válidos:** Solo se pueden añadir símbolos activos en Binance 7. **Performance:** Limitar updates a símbolos visibles en viewport --- ## Criterios de Aceptación ```gherkin Escenario: Usuario crea nueva watchlist DADO que el usuario tiene menos de 10 watchlists CUANDO crea watchlist "DeFi Coins" ENTONCES la watchlist aparece en el listado Y está vacía inicialmente Y se puede seleccionar para ver/editar Escenario: Usuario añade símbolos a watchlist DADO que el usuario tiene watchlist "DeFi Coins" CUANDO busca "AAVE" y lo añade ENTONCES AAVEUSDT aparece en la watchlist Y muestra precio actual y variación 24h Y el precio se actualiza en tiempo real Escenario: Usuario reordena símbolos DADO que la watchlist tiene múltiples símbolos CUANDO arrastra BTC a la primera posición ENTONCES BTC aparece primero Y el orden se persiste al recargar Escenario: Usuario alcanza límite de watchlists DADO que el usuario tiene 10 watchlists CUANDO intenta crear una nueva ENTONCES el sistema muestra "Límite de 10 watchlists alcanzado" Y sugiere eliminar una existente Escenario: Usuario filtra por ganadores DADO que la watchlist tiene 20 símbolos Y 12 tienen variación positiva CUANDO activa filtro "Solo ganadores" ENTONCES solo muestra los 12 símbolos con change > 0 Y están ordenados por mayor ganancia Escenario: Usuario abre chart desde watchlist DADO que el usuario ve watchlist CUANDO hace click en "BTCUSDT" ENTONCES se abre el chart de BTCUSDT Y mantiene la watchlist visible en sidebar ``` --- ## Estados del Sistema ``` ┌─────────────────────────────────────────┐ │ GESTIÓN WATCHLISTS │ ├─────────────────────────────────────────┤ │ │ │ [+ Nueva Watchlist] │ │ │ │ ┌─────────────────────────────────┐ │ │ │ ⭐ My Favorites [Edit] │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ BTCUSDT $50,234 +2.3% ▲ │ │ │ │ │ │ ETHUSDT $3,456 -1.2% ▼ │ │ │ │ │ └─────────────────────────────┘ │ │ │ └─────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────┐ │ │ │ 🔥 Top Movers [Edit] │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ SOLUSDT $234 +15.4% ▲ │ │ │ │ │ │ AVAXUSDT $45 +8.2% ▲ │ │ │ │ │ └─────────────────────────────┘ │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` --- ## Dependencias - RF-TRD-001: Charts (para abrir gráficos) - Binance API para datos de mercado - WebSocket para precios en tiempo real --- ## Notas Técnicas - Implementar virtualización para listas grandes (react-window) - Usar WebSocket con throttling para updates masivos - Cachear datos de símbolos por 5 segundos - Implementar optimistic UI para reordenamiento - Persistir en base de datos con índices en userId - Considerar Redis para datos en tiempo real - Implementar debounce en búsqueda de símbolos --- ## Optimizaciones de Performance 1. **Virtual scrolling:** Solo renderizar símbolos visibles 2. **Batch updates:** Agrupar updates de precios cada 1s 3. **Lazy loading:** Cargar sparklines solo al hover 4. **Memoization:** React.memo para componentes de símbolo 5. **WebSocket selective:** Solo suscribirse a símbolos de watchlist activa --- ## Referencias - [TradingView Watchlists](https://www.tradingview.com/support/solutions/43000681733-watchlists/) - [Binance Ticker API](https://binance-docs.github.io/apidocs/spot/en/#symbol-price-ticker)