No es la sintaxis
La sintaxis de Pine es pequeña. Si has escrito cualquier lenguaje, puedes leer un script de Pine en una tarde. Por eso «aprende a programar primero» es un mal consejo aquí: los programadores con experiencia también se atascan con Pine, y se atascan en las mismas dos cosas que los principiantes.
Ambas son cosas que ningún lenguaje mayoritario tiene.
1. Tus variables son historiales, no valores
Un script de Pine no se ejecuta una vez. Se ejecuta una vez por barra histórica [1], y repetidamente en la barra en tiempo real, una por cada nueva actualización [1]. Ese bucle no lo escribes tú. Es el entorno.
Así que close no es un número. Es el precio de cierre de la barra que se está
evaluando ahora, y close[1] es el de la anterior. Cada variable arrastra un
historial detrás, y [1] alcanza ese historial.
Por eso el primer instinto de un principiante — escribir un bucle sobre las barras — está equivocado, y por eso el código parece extrañamente plano. No hay nada que recorrer porque ya estás dentro del bucle.
La consecuencia que de verdad duele: un cálculo solo tiene un historial continuo si se ejecutó en cada barra. Omítelo en algunas barras y su estado interno queda roto, sin nada en el código que lo delate. Esa es toda la razón de que el cambio de evaluación perezosa de v6 importe, y es lo primero que hay que revisar en código generado.
2. Los tipos tienen una segunda dimensión de la que nadie te avisa
Los tipos fundamentales de Pine son normales: int, float, bool, color,
string [2]. Esa parte es fácil.
La parte que no: cada valor lleva además un cualificador, que describe cuándo se conoce. Hay cuatro, y forman una jerarquía [2]:
const < input < simple < series
| Cualificador [2] | Se conoce |
|---|---|
const | al compilar el script |
input | cuando el usuario confirma el diálogo de ajustes |
simple | cuando el script arranca en la primera barra |
series | puede cambiar en cada barra |
Y la regla que genera casi toda la confusión:
Cualquier variable, parámetro u operación que acepta un valor con un cualificador concreto admite también un valor del mismo tipo con un cualificador más débil, pero no uno más fuerte. [2]
La conversión va en un solo sentido, hacia abajo en la jerarquía. Un parámetro
que quiere simple int aceptará input int o const int sin problema y
rechazará series int, porque series está más arriba en la jerarquía [2].
Los parámetros cualificados como simple solo aceptan simple, input o
const [2].
Ningún otro lenguaje que la mayoría haya usado funciona así. Puedes conocer el tipo de cada valor de tu script y seguir sin poder compilarlo.
Una cosa más que hace tropezar a los programadores en particular
Pine no convierte automáticamente otros tipos a bool en expresiones
lógicas [2]. De int a float sí ocurre automáticamente [2]; la veracidad no.
Si has escrito C, Python o JavaScript, if unNumero es un reflejo, y aquí es un
error en lugar de un atajo.
El error que no tiene sentido
Tarde o temprano escribes algo razonable y Pine lo rechaza con un mensaje sobre
series y simple. Es la pregunta más frecuente de Pine, y casi toda
respuesta en internet es «usa input.int()» sin explicación — lo que arregla la
línea y no te enseña nada.
Esta es la razón, y con ella toda la clase de error se vuelve predecible.
Por qué un periodo no puede ser una serie
Piensa en una media móvil cuyo periodo quieres variar según la volatilidad. El
periodo es ahora un valor que puede cambiar en cada barra: un series int. Y el
parámetro no lo acepta, porque está declarado para aceptar simple int, y
series es más fuerte que simple en la jerarquía [2].
Parece arbitrario hasta que preguntas qué tiene que hacer la plataforma. Para mantener un historial de una media de 200 periodos debe reservar un búfer, y tiene que dimensionarlo antes de que empiecen a llegar las barras. Un periodo que puede cambiar en cualquier barra lo hace imposible: habría que redimensionar el búfer a mitad de ejecución, en cada barra, indefinidamente.
Así que la restricción no es un sistema de tipos quisquilloso. Es el motor diciéndote que ese número tiene que quedar fijado antes de la primera barra.
Y por eso input.int() funciona
input.int() produce un input int: conocido una vez, cuando el usuario
confirma el diálogo de ajustes, y constante después. input es más débil que
simple, y los cualificadores más débiles se aceptan donde los más fuertes no
[2]. No es un truco: es el cualificador que el parámetro pedía desde el
principio.
Cómo leer cualquier error de cualificador en diez segundos
Haz dos preguntas, en orden:
- ¿Cuál es el cualificador más fuerte de mi expresión? Un solo valor
seriesen cualquier parte hace que toda la expresión seaseries. Cualquier cosa derivada declose,high,volume, una llamadata.*o una condición dependiente de la barra esseries. - ¿Qué acepta el parámetro? Si quiere
simple, nada derivado deseriesentrará, y ninguna reescritura de la sintaxis lo cambiará.
El arreglo tiene siempre la misma forma: mueve la decisión más temprano. Haz que el valor sea un input, o una constante, o calcúlalo una vez en lugar de por barra.
Los tres casos más frecuentes
| Escribiste | Por qué falla | Qué hacer |
|---|---|---|
| un periodo calculado desde el precio | ese periodo es series; el parámetro quiere simple | hazlo un input, o elige de un conjunto fijo con switch |
| una cadena de temporalidad construida desde una variable | la petición la necesita fijada de antemano | constrúyela desde inputs, no desde datos de barra |
un desplazamiento como close[n] donde n varía | el desplazamiento debe ser resoluble | usa un input y acótalo a 0 o más |
Esa última fila merece una nota: un desplazamiento negativo es una referencia al
futuro, así que un input de desplazamiento debería tener minval = 0. Es fácil
publicar un control de desplazamiento que admita valores negativos, y el
resultado es un error de ejecución o una fuga — ver
repintado y lookahead.
Qué significa esto para aprender Pine
El sistema de cualificadores es la única idea genuinamente inusual del lenguaje, y una vez que la tienes, la mayoría de los mensajes de error de Pine dejan de sorprenderte. Merece media hora de atención deliberada al principio — bastante más útil que memorizar nombres de funciones, que para eso está el manual de referencia.
Tactix AI — Studio vs Guide
Tactix AI es la marca del asistente de AlfaTactix (abrir Tactix AI).
- Tactix Studio convierte una descripción de estrategia en una frase en un borrador de Timeframe, Señales, Filtros y Riesgo en el Strategy Builder visual. Revisas y editas cada campo antes de que Code Generator escriba MQL5 o Pine Script.
- Tactix Guide explica el paso en el que estás — qué rellenar, qué significa un control o cómo formular una regla — sin volcar código sin probar.
Es automatización form-first: el LLM no sustituye a Code Generator, y conservas límites de plan y validación en tiempo real.

