---
id: "US-TRD-003"
title: "Agregar Indicador Tecnico al Chart"
type: "User Story"
status: "Done"
priority: "Alta"
epic: "OQI-003"
story_points: 5
created_date: "2025-12-05"
updated_date: "2026-01-04"
---

# US-TRD-003: Agregar Indicador Técnico al Chart

## Metadata

| Campo | Valor |
|-------|-------|
| **ID** | US-TRD-003 |
| **Épica** | OQI-003 - Trading y Charts |
| **Módulo** | trading |
| **Prioridad** | P1 |
| **Story Points** | 3 |
| **Sprint** | Sprint 4 |
| **Estado** | Pendiente |
| **Asignado a** | Por asignar |

---

## Historia de Usuario

**Como** trader,
**quiero** agregar indicadores técnicos al chart (SMA, EMA, RSI, MACD, Bollinger Bands),
**para** realizar análisis técnico avanzado y tomar decisiones informadas.

## Descripción Detallada

El usuario debe poder seleccionar y agregar diferentes indicadores técnicos al chart. Los indicadores se calculan en tiempo real y se superponen o muestran en paneles separados según su tipo.

## Mockups/Wireframes

```
┌─────────────────────────────────────────────────────────────────┐
│  BTCUSDT   $97,234.50   +2.34% ▲                               │
├─────────────────────────────────────────────────────────────────┤
│  [1m] [5m] [15m] [1h] [4h] [1D] [1W]    [Indicators ▼]        │
│                                          └──────────────────┐   │
│                                          │ SMA (20)     [x]│   │
│                                          │ EMA (50)     [x]│   │
│                                          │─────────────────│   │
│                                          │ + Add Indicator │   │
│                                          │  > Moving Avg   │   │
│                                          │  > Oscillators  │   │
│                                          │  > Volatility   │   │
│                                          └─────────────────┘   │
├─────────────────────────────────────────────────────────────────┤
│                    ████ (Price)                                 │
│    ████            ████                                         │
│    ████  ████      ████  ════ (SMA 20 - Blue line)             │
│    ████  ████  ════════  ════                                   │
│  ══════  ════  ════ ████  ════  ──── (EMA 50 - Orange line)    │
│  ──────  ────  ──── ────  ────  ────                            │
│                                                                  │
├─────────────────────────────────────────────────────────────────┤
│  RSI (14)                                           [x]         │
│  70 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ Overbought                       │
│     ════════════════════════                                    │
│  30 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ Oversold                         │
└─────────────────────────────────────────────────────────────────┘
```

---

## Criterios de Aceptación

**Escenario 1: Agregar SMA (Simple Moving Average)**
```gherkin
DADO que el usuario está viendo el chart
CUANDO hace click en "Indicators"
Y selecciona "Moving Average > SMA"
Y configura periodo 20
Y confirma
ENTONCES se dibuja una línea azul con SMA(20) sobre el chart
Y aparece "SMA (20)" en la lista de indicadores activos
Y el indicador se actualiza en tiempo real
```

**Escenario 2: Agregar RSI en panel separado**
```gherkin
DADO que el usuario tiene el chart abierto
CUANDO agrega el indicador "RSI"
Y configura periodo 14
ENTONCES se crea un nuevo panel debajo del chart principal
Y se muestra RSI(14) con líneas en 30 y 70
Y el panel RSI sincroniza el scroll con el chart principal
```

**Escenario 3: Agregar múltiples indicadores**
```gherkin
DADO que el usuario tiene SMA(20) activo
CUANDO agrega EMA(50)
ENTONCES ambos indicadores se muestran en el chart
Y cada uno tiene diferente color
Y no se superponen de forma confusa
```

**Escenario 4: Configurar parámetros de indicador**
```gherkin
DADO que el usuario selecciona agregar MACD
CUANDO se abre el diálogo de configuración
ENTONCES puede modificar:
  - Fast period (default: 12)
  - Slow period (default: 26)
  - Signal period (default: 9)
Y puede cambiar el color de las líneas
```

**Escenario 5: Eliminar indicador**
```gherkin
DADO que el usuario tiene RSI(14) activo
CUANDO hace click en el botón [x] junto a "RSI (14)"
ENTONCES el indicador se elimina del chart
Y el panel RSI desaparece
Y el chart principal se expande
```

## Criterios Adicionales

