Las alertas no son órdenes
El Strategy Tester muestra doscientas operaciones. Tu registro de alertas está vacío. Nada está roto, y esta es la razón documentada:
Las alertas solo se disparan en la barra en tiempo real. [1]
Cada ejecución del backtest es una reproducción del historial. Una alerta es un evento en tiempo real. Nada en la parte histórica del gráfico disparó nunca una alerta, y nunca lo hará: ninguna configuración cambia eso.
La frecuencia que no elegiste
alert(message, freq)
freq vale alert.freq_once_per_bar por defecto [1]. Hay tres valores:
| Constante [1] | Se dispara |
|---|---|
alert.freq_once_per_bar | la primera vez que la condición es cierta en la barra — el valor por defecto |
alert.freq_once_per_bar_close | solo al cierre confirmado de la barra |
alert.freq_all | cada vez que la condición es cierta |
Si tu estrategia decide al cierre de la barra, el valor por defecto es el equivocado. Te avisará de una condición intrabarra que ya se ha revertido cuando la barra cierra: el problema del repintado con otro disfraz, y la razón por la que un flujo de alertas en vivo puede contradecir al backtest que lo generó.
Alertas de ejecución de órdenes y su texto
Una alerta de script creada desde una estrategia puede configurarse para que
los eventos de ejecución de órdenes también la disparen [1]. El texto por orden
viene del parámetro alert_message, que aceptan strategy.entry(),
strategy.exit(), strategy.close() y strategy.order() [1]; lo recuperas en
el cuerpo de la alerta con el marcador {{strategy.order.alert_message}} [1].
Otros marcadores disponibles en los mensajes de alerta incluyen {{ticker}},
{{exchange}}, {{interval}}, {{close}}, {{time}} y {{timenow}} [1].
La parte que TradingView no promete
Una alerta es una notificación. No coloca una orden en tu bróker. Pasar de una alerta disparada a una posición abierta requiere una integración con el bróker, y el retardo entre ambas es tuyo: no está en el tester, que asume que la ejecución ocurrió al precio que modeló. Esa brecha se mide en la comparación entre el tester y el mercado en vivo.
Los límites que deciden tus resultados
Parte de lo que informa tu backtest lo decide tu cuenta, no tu estrategia. Conviene saberlo antes de gastar un fin de semana depurando uno de estos límites.
Tu plan cambia tu backtest
Barras históricas disponibles, por plan [2]:
| Plan [2] | Barras históricas |
|---|---|
| Ultimate | 40.000 |
| Expert | 25.000 |
| Premium | 20.000 |
| Essential y Plus | 10.000 |
| Otros planes | 5.000 |
Lee esa tabla otra vez, porque la consecuencia es mayor de lo que parece: dos personas que ejecutan un script idéntico en un símbolo y temporalidad idénticos obtienen backtests distintos. Quien tiene más historial prueba más regímenes de mercado, y quien tiene menos puede no llegar al drawdown que le habría hecho cambiar de opinión.
Así que un factor de beneficio publicado no es reproducible si no se indica el plan junto a él. Si publicas una cifra, indica tu plan; si lees una que no lo hace, no puedes comprobarla.
El tope de órdenes que detiene tu backtest en silencio
Un script puede colocar un máximo de 9.000 órdenes en un backtest, que sube a 1.000.000 con Deep Backtesting [2].
Un script que opera con frecuencia sobre un rango largo alcanza las 9.000 y simplemente deja de añadir operaciones. La curva se aplana y las estadísticas siguen pareciendo verosímiles. Nada te avisa de que el test terminó antes: compara el número de operaciones con el tope antes de concluir que la estrategia dejó de funcionar.
Tiempo de ejecución, que hace fallar un script que antes pasaba
El tiempo asignado para ejecutarse sobre todas las barras de un conjunto de datos es de 20 segundos para cuentas básicas y 40 para las demás [2].
Este confunde porque tu lógica no tiene que cambiar para alcanzarlo. Añade
barras, añade una llamada request.*, cambia a un símbolo con más historial, y
un script que funcionaba ayer agota el tiempo hoy.
El resto, en una tabla
| Límite [2] | Valor |
|---|---|
| Recuentos de plot por script | 64 |
Llamadas request.* únicas | 40, o 64 en Ultimate |
| Búfer histórico, la mayoría de series | 5.000 barras |
Búfer histórico de open, high, low, close, time | hasta 10.000 barras |
| Líneas, cajas, polilíneas y etiquetas mostradas por defecto | últimas 50 |
| Máximo de IDs de línea, caja y etiqueta | 500 |
| Máximo de IDs de polilínea | 100 |
Dos de esos provocan informes de fallos que no son fallos. Los dibujos que
exceden el límite mostrado no se dibujan, así que una etiqueta que esperabas
y no encuentras suele ser el tope, no tu condición — y poner las propiedades de
un dibujo en na sigue contándolo en el total [2]. Y una serie indexada más
atrás de lo que permite su búfer es un límite, no un error tipográfico.
El recuento de plots también merece una segunda mirada, porque no es uno por
cada llamada a plot(): plotarrow(), plotcandle(), plotchar(),
plotshape(), alertcondition(), bgcolor(), barcolor() y un fill() con
color de serie consumen todos de los mismos 64 [2].
Qué comprobar de verdad, y con qué frecuencia
Primero, lo que no tienes que hacer: mantener una máquina encendida. Una estrategia Pine se ejecuta en el gráfico de TradingView, no en tu ordenador, así que no hay terminal que reiniciar ni VPS que alquilar. Esta es la diferencia estructural con un Expert Advisor de MT5, y casi todo el consejo de mantenimiento que encontrarás para Pine es un artículo de MT5 con las palabras cambiadas — ver desplegar y mantener un EA para lo que aquello sí requiere.
Lo que queda es comprobar que sigue siendo cierto lo que tu backtest asumió.
Tras cada re-export — la declaración
Es la única comprobación obligatoria, porque la declaración strategy() es
donde se deciden tus resultados y una exportación nueva la reescribe.
| Confirma | Porque |
|---|---|
commission_type y commission_value están fijados | una exportación por defecto puede no costar nada |
slippage está en ticks de este instrumento | un tick no mide lo mismo en dos símbolos |
pyramiding es el número que querías | vale 1 por defecto [3]; un valor mayor acumula posiciones |
| cada control de entrada cambia el comportamiento de verdad | mueve un umbral y confirma que la lista de operaciones cambia |
Esa última fila no es paranoia. Una entrada declarada pero nunca referenciada en la lógica genera un control que funciona y no hace nada, y no hay forma de saberlo mirándolo — ver los parámetros de coste en detalle.
Cada semana — dos comprobaciones
Elige tres operaciones de la List of Trades y búscalas en el gráfico. ¿Corresponde el precio de ejecución a un precio al que esa barra realmente operó? Esta única comprobación detecta fuga de futuro, un tipo de gráfico no estándar y un tamaño de tick mal leído, y cuesta menos de un minuto.
Confirma que tu filtro de sesión sigue coincidiendo con el horario del instrumento. El horario de verano lo mueve dos veces al año, y una cadena de sesión se interpreta en la zona horaria del mercado, no del gráfico — las reglas de los filtros de sesión explican por qué eso hace daño.
Cada mes — ¿sigue operando?
Una estrategia que ha dejado de abrir posiciones está o en un régimen de mercado para el que no fue construida, o tiene una condición que ya no llega a ser cierta. En la curva de capital ambas cosas son idénticas: una línea plana.
Distínguelas dibujando la condición en sí, no el resultado. Si la condición se
cumple y no siguen órdenes, mira pyramiding, el tope de órdenes, o un filtro
que ahora es permanentemente falso. Si la condición no se cumple nunca, el
mercado cambió — y eso es una decisión que tomar, no un fallo que arreglar.
Lo que no hay que comprobar
El código, salvo que lo cambiaras tú o lo cambiara la plataforma. Los valores por defecto de cada versión son la excepción que merece un recordatorio en el calendario: los cambios de v5 a v6 alteraron comportamientos sin dar error, y esa clase de cambio es la única que puede romper un script que nunca tocaste.
Tactix AI en este flujo
AlfaTactix incluye Tactix AI: usa Tactix Studio para describir tu idea en lenguaje natural y rellenar timeframes, señales, filtros y riesgo en el mismo formulario de seis pasos — o abre Tactix Guide en cualquier paso si solo necesitas explicar un campo. Revisa cada valor y luego exporta MQL5 o Pine Script desde Code Generator (form-first — no prompt-to-code sin probar).

