---
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).
