Por qué un LLM escribe v5 bajo una cabecera v6
Pide a un modelo de chat una estrategia en Pine v6 y normalmente obtendrás
//@version=6 en la primera línea y costumbres de v5 debajo. La línea de
versión es una cadena que el modelo ha aprendido a poner ahí. La sintaxis de
debajo viene del cuerpo mucho mayor de Pine publicado anterior a v6.
Ese desajuste sería inofensivo si fallara de forma ruidosa. El problema es la forma de lo que sobrevive.
Compilarlo filtra la mitad equivocada
Los cambios de v5 a v6 se dividen en dos. Unos detienen el script — esos los encuentras en diez segundos, porque el editor los lista. El resto dejan que compile y cambian lo que devuelve [1].
Un modelo que produce patrones de v5 tropezará con ambos tipos. Pero solo notas uno, porque la comprobación que casi todo el mundo hace con código generado por IA es «¿compila?» — y esa comprobación aprueba todo el segundo grupo. Los fallos que puedes ver son los baratos. Los caros parecen código que funciona.
Esto es lo que pasa el filtro, todo documentado [1]:
| Costumbre de v5 que el modelo reproduce | Qué hace v6 en su lugar | ¿Compila? |
|---|---|---|
llamada ta.* dentro de una cadena and | hace cortocircuito, así que la llamada se omite en algunas barras y su historial se rompe | sí |
contar con margin_long = 0 | vale 100 por defecto, así que las entradas que necesitan más dinero del disponible no se abren | sí |
timeframe.period == "D" | devuelve "1D", así que la comparación nunca es cierta | sí |
división entera como length / 2 | dos enteros que no dividen exacto ahora dan una fracción | sí |
un bool que se espera que sea na | los booleanos ya no pueden ser na; esas expresiones devuelven false | sí |
for i = 0 to n donde n cambia | el límite se reevalúa antes de cada iteración | sí |
La primera fila es la que más importa, porque no cambia un número: corrompe el estado interno de un indicador, y no hay nada en el código que mirar. Un modelo la escribirá constantemente, ya que poner la llamada al indicador en línea suena más natural que sacarla arriba.
Los dos que sí detienen el script, y por qué engañan
int y float ya no se convierten implícitamente a bool [1], y na(),
nz() y fixnan() ya no aceptan bool [1]. Estos sí dan error, lo cual es
bueno — pero tienden una trampa: el modelo arregla el error que le pegas de
vuelta, ves que el script compila, y concluyes que ya es correcto. Ahora
compila. Son afirmaciones distintas.
Donde el modelo se equivoca con más seguridad
Dos patrones, que merecen nombrarse porque parecen pericia:
Te da un indicador cuando pediste una estrategia. indicator() no tiene
órdenes, ni equity, ni Strategy Tester. Es el desajuste más común entre lo que
se pidió y lo que llegó, y se ve al instante en la segunda línea.
Inventa funciones integradas que suenan verosímiles. Una función nombrada como se nombraría una función de Pine, con argumentos sensatos, que no existe. Esta sí da error de compilación, así que es barata — la razón para esperarla es que te dice que el modelo está completando un patrón en lugar de recordar una API, y ese mismo mecanismo es el que produce los errores silenciosos de arriba.
Una comprobación en seis pasos para Pine escrito por IA
Compilar es el paso cinco, no el primero. Cuatro de estas comprobaciones encuentran cosas que el compilador no puede ver, y todas son búsquedas de texto: no necesitas leer Pine con fluidez para ejecutarlas.
1. Lee la segunda línea
¿Dice strategy( o indicator(? Si pediste algo con backtest y te dio
indicator(), párate aquí. No hay nada que arreglar; es el tipo de script
equivocado.
2. Busca and y or, y mira a su derecha
Esta es la comprobación sin sustituto. Para cada and u or del archivo,
¿hay una llamada ta. a su derecha?
// el patrón a buscar — ta.rsi() se omite en las barras donde
// close <= open, así que su historial deja de ser continuo
if close > open and ta.rsi(close, 14) > 50
La solución es sacar la llamada para que se ejecute en cada barra:
rsiVal = ta.rsi(close, 14)
if close > open and rsiVal > 50
Igual con ta.crossover, ta.crossunder, ta.pivothigh, ta.pivotlow y
ta.valuewhen — cualquier cosa que mantenga estado entre barras. Un modelo las
escribe en línea porque se lee mejor, y v6 hace cortocircuito con and [1], así
que no todas se ejecutan.
3. Compara cada nombre ta. con el manual de referencia
No «¿parece correcto?» — búscalo [2]. Una función que suena verosímil y no existe es una salida normal, y también una función real llamada con los argumentos en mal orden. El manual de referencia es la única autoridad aquí; la seguridad de un modelo sobre su propia API no es evidencia.
4. Lee la declaración strategy() buscando costes
Sin commission_value ni slippage, el backtest que estás a punto de admirar
es de un mercado que no cobra nada. Los modelos omiten ambos de forma rutinaria,
porque la mayoría del código de ejemplo publicado los omite. Detalles en
los parámetros de coste.
5. Ahora compílalo
Pega, guarda y lee todos los mensajes, no solo el primero. Y entonces — este es
el paso que la gente se salta — vuelve a ejecutar los pasos 2 a 4 sobre la
versión corregida. Cuando pegas un error y el modelo reescribe el script,
reescribe más que el error: las llamadas ta. vuelven a quedar en línea, y los
costes desaparecen otra vez.
6. Compara la lista de operaciones con el gráfico
Añádelo a un gráfico, abre la List of Trades, elige tres operaciones y búscalas. ¿Corresponde cada precio de ejecución a un precio al que esa barra realmente operó? Esto detecta fuga de futuro, un tipo de gráfico no estándar y un tamaño de tick mal leído, y es el único paso que prueba la estrategia en lugar del código.
Lo que este procedimiento no puede decirte
Si la estrategia es buena. Seis comprobaciones superadas significan que el script hace lo que parece hacer, no que lo que hace sea rentable. Un modelo que produce Pine limpio, que compila y con costes honestos te ha dado una implementación correcta de una idea que no tenía forma de evaluar.
La división del trabajo más útil es dejar que el modelo explique campos y diagnostique errores, y que algo determinista emita el archivo. Ese es el argumento de generador de IA frente a constructor visual, y es la razón por la que nuestras propias exportaciones vienen de un generador de código y no de un prompt.
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).

