Referencia técnica · Paso 8a · Backtest — motor
Cómo el motor ejecuta un trade sin trampas: entrada al open de la vela siguiente, resolución de salida, el modelo de costos con swap direccional y triple-miércoles, el sizing, la restricción de una posición a la vez y la bancarrota.
La señal aparece en la barra i, pero la entrada recién ocurre en la siguiente — no se puede operar dentro de la vela que todavía se está formando.
La política de salida (por defecto TP/SL fijos) resuelve el cierre. Si nada dispara dentro del horizonte, cierra por timeout a mercado.
Las 5 políticas (fija, GARCH, trailing ×3) se resuelven acá — su mecánica en detalle está en 8c. El timeout siempre cierra a mercado — su P&L real entra en las cuentas (a diferencia del target del descubrimiento, que lo excluye).
El retorno porcentual según dirección, neto de costos, escalado por el tamaño de posición.
Costo fijo (spread + comisión + slippage combinados) más el swap direccional escalado por los días de tenencia, con el triple-swap del miércoles.
El triple-miércoles compensa el rollover del fin de semana en forex retail. Es una aproximación por conteo de barras (no por rollovers reales del broker); el error es de a lo sumo 1 rollover en el borde y sistemáticamente conservador (nunca subestima el costo). Sin wednesday_mask, el swap se cobra uniforme por día.
El tamaño se calcula por trade con un piso de capital que corta el run si la cuenta cae demasiado.
Modos de sizing: fijo, tamaño mínimo, o porcentaje de riesgo. El bankruptcy_floor es una fracción del capital inicial por debajo de la cual no se toman nuevos trades (evita simular una cuenta ya arruinada).
Continúa en 8b: la equity curve, PF con cap, expectancy, Sharpe/Sortino desde la equity diaria, drawdown, Ulcer, recovery y Calmar.
Ver también 8c (exit policies en detalle: fija, GARCH, trailing ×3) y 8d (filtro de régimen: clasificación y refinamiento per-combo).
Fuentes:
· domain/backtester/engine.py — run_backtest, _resolve_exit, _cost_for_trade, _apply_regime_filter
· domain/backtester/position_sizing.py — compute_position_size, bankruptcy_floor
· domain/backtester/exit_policies/ — FixedTpSl, GARCH, trailing (×3)