🎯 Estrategia Donchian — Backtest 16 ETFs

Análisis completo de 48 combinaciones (16 ETFs × 3 timeframes)

🐛 Bugs Detectados en PineScript Original

1. Take Profit Flotante
ALTA

El TP se recalcula en cada barra, permitiendo que el precio "escape" del objetivo. Debería fijarse al entrar.

2. Trailing Stop No Se Resetea
ALTA

La variable `trailing_stop` persiste entre operaciones, causando salidas prematuras en nuevas entradas.

3. 100% del Capital en Cada Operación
ALTA

No hay gestión de posición. El código usa todo el capital disponible, exponiendo a riesgo máximo.

4. Race Condition SL/TP
MEDIA

SL y TP se evalúan en el mismo bloque if/else. Si ambos se activan, solo se ejecuta el primero, ignorando el más relevante.

5. RSI Demasiado Permisivo
MEDIA

RSI > 50 permite entrar en zonas de sobrecompra (>70), aumentando falsas señales en rangos laterales.

6. Sin Control de Drawdown Máximo
MEDIA

No hay límite para pérdidas acumuladas. Una racha negativa puede agotar el capital sin protección.

7. Sin Límite de Operaciones Diarias
BAJA

En mercados volátiles puede abrir/cerrar múltiples veces en un día, generando comisiones excesivas.

📝 PineScript: Original vs Corregido

❌ Original (Buggy)

// Take profit flotante
if in_long
    take_profit_level := high + (high - low) * 1.5
    strategy.exit("TP", "Long", limit=take_profit_level)

// Trailing stop no reseteado
var float trailing_stop = na
if in_long and close > entry_price * 1.02
    trailing_stop := close * 0.98

// Sin gestión de posición
strategy.entry("Long", strategy.long)

// Race condition
if close <= stop_loss_level
    strategy.close("Long")
else if close >= take_profit_level
    strategy.close("Long")

// RSI permisivo
rsi_ok = ta.rsi(close, 14) > 50

✅ Corregido

// TP fijo al entrar
var float take_profit_level = na
if not in_long and long_condition
    take_profit_level := close * 1.03

// Trailing stop reseteado
var float trailing_stop = na
if not in_long
    trailing_stop := na
if in_long and close > entry_price * 1.02
    trailing_stop := math.max(trailing_stop, close * 0.98)

// Gestión de posición (2% del capital)
position_size = strategy.equity * 0.02 / close
strategy.entry("Long", strategy.long, qty=position_size)

// Prioridad a SL/TP más cercano
sl_distance = math.abs(close - stop_loss_level)
tp_distance = math.abs(close - take_profit_level)
if sl_distance < tp_distance and close <= stop_loss_level
    strategy.close("Long")
else if close >= take_profit_level
    strategy.close("Long")

// RSI más restrictivo
rsi_ok = ta.rsi(close, 14) > 55 and ta.rsi(close, 14) < 70

📊 Backtest Resumen — 48 Combinaciones

ETF TF Trades Win Rate Avg Win Avg Loss Max DD Return % PF Sharpe

💰 Fondos Utilizados — 16 ETFs

SPY

S&P 500

Large cap US — Las 500 mayores empresas americanas
QQQ

Nasdaq 100

Tech growth — Las 100 mayores empresas tecnológicas
IWM

Russell 2000

Small cap — Pequeñas empresas con alto potencial
EFA

MSCI EAFE

Internacional desarrollados — Europa, Asia, Australia
VTI

Total US Stock Market

Mercado completo USA — Máxima diversificación
GLD

Oro (Gold Trust)

Metal precioso — Refugio en tiempos de crisis
TLT

Bonos Largo Plazo US 20+

Renta fija — Bonos del Tesoro a largo plazo
XLE

Sector Energía

Petróleo y gas — Empresas energéticas tradicionales
XLF

Sector Financiero

Bancos y seguros — Sector financiero USA
ARKK

ARK Innovation

Disruptive tech — Tecnologías disruptivas y futuro
DIA

Dow Jones Industrial

Blue chips — Las 30 empresas industriales más grandes
SLV

Plata (Silver Trust)

Metal industrial — Alta volatilidad y uso industrial
USO

Petróleo (US Oil Fund)

Commodity — Exposición directa al precio del crudo
SMH

Semiconductores (VanEck)

Chips y hardware — Fabricantes de semiconductores
XLK

Sector Tecnología

Tech sector — Empresas tecnológicas USA
IEMG

Mercados Emergentes

Emerging markets — China, India, Brasil, etc.

📈 Trades Detallados

Entrada Precio Entrada Salida Precio Salida Razón P&L P&L %

📊 Gráficos Comparativos

💡 Propuestas de Mejora

1. Salida Anticipada por Debilidad de Tendencia

Al operar con fondos (compra/venta de acciones), es clave salir rápido cuando la tendencia pierde fuerza.

  • Salir si el precio cierra por debajo de la media móvil de 20 períodos
  • Salir si el volumen cae significativamente respecto al promedio
  • Monitorear divergencias RSI que anticipen reversiones
2. Filtro de Volatilidad (ATR)

Evitar operar en mercados con volatilidad extrema o muy baja.

  • Solo entrar si ATR(14) está entre percentiles 30-70 de su histórico
  • Ajustar el tamaño de posición según la volatilidad actual
  • Stop loss dinámico basado en ATR × 2
3. Confirmación Multi-Timeframe

Aumentar fiabilidad validando señales en timeframes superiores.

  • Solo entrar en 15m si el 1h también muestra ruptura Donchian
  • Validar tendencia en timeframe superior (4h o diario)
  • Evitar contra-tendencia en marcos temporales mayores
4. Gestión de Correlación Entre ETFs

Diversificar evitando múltiples posiciones en ETFs correlacionados.

  • Limitar exposición simultánea a SPY + QQQ + VTI (alta correlación)
  • Rotar entre sectores decorrelacionados (XLE, TLT, GLD)
  • Máximo 3 posiciones abiertas simultáneas en ETFs correlacionados >0.7
5. Breakeven y Trailing Stop Inteligente

Proteger ganancias con stops dinámicos más sofisticados.

  • Mover SL a breakeven cuando ganancia > 1.5% (comisiones cubiertas)
  • Trailing stop escalonado: 50% @ +2%, 70% @ +3%, 85% @ +5%
  • Usar parabolic SAR como referencia de trailing stop
6. Filtro de Sesión y Horario

Operar solo en horarios de máxima liquidez.

  • Evitar las primeras 30 min (9:30-10:00 ET) por volatilidad de apertura
  • Evitar los últimos 30 min (15:30-16:00 ET) por cierre errático
  • Concentrarse en 10:00-15:00 ET (mayor volumen y claridad)
7. Reinversión de Ganancias Progresiva

Aumentar tamaño de posición tras rachas ganadoras.

  • Tamaño base: 2% del capital
  • Tras 3 trades ganadores consecutivos: 2.5%
  • Tras 5 trades ganadores: 3% (máximo)
  • Volver a 2% después de 2 trades perdedores
8. Backtesting Monte Carlo

Validar robustez con simulaciones aleatorias.

  • Generar 1000 simulaciones variando orden de trades
  • Calcular peor escenario del percentil 5
  • Ajustar tamaño de posición para sobrevivir peor caso
9. Machine Learning para Filtro de Señales

Usar ML para filtrar señales de baja probabilidad.

  • Entrenar modelo con 100+ features (precio, volumen, correlaciones)
  • Clasificar señales en alta/media/baja probabilidad
  • Solo operar señales con probabilidad >65%
  • Re-entrenar modelo cada 3 meses con nuevos datos