---
id: "US-TRD-007"
title: "Crear Orden Limit"
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-007: Crear Orden Limit

## Metadata

| Campo | Valor |
|-------|-------|
| **ID** | US-TRD-007 |
| **É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 practicante,
**quiero** crear órdenes limit con un precio específico,
**para** ejecutar trades cuando el precio alcance mi nivel objetivo sin tener que monitorear constantemente.

## Descripción Detallada

El usuario debe poder crear órdenes limit que se ejecutarán automáticamente cuando el precio del mercado alcance el precio especificado. A diferencia de las órdenes market, las limit permiten control preciso del precio de entrada.

## Mockups/Wireframes

```
┌─────────────────────────────────────┐
│          ORDER PANEL                │
├─────────────────────────────────────┤
│  [  BUY  ] [  SELL  ]              │
├─────────────────────────────────────┤
│  Order Type:  [Limit ▼]             │
│                                      │
│  Limit Price (USD):                  │
│  ┌─────────────────────────────────┐│
│  │ 95,000.00                       ││
│  └─────────────────────────────────┘│
│  Current: $97,234.50 (-2.30%)       │
│                                      │
│  Amount (BTC):                       │
│  ┌─────────────────────────────────┐│
│  │ 0.1                             ││
│  └─────────────────────────────────┘│
│                                      │
│  ≈ $9,500.00 USD                    │
│                                      │
│  Available: $10,000.00              │
│  [25%] [50%] [75%] [100%]           │
│                                      │
│  ─────────────────────────────────  │
│  Time in Force: [GTC ▼]             │
│  (Good Till Cancelled)               │
│  ─────────────────────────────────  │
│                                      │
│  Est. Fee: $0.00                    │
│  Total: $9,500.00                   │
│                                      │
│  ┌─────────────────────────────────┐│
│  │   PLACE LIMIT BUY ORDER         ││
│  └─────────────────────────────────┘│
└─────────────────────────────────────┘
```

---

## Criterios de Aceptación

**Escenario 1: Crear orden limit buy exitosa**
```gherkin
DADO que el usuario tiene balance de $10,000
Y el precio actual de BTCUSDT es $97,234.50
CUANDO selecciona BUY
Y selecciona tipo "Limit"
Y ingresa precio limit de $95,000
Y ingresa cantidad de 0.1 BTC
Y hace click en "PLACE LIMIT BUY ORDER"
ENTONCES la orden se crea con estado "pending"
Y aparece en el panel de "Open Orders"
Y el balance reservado es $9,500.00
Y la orden se ejecutará cuando el precio baje a $95,000
```

**Escenario 2: Crear orden limit sell**
```gherkin
DADO que el usuario tiene una posición long de 0.1 BTC
Y el precio actual es $97,234.50
CUANDO selecciona SELL
Y selecciona tipo "Limit"
Y ingresa precio limit de $100,000
Y ingresa cantidad de 0.1 BTC
Y confirma la orden
ENTONCES se crea orden limit sell pendiente
Y la posición queda reservada
Y se ejecutará cuando el precio suba a $100,000
```

**Escenario 3: Precio limit inválido para buy**
```gherkin
DADO que el precio actual es $97,234.50
CUANDO el usuario crea orden limit BUY
Y ingresa precio $100,000 (mayor al actual)
ENTONCES se muestra warning "Limit buy price should be below current price"
Y permite continuar (puede ser intencional)
```

**Escenario 4: Ejecución automática de orden limit**
```gherkin
DADO que existe orden limit BUY a $95,000
CUANDO el precio de mercado baja a $95,000
ENTONCES la orden se ejecuta automáticamente
Y se crea una posición long de 0.1 BTC
Y la orden pasa de "pending" a "filled"
Y se envía notificación "Limit order filled at $95,000"
```

**Escenario 5: Cancelar orden limit pendiente**
```gherkin
DADO que el usuario tiene orden limit pendiente
CUANDO hace click en "Cancel" en Open Orders
ENTONCES la orden cambia a estado "cancelled"
Y el balance reservado se libera
Y desaparece del panel de Open Orders
```

## Criterios Adicionales

- [ ] Validar precio mínimo ($10 USD)
- [ ] Time in Force: GTC (Good Till Cancelled), IOC (Immediate or Cancel)
- [ ] Mostrar línea horizontal en chart con precio limit
- [ ] Preview del precio en relación al precio actual
- [ ] Notificación push cuando se ejecuta

---

## Tareas Técnicas

**Database:**
- [ ] DB-TRD-010: Añadir tipo "limit" a paper_orders
- [ ] DB-TRD-011: Añadir campos limit_price, time_in_force

**Backend:**
- [ ] BE-TRD-032: Actualizar endpoint POST /trading/paper/orders para limit
- [ ] BE-TRD-033: Implementar OrderService.createLimitOrder()
- [ ] BE-TRD-034: Implementar OrderMatchingService para monitorear precios
- [ ] BE-TRD-035: Crear job que verifica órdenes limit cada segundo
- [ ] BE-TRD-036: Implementar lógica de ejecución automática
- [ ] BE-TRD-037: Crear endpoint DELETE /trading/paper/orders/:id (cancelar)

**Frontend:**
- [ ] FE-TRD-032: Actualizar OrderPanel con tipo limit
- [ ] FE-TRD-033: Crear componente LimitPriceInput.tsx
- [ ] FE-TRD-034: Crear componente TimeInForceSelector.tsx
- [ ] FE-TRD-035: Crear componente OpenOrdersPanel.tsx
- [ ] FE-TRD-036: Añadir línea horizontal en chart para órdenes limit
- [ ] FE-TRD-037: Implementar hook useCancelOrder

**Tests:**
- [ ] TEST-TRD-016: Test unitario OrderMatchingService
- [ ] TEST-TRD-017: Test integración crear/ejecutar orden limit
- [ ] TEST-TRD-018: Test E2E flujo completo limit order

---

## Dependencias

**Depende de:**
- [ ] US-TRD-006: Crear orden market - Estado: Pendiente
- [ ] US-TRD-001: Ver chart - Estado: Pendiente

**Bloquea:**
- Ninguna

---

## Notas Técnicas

**Endpoints involucrados:**
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | /trading/paper/orders | Crear orden limit |
| GET | /trading/paper/orders | Listar órdenes pendientes |
| DELETE | /trading/paper/orders/:id | Cancelar orden |
| PATCH | /trading/paper/orders/:id | Modificar orden |

**Entidades/Tablas:**
```sql
ALTER TABLE trading.paper_orders ADD COLUMN limit_price DECIMAL(20, 8);
ALTER TABLE trading.paper_orders ADD COLUMN time_in_force VARCHAR(10) DEFAULT 'GTC';
```

**Estados de orden:**
- `pending`: Esperando ejecución
- `filled`: Ejecutada completamente
- `partially_filled`: Ejecutada parcialmente
- `cancelled`: Cancelada por usuario
- `expired`: Expiró (para IOC, FOK)

**Componentes UI:**
- `LimitPriceInput`: Input con validación de precio
- `TimeInForceSelector`: Dropdown de TIF
- `OpenOrdersPanel`: Panel de órdenes pendientes
- `OrderLine`: Línea horizontal en chart

**Request Body:**
```typescript
{
  symbol: "BTCUSDT",
  side: "buy",
  type: "limit",
  quantity: 0.1,
  limitPrice: 95000.00,
  timeInForce: "GTC"
}
```

**Response:**
```typescript
{
  order: {
    id: "uuid",
    symbol: "BTCUSDT",
    side: "buy",
    type: "limit",
    status: "pending",
    quantity: 0.1,
    limitPrice: 95000.00,
    timeInForce: "GTC",
    createdAt: "2025-12-05T...",
    expiresAt: null
  },
  balance: {
    balance: 500.00,
    reserved: 9500.00,
    equity: 10000.00
  }
}
```

**Order Matching Logic:**
```typescript
// Para órdenes BUY limit
if (currentPrice <= order.limitPrice) {
  executeOrder(order, currentPrice);
}

// Para órdenes SELL limit
if (currentPrice >= order.limitPrice) {
  executeOrder(order, currentPrice);
}
```

**Time in Force opciones:**
- **GTC** (Good Till Cancelled): Permanece activa hasta ejecutarse o cancelarse
- **IOC** (Immediate or Cancel): Se ejecuta inmediatamente o se cancela
- **FOK** (Fill or Kill): Se ejecuta completamente o se cancela

---

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