Construimos Cerberus, un sistema de trading algorítmico para MetaTrader 4. Durante meses fue creciendo como crecen casi todos: cada vez que algo salía mal, añadíamos una función para que no volviera a pasar.
Acabó con una capa adaptativa de tres piezas. Un freno de tendencia que reducía la actividad en movimientos fuertes. Un cierre por inversión que cerraba la posición cuando el sesgo se daba la vuelta. Y un conmutador de régimen que cambiaba entre operar en contra del movimiento y operar a favor según la volatilidad.
Las tres tenían una historia detrás. Las tres nacieron de una pérdida concreta que queríamos evitar. Y las tres eran, sobre el papel, obviamente buenas ideas.
Entonces las medimos.
El método: una cada vez, misma ventana
La parte importante no es el resultado, es el procedimiento. Cogimos la misma ventana de datos —oro real en M1, 1,13 millones de velas— y la misma configuración, y desactivamos una sola función por corrida.
Esto suena obvio y casi nadie lo hace. Lo normal es cambiar tres cosas, ver que el número sube y quedarse con las tres. Si una de ellas está costando dinero pero las otras dos lo compensan, nunca te enteras.
| Función | Con ella | Sin ella |
|---|---|---|
| Freno de tendencia | 23.941 · f 1,38 · dd 354 | 36.552 · f 1,50 · dd 224 |
| Cierre por inversión | 36.552 · f 1,50 · dd 224 | 40.675 · f 1,48 · dd 294 |
| Conmutador de régimen | 43.898 · f 1,49 · dd 300 | 40.675 · f 1,48 · dd 294 |
Lo que encontramos
El freno de tendencia costaba un 34 % del resultado. No sólo eso: la caída máxima era peor con el freno puesto que sin él. La función diseñada para reducir el riesgo lo aumentaba.
La razón, cuando la entendimos, era evidente: el freno cerraba o impedía posiciones en momentos de movimiento fuerte. Pero muchas de esas posiciones se habrían recuperado. Al frenar, convertíamos una pérdida flotante temporal en una pérdida realizada permanente.
El cierre por inversión hacía exactamente lo mismo, por otra vía. Cerrar al invertirse el sesgo realiza la pérdida justo antes de que el mecanismo normal de salida la habría recuperado.
El conmutador de régimen fue el más interesante: empató. Sin él el resultado era prácticamente idéntico. Y ahí está la lección incómoda — una función que empata no es neutra, es deuda. Son parámetros que ajustar, estados que depurar, casos límite que documentar y una superficie más donde se esconden los fallos. Si no gana, se va.
Hubo un detalle que lo explicó todo: el daño del conmutador estaba siendo mediado por el cierre por inversión. Al cambiar de régimen invertía el sesgo sin que la señal cruda cambiara, lo que armaba la posición contraria y disparaba el cierre. Dos funciones tapándose los errores mutuamente. Al quitar una, la otra dejó de tener sentido.
Lo que se quedó
Una sola cosa sobrevivió a todas las pruebas: el stop por canasta. Redujo la caída un 63 % sin costar nada en resultado neto, y aguantó en todos los regímenes probados y con los dos modelos de simulación.
Una función que mejora en todos los escenarios que pruebas es rara. Cuando aparece una, la reconoces precisamente porque has medido las otras y has visto lo que hacen las que no funcionan.
Por qué escribimos esto
Porque el sesgo por defecto en software es añadir. Añadir se siente productivo, se puede enseñar en una demo y se justifica solo. Borrar se siente como retroceder.
Pero el código que no gana su sitio lo cobra igual: en mantenimiento, en superficie de fallo y en la confianza que pones en un sistema que no entiendes del todo. La única forma de saber cuál es cuál es medir una cada vez.
Cerberus es un producto de Tuurt Labs. Es un instrumento financiero de alto riesgo: operar CFDs apalancados puede provocar la pérdida total del capital. Nada de lo escrito aquí es asesoría de inversión.