Guía ChatGPT Pine Script v6: strategy() vs indicator()

Qué suele fallar ChatGPT (versión, repaint, studies) y por qué el export del Builder más Tactix Studio/Guide y el Tester es más seguro que pegar un bot completo.

📖 7 min read

📝 1,242 words

🏷️ Pine Script and TradingView

Compartir este artículo:

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 reproduceQué hace v6 en su lugar¿Compila?
llamada ta.* dentro de una cadena andhace cortocircuito, así que la llamada se omite en algunas barras y su historial se rompe
contar con margin_long = 0vale 100 por defecto, así que las entradas que necesitan más dinero del disponible no se abren
timeframe.period == "D"devuelve "1D", así que la comparación nunca es cierta
división entera como length / 2dos enteros que no dividen exacto ahora dan una fracción
un bool que se espera que sea nalos booleanos ya no pueden ser na; esas expresiones devuelven false
for i = 0 to n donde n cambiael límite se reevalúa antes de cada iteración

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 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 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?

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

pine
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).

Preguntas frecuentes

A veces; suele fallar. Mejor Builder o Tactix Studio. AI vs visual.

Necesitas strategy(). Qué es.

//@version=6 + Editor.

Tactix AI es la marca del asistente de AlfaTactix (/tactix-ai). Tactix Studio redacta todo el formulario de seis pasos del Strategy Builder desde una descripción en lenguaje natural para que lo revises. Tactix Guide ayuda campo a campo en el builder o en la Academia. El código sigue saliendo de Code Generator tras confirmar el formulario — no de un pegado de chatbot.

Referencias

  1. TradingView. Migration guide — to Pine Script® version 6. https://www.tradingview.com/pine-script-docs/migration-guides/to-pine-version-6
  2. TradingView. Pine Script® language reference manual. https://www.tradingview.com/pine-script-reference/v6/