Errores comunes de Pine Script (compilar, tipos, UNSUPPORTED_FEATURE)

Arregla identificadores, versión, indicator vs strategy, crossover y features no soportadas del Generate — no el 10016 de MT5.

📖 8 min read

📝 1,560 words

🏷️ Pine Script and TradingView

Compartir este artículo:

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.

PrefijoTipoCuándoCómo aparece
CEError de compilaciónAl compilar, antes de ejecutarseResaltado en rojo; el script no puede ejecutarse
CWAdvertencia del compiladorAntes de la ejecuciónResaltado en naranja; el script compila, pero probablemente no hace lo que querías
REError de ejecuciónDurante la ejecución, en una barra concretaIcono 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ódigoMensaje exactoQué 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]:

pine
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]:

pine
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 vesEl límite que alcanzasteValor publicado
CE10117 "too many tokens"Tokens compilados por script100.256 tokens (bibliotecas combinadas: 1 millón)
RE10143 desplazamiento histórico fuera del búferBúfer histórico5.000 barras en la mayoría de series; algunas integradas hasta 10.000
RE10139 "Memory limits exceeded."Tamaño de colección100.000 elementos (50.000 pares clave-valor en un map)

Los límites que probablemente encuentres después, con sus valores publicados [3]:

LímiteValor
Variables en un mismo ámbito1.000
Llamadas request.* únicas40 (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 barra500 milisegundos
Tiempo de ejecución del script20 segundos en cuentas básicas, 40 en las demás
Tiempo de compilación2 minutos; tres avisos consecutivos suponen 1 hora de bloqueo
Número de plot64
IDs de líneas, cajas y etiquetas500 cada uno (polilíneas: 100)
Tablas9, una por posición
Barras hacia el futuro500
Órdenes de backtest9.000; Deep Backtesting lo eleva a 1.000.000
Tamaño de la petición de compilación5MB

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.

ErrorQué significaDónde se arregla
UNSUPPORTED_FEATURELa estrategia usa algo que la exportación Basic no puede emitirCambia la estrategia en el builder
Exportación vacía o parcialUn campo obligatorio de un paso anterior quedó sin rellenarVuelve 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).

Preguntas frecuentes

Versión, indicator vs strategy, identificadores, crossover. Editor.

Algo fuera de Basic. Hub.

No aquí — es MT5. Errores MQL5.

¿Es indicator? Qué es strategy.

Re-export. Production-ready.