---
id: "US-TRD-005"
title: "Agregar Simbolo a Watchlist"
type: "User Story"
status: "Done"
priority: "Alta"
epic: "OQI-003"
story_points: 2
created_date: "2025-12-05"
updated_date: "2026-01-04"
---

# US-TRD-005: Agregar Símbolo a Watchlist

## Metadata

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

---

## Historia de Usuario

**Como** trader,
**quiero** agregar símbolos de trading a mi watchlist,
**para** monitorear sus precios y movimientos en tiempo real desde un solo lugar.

## Descripción Detallada

El usuario debe poder buscar y agregar símbolos (BTCUSDT, ETHUSDT, etc.) a sus watchlists existentes. Los símbolos agregados mostrarán precio actual, cambio porcentual 24h, y volumen en tiempo real.

## Mockups/Wireframes

```
┌─────────────────────────────────────┐
│  My Crypto Portfolio 🔵             │
├─────────────────────────────────────┤
│  [+ Add Symbol] [⚙️]                │
│                                      │
│  ┌────────────────────────────────┐ │
│  │ ADD SYMBOL                     │ │
│  ├────────────────────────────────┤ │
│  │ Search:                        │ │
│  │ ┌────────────────────────────┐ │ │
│  │ │ BTC                        │ │ │
│  │ └────────────────────────────┘ │ │
│  │                                │ │
│  │ Results:                       │ │
│  │ ✓ BTCUSDT  Bitcoin/USDT        │ │
│  │   BTCBUSD  Bitcoin/BUSD        │ │
│  │   BTCEUR   Bitcoin/EUR         │ │
│  │                                │ │
│  │  [Cancel]     [Add]            │ │
│  └────────────────────────────────┘ │
│                                      │
│  Symbol       Price      Change     │
│  ──────────────────────────────────  │
│  BTCUSDT    $97,234.50   +2.34% ▲   │
│  ETHUSDT    $3,845.20    -0.45% ▼   │
│                                      │
└─────────────────────────────────────┘
```

---

## Criterios de Aceptación

**Escenario 1: Buscar y agregar símbolo**
```gherkin
DADO que el usuario tiene una watchlist "My Crypto Portfolio"
CUANDO hace click en "+ Add Symbol"
Y busca "BTC"
Y selecciona "BTCUSDT" de los resultados
Y hace click en "Add"
ENTONCES el símbolo BTCUSDT se agrega a la watchlist
Y aparece en la lista con precio en tiempo real
Y se muestra notificación "BTCUSDT added to watchlist"
```

**Escenario 2: Búsqueda con múltiples resultados**
```gherkin
DADO que el usuario busca "ETH"
CUANDO se muestran los resultados
ENTONCES aparecen múltiples opciones:
  - ETHUSDT
  - ETHBUSD
  - ETHBTC
Y puede seleccionar cualquiera de ellas
```

**Escenario 3: Símbolo ya existente**
```gherkin
DADO que la watchlist ya contiene "BTCUSDT"
CUANDO el usuario intenta agregar "BTCUSDT" nuevamente
ENTONCES se muestra mensaje "BTCUSDT already in this watchlist"
Y no se agrega duplicado
```

**Escenario 4: Actualización en tiempo real**
```gherkin
DADO que el usuario agregó BTCUSDT a la watchlist
CUANDO el precio cambia en el mercado
ENTONCES el precio se actualiza cada segundo
Y el cambio porcentual se recalcula
Y el color indica alza (verde) o baja (rojo)
```

**Escenario 5: Límite de símbolos**
```gherkin
DADO que la watchlist tiene 50 símbolos (límite máximo)
CUANDO el usuario intenta agregar otro símbolo
ENTONCES se muestra mensaje "Maximum 50 symbols per watchlist"
Y el botón "Add" está deshabilitado
```

## Criterios Adicionales

- [ ] Búsqueda con debounce de 300ms
- [ ] Mostrar icono del símbolo (logo)
- [ ] Click en símbolo abre chart
- [ ] Drag & drop para reordenar símbolos
- [ ] Tooltip con info adicional (market cap, volumen 24h)

---

## Tareas Técnicas