- [ ] Máximo 5 indicadores simultáneos
- [ ] Tooltip mostrando valor del indicador al pasar cursor
- [ ] Persistir indicadores seleccionados por usuario
- [ ] Preset de indicadores populares (ej: "Scalping Setup")
- [ ] Colores diferenciados automáticamente

---

## Tareas Técnicas

**Database:**
- [ ] DB-TRD-005: Añadir campo indicators a user_chart_preferences

**Backend:**
- [ ] BE-TRD-015: Crear endpoint POST /trading/indicators/calculate
- [ ] BE-TRD-016: Implementar cálculo de SMA
- [ ] BE-TRD-017: Implementar cálculo de EMA
- [ ] BE-TRD-018: Implementar cálculo de RSI
- [ ] BE-TRD-019: Implementar cálculo de MACD
- [ ] BE-TRD-020: Implementar cálculo de Bollinger Bands

**Frontend:**
- [ ] FE-TRD-015: Crear componente IndicatorSelector.tsx
- [ ] FE-TRD-016: Crear componente IndicatorConfigDialog.tsx
- [ ] FE-TRD-017: Crear componente IndicatorPanel.tsx (para RSI, MACD)
- [ ] FE-TRD-018: Implementar overlays en Lightweight Charts
- [ ] FE-TRD-019: Implementar hook useIndicators
- [ ] FE-TRD-020: Añadir indicators a tradingStore

**Tests:**
- [ ] TEST-TRD-007: Test unitario cálculos de indicadores
- [ ] TEST-TRD-008: Test integración endpoint indicators
- [ ] TEST-TRD-009: Test E2E agregar/eliminar indicadores

---

## Dependencias

**Depende de:**
- [ ] US-TRD-001: Ver chart - Estado: Pendiente
- [ ] US-TRD-002: Cambiar timeframe - Estado: Pendiente

**Bloquea:**
- Ninguna

---

## Notas Técnicas

**Endpoints involucrados:**
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | /trading/indicators/calculate | Calcular indicador |
| GET | /trading/indicators/presets | Obtener presets de indicadores |

**Entidades/Tablas:**
- `trading.user_chart_preferences`: JSON field indicators

**Componentes UI:**
- `IndicatorSelector`: Dropdown de indicadores
- `IndicatorConfigDialog`: Modal de configuración
- `IndicatorPanel`: Panel separado para oscillators
- `IndicatorOverlay`: Línea sobre chart principal

**Indicadores disponibles:**
```typescript
const INDICATORS = {
  movingAverage: {
    sma: { name: 'SMA', defaultPeriod: 20, type: 'overlay' },
    ema: { name: 'EMA', defaultPeriod: 50, type: 'overlay' }
  },
  oscillators: {
    rsi: { name: 'RSI', defaultPeriod: 14, type: 'panel' },
    macd: { name: 'MACD', params: [12, 26, 9], type: 'panel' }
  },
  volatility: {
    bb: { name: 'Bollinger Bands', params: [20, 2], type: 'overlay' }
  }
};
```

**Request Body (Calculate Indicator):**
```typescript
{
  symbol: "BTCUSDT",
  interval: "1h",
  indicator: "sma",
  params: {
    period: 20
  }
}
```

**Response:**
```typescript
{
  indicator: "sma",
  params: { period: 20 },
  data: [
    { time: 1733414400, value: 96850.25 },
    { time: 1733418000, value: 96920.50 },
    // ... más puntos
  ]
}
```

**Fórmulas:**
- **SMA**: Sum(Close, period) / period
- **EMA**: (Close - EMA_prev) * (2 / (period + 1)) + EMA_prev
- **RSI**: 100 - (100 / (1 + RS)), donde RS = Avg Gain / Avg Loss
- **MACD**: EMA(12) - EMA(26), Signal: EMA(MACD, 9)
- **BB**: SMA ± (StdDev * 2)

---

## Definition of Ready (DoR)

- [x] Historia claramente escrita
- [x] Criterios de aceptación definidos
- [x] Story points estimados
- [x] Dependencias identificadas
- [x] Sin bloqueadores
- [ ] Diseño/mockup disponible
- [ ] API spec disponible

## Definition of Done (DoD)

- [ ] Código implementado según criterios
- [ ] Tests unitarios escritos y pasando
- [ ] Tests de integración pasando
- [ ] Code review aprobado
- [ ] Documentación actualizada
- [ ] QA aprobado
- [ ] Desplegado en ambiente de pruebas

---

## 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
