Cómo leer un error de Pine
Antes de arreglar nada, identifica cuál de los tres tipos de mensaje tienes delante. La documentación de TradingView los separa por prefijo [1], y el prefijo indica cuándo ocurrió el problema, lo que acota la causa más que el propio texto del mensaje.
| Prefijo | Tipo | Cuándo | Cómo aparece |
|---|---|---|---|
CE | Error de compilación | Al compilar, antes de ejecutarse | Resaltado en rojo; el script no puede ejecutarse |
CW | Advertencia del compilador | Antes de la ejecución | Resaltado en naranja; el script compila, pero probablemente no hace lo que querías |
RE | Error de ejecución | Durante la ejecución, en una barra concreta | Icono rojo en la línea de estado, con el índice de la barra que falló |
Dos consecuencias prácticas.
Un CW no es un fallo. El script se ejecuta. Te avisa de que el resultado
puede no ser el que pretendías, y eso es peor que un fallo: nada te impide
operar con él.
Un RE te da un índice de barra. Ese número es la herramienta de depuración
más rápida de Pine: el error no ocurrió «en algún punto del script», ocurrió en
una barra identificable, y lo que sea raro en esa barra es tu causa.
Una advertencia de TradingView: la lista documentada no está completa. Su página dice que se añadirán páginas para otros errores comunes con el tiempo, así que un error sin página de código es normal.
Errores que TradingView documenta por código
Estos son los errores con página oficial propia [1]. La columna del mensaje es la cadena exacta, para que coincida con lo que muestra tu editor.
| Código | Mensaje exacto | Qué significa en realidad |
|---|---|---|
CE10101 | "The condition of the 'X' statement must evaluate to a 'bool' value." | Diste a if o switch algo que no es booleano |
CE10117 | "Compiled code contains too many tokens" | El script es demasiado grande para el compilador, no está mal |
CW10003 | "The function 'X' should be called on each calculation for consistency..." | Una función que debe ejecutarse en cada barra está dentro de un bloque condicional |
RE10139 | "Memory limits exceeded." | El script reservó más memoria de la permitida |
RE10143 | "The requested historical offset (X) is beyond the historical buffer's limit (Y)." | Pediste una barra más atrás de lo que Pine conserva |
CE10101 es una trampa de migración a v6, no un error tipográfico
Este merece una nota aparte porque es el error que más aparece en scripts que antes funcionaban. La página de TradingView indica que Pine Script v6 ya no convierte implícitamente valores numéricos en booleanos, al contrario que las versiones anteriores [2].
Así, código v5 con if algúnNúmero compila en v5 y falla en v6. La solución es
decir lo que quieres decir. Su documentación da dos formas [2]:
newMonth = ta.change(month)
// conversión explícita
if bool(newMonth)
label.new(bar_index, high, "New month started")
// o una comparación, normalmente más clara
if newMonth != 0
label.new(bar_index, high, "New month started")
Sobre la conversión, conviene citar literalmente a TradingView [2]: 0, 0.0 y
na pasan a false; cualquier otro valor distinto de cero y de na pasa a
true.
La misma trampa afecta a las comprobaciones de na: hay que usar la función
na() en lugar del valor [2]:
pivot = ta.pivothigh(10, 10)
if not na(pivot)
label.new(bar_index[10], pivot, "Pivot High")
RE10143 te dice dónde mirar
Los dos números del mensaje son el desplazamiento que pediste y el límite del
búfer que superaste. No es un fallo de tu lógica: una referencia histórica como
close[500] fue más atrás de lo que Pine conservó.
Los límites detrás de los errores
Tres de los cinco códigos documentados no son errores en absoluto: son un límite publicado que se ha alcanzado. Los límites están en una página distinta de la de los errores [3], y por eso el mensaje casi nunca te da el número que necesitas.
| El error que ves | El límite que alcanzaste | Valor publicado |
|---|---|---|
CE10117 "too many tokens" | Tokens compilados por script | 100.256 tokens (bibliotecas combinadas: 1 millón) |
RE10143 desplazamiento histórico fuera del búfer | Búfer histórico | 5.000 barras en la mayoría de series; algunas integradas hasta 10.000 |
RE10139 "Memory limits exceeded." | Tamaño de colección | 100.000 elementos (50.000 pares clave-valor en un map) |
Los límites que probablemente encuentres después, con sus valores publicados [3]:
| Límite | Valor |
|---|---|
| Variables en un mismo ámbito | 1.000 |
Llamadas request.* únicas | 40 (64 en el plan Ultimate) |
Elementos de tupla en todas las llamadas request.* | 127 combinados — la solución documentada es usar tipos definidos por el usuario |
| Ejecución de un bucle en una sola barra | 500 milisegundos |
| Tiempo de ejecución del script | 20 segundos en cuentas básicas, 40 en las demás |
| Tiempo de compilación | 2 minutos; tres avisos consecutivos suponen 1 hora de bloqueo |
Número de plot | 64 |
| IDs de líneas, cajas y etiquetas | 500 cada uno (polilíneas: 100) |
| Tablas | 9, una por posición |
| Barras hacia el futuro | 500 |
| Órdenes de backtest | 9.000; Deep Backtesting lo eleva a 1.000.000 |
| Tamaño de la petición de compilación | 5MB |
Dos de estos explican problemas que nunca producen mensaje de error.
El límite de 500 milisegundos por bucle es por bucle y por barra, no por script. Un bucle rápido en barras recientes puede superarlo en una barra con más historial detrás, y por eso un script funciona semanas y luego falla.
El límite de 40 llamadas request.* únicas cuenta llamadas únicas, no
ejecuciones. Pedir el mismo símbolo y temporalidad dos veces es una llamada;
pedir doce símbolos en cuatro temporalidades son cuarenta y ocho, y excede el
límite.
Errores del generador de AlfaTactix
Estos vienen de nuestro exportador, no de Pine, y la mayoría de la gente no ve ninguno: el builder restringe lo que se puede seleccionar, así que una combinación no soportada normalmente ni siquiera es alcanzable. Cuando aparece uno se muestra en el panel de generación, y significa que la estrategia pidió algo que la exportación no puede expresar. La solución está en el builder, nunca en el archivo generado.
| Error | Qué significa | Dónde se arregla |
|---|---|---|
UNSUPPORTED_FEATURE | La estrategia usa algo que la exportación Basic no puede emitir | Cambia la estrategia en el builder |
| Exportación vacía o parcial | Un campo obligatorio de un paso anterior quedó sin rellenar | Vuelve al paso que el builder señala |
La exportación Basic no puede emitir lógica multi-temporalidad, objetivos basados en VWAP ni filtros de noticias. Si tu estrategia necesita alguno, la exportación se niega en lugar de emitir algo que se comporte distinto de lo que diseñaste — y ese es el fallo que importa, porque un script silenciosamente distinto pasa el backtest y luego no coincide en real.
No edites a mano el archivo exportado para saltarte esto. El script generado es lo que el builder puede reproducir; una vez editado, la siguiente exportación sobrescribe tu cambio y la versión que probaste ya no existe en ningún sitio. Cambia la estrategia y vuelve a exportar.
Un error que no es nuestro y nos llega a menudo: el 10016 de MetaTrader. Es
un rechazo por niveles de stop en MT5 y no tiene nada que ver con Pine ni con
TradingView. Pertenece al lado MQL5 — ver
Errores comunes de EA en MQL5.
Una ruta de arreglo que funciona
En orden, primero lo más barato.
1. Lee el prefijo, no la frase. CE significa que nunca se ejecutó, CW
que se ejecutó y puede estar mal, RE que se ejecutó y se detuvo en una barra
concreta [1]. Cuesta dos segundos y elimina casi todo el espacio de búsqueda.
2. Si es un RE, ve a la barra que indica. La línea de estado da el índice.
Mira qué tiene de raro esa barra: un hueco, un cambio de sesión, la primera
barra del conjunto, una barra sin volumen. La causa casi siempre está ahí.
3. Revisa la declaración antes de la lógica. Un script que compila pero no
muestra nada en el Strategy Tester suele ser un indicator() donde hacía falta
un strategy(). Son tipos de script distintos con capacidades distintas [4], y
leer la lógica de entrada no lo revelará.
4. Revisa la línea de versión. //@version=6 se comporta distinto de v5 de
formas que provocan errores en código que antes funcionaba — CE10101 es el
ejemplo más claro. Mezclar un fragmento v5 en un script v6 es la causa más
común del «ayer funcionaba».
5. Después usa las técnicas oficiales de depuración [5] en lugar de adivinar: dibujar valores intermedios es más rápido que razonar sobre ellos.
6. Si lo exportaste, vuelve a exportar en lugar de repararlo. Un archivo generado y editado a mano ya no es reproducible, y depurarás la edición en vez de la estrategia.
Qué no hacer
No empieces reescribiendo la parte que te parece sospechosa. Los errores de Pine son inusualmente específicos: un prefijo, a menudo un índice de barra, a veces dos números que nombran el límite que cruzaste. Todo eso es información que leer el código no te da, y descartarla a favor de la intuición es lo que convierte un arreglo de dos minutos en una tarde.
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).