**Database:**
- [ ] DB-TRD-008: Crear tabla trading.watchlist_symbols
  - Campos: id, watchlist_id, symbol, position, created_at
- [ ] DB-TRD-009: Crear constraint unique (watchlist_id, symbol)

**Backend:**
- [ ] BE-TRD-026: Crear endpoint POST /trading/watchlists/:id/symbols
- [ ] BE-TRD-027: Crear endpoint GET /trading/symbols/search?q=BTC
- [ ] BE-TRD-028: Implementar WatchlistService.addSymbol()
- [ ] BE-TRD-029: Validar límite de 50 símbolos
- [ ] BE-TRD-030: Implementar búsqueda de símbolos
- [ ] BE-TRD-031: Crear endpoint DELETE /trading/watchlists/:id/symbols/:symbol

**Frontend:**
- [ ] FE-TRD-026: Crear componente AddSymbolDialog.tsx
- [ ] FE-TRD-027: Crear componente SymbolSearch.tsx
- [ ] FE-TRD-028: Crear componente WatchlistTable.tsx
- [ ] FE-TRD-029: Implementar hook useAddSymbol
- [ ] FE-TRD-030: Conectar WebSocket para precios en tiempo real
- [ ] FE-TRD-031: Implementar drag & drop con dnd-kit

**Tests:**
- [ ] TEST-TRD-013: Test unitario búsqueda de símbolos
- [ ] TEST-TRD-014: Test integración agregar símbolo
- [ ] TEST-TRD-015: Test E2E flujo completo

---

## Dependencias

**Depende de:**
- [ ] US-TRD-004: Crear watchlist - Estado: Pendiente
- [ ] US-TRD-001: Ver chart - Estado: Pendiente (para datos de precios)

**Bloquea:**
- Ninguna

---

## Notas Técnicas

**Endpoints involucrados:**
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | /trading/watchlists/:id/symbols | Agregar símbolo |
| DELETE | /trading/watchlists/:id/symbols/:symbol | Remover símbolo |
| GET | /trading/symbols/search | Buscar símbolos |
| GET | /trading/watchlists/:id/symbols | Listar símbolos de watchlist |
| WS | /trading/ticker/stream | Stream de precios |

**Entidades/Tablas:**
```sql
CREATE TABLE trading.watchlist_symbols (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  watchlist_id UUID NOT NULL REFERENCES trading.watchlists(id) ON DELETE CASCADE,
  symbol VARCHAR(20) NOT NULL,
  position INTEGER DEFAULT 0,
  created_at TIMESTAMP DEFAULT NOW(),
  CONSTRAINT unique_symbol_per_watchlist UNIQUE(watchlist_id, symbol)
);

CREATE INDEX idx_watchlist_symbols_watchlist_id ON trading.watchlist_symbols(watchlist_id);
```

**Componentes UI:**
- `AddSymbolDialog`: Modal de búsqueda y agregar
- `SymbolSearch`: Input de búsqueda con autocomplete
- `WatchlistTable`: Tabla de símbolos con precios
- `SymbolRow`: Fila individual de símbolo

**Request Body (Add Symbol):**
```typescript
{
  symbol: "BTCUSDT"
}
```

**Response:**
```typescript
{
  id: "uuid-1234",
  watchlistId: "uuid-5678",
  symbol: "BTCUSDT",
  position: 0,
  price: 97234.50,
  change24h: 2.34,
  volume24h: 28456789.45,
  createdAt: "2025-12-05T10:00:00Z"
}
```

**Search Response:**
```typescript
{
  symbols: [
    {
      symbol: "BTCUSDT",
      baseAsset: "BTC",
      quoteAsset: "USDT",
      name: "Bitcoin/USDT",
      price: 97234.50,
      volume24h: 28456789.45
    },
    {
      symbol: "BTCBUSD",
      baseAsset: "BTC",
      quoteAsset: "BUSD",
      name: "Bitcoin/BUSD",
      price: 97230.00,
      volume24h: 15234567.89
    }
  ]
}
```

**WebSocket (Price Updates):**
```typescript
{
  type: "ticker",
  data: {
    symbol: "BTCUSDT",
    price: 97234.50,
    change24h: 2.34,
    volume24h: 28456789.45,
    timestamp: 1733414400
  }
}
```

---

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