--- id: "0088e" title: "Trading: capability group `strategy` + Strategy contract" status: pendiente type: feature domain: - trading - meta scope: multi-app priority: alta depends: [] blocks: [] related: [] created: 2026-05-17 updated: 2026-05-17 tags: [] --- # 0088e — Trading: capability group `strategy` + Strategy contract **Status:** pendiente **Created:** 2026-05-14 **Type:** feature **Parent:** 0088 **Depends:** 0088a **Blocks:** 0088g, 0088h ## Problema No hay contrato de estrategia. Sin contrato cada estrategia se cablea distinto y backtester/live_runner no pueden tratarlas uniformemente. El contrato debe ser **puro**: entrada = market state + portfolio state + params; salida = lista de `OrderIntent` (no efectos). ## Piezas 1. Tipos del registry en `python/types/finance/`: - `MarketSnapshot` (OHLCV ventana + last_price + ts). - `PortfolioSnapshot` (balance + positions). - `StrategyParams` (dict tipado por estrategia, validado via JSON Schema). - `OrderIntent` (lado, qty, instrument, kind=market/limit, price_limit, ttl, reason). 2. Contrato Strategy (Python protocol): ``` def decide(market: MarketSnapshot, portfolio: PortfolioSnapshot, params: StrategyParams) -> list[OrderIntent] ``` Funcion **pura**. Sin I/O, sin random sin semilla, sin tiempo system. 3. Dos estrategias de referencia (puras): - `strategy_sma_cross_py_finance` (SMA rapida/lenta cross → entry/exit). - `strategy_rsi_meanrev_py_finance` (RSI < 30 → long, > 70 → short con caps). 4. Funcion `validate_strategy_output_py_finance(intents, portfolio, params)` que aplica sanity (qty>0, instrumento valido, no oversize) antes de pasar a risk. 5. Tag `strategy`. Pagina madre `docs/capabilities/strategy.md` con ejemplo canonico end-to-end (snapshot fake → decide → list[intent]). 6. Tests deterministicos: dado snapshot fijado, `decide` retorna lo esperado. ## Aceptacion - `mcp__registry__fn_search query="" tag="strategy"` devuelve interface + >= 2 estrategias. - Tests pasan en `go test`/`pytest`. - Estrategias son puras: `purity: pure` en frontmatter; sin imports impuros. ## No-objetivos - Estrategias optimizadas, backtest report (sale a 0088g), parametrizacion via UI (analysis/strategy_lab futuro).