fad4006f60
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59 lines
2.2 KiB
Markdown
59 lines
2.2 KiB
Markdown
---
|
|
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).
|