Pine Script v6
Validar antes de afirmar que funciona
Pine falla en tiempo de compilación de maneras que se leen bien en la página. Nunca entregues un script que no hayas verificado.
validate_pine_script # Herramienta MCP — devuelve errores estructurados con números de línea
lookup_pine_reference # Herramienta MCP — firma real para cualquier símbolo v6
Si el servidor MCP no está disponible, di que el script no está validado en lugar de implicar que compila.
No adivines nombres de parámetros. lookup_pine_reference existe porque adivinar es el fallo más común: inventar colour por color, shape= por style=, o textalign en una función que espera text_halign.
El modelo de ejecución lo decide todo
Un script se ejecuta una vez por barra, de izquierda a derecha a través del historial, luego en cada tick de la barra en vivo.
// INCORRECTO — se reinicia cada barra, por lo que siempre es 1
int count = 0
count := count + 1
// CORRECTO — `var` se inicializa una vez y persiste
var int count = 0
count := count + 1
= declara. := reasigna. Usar = dos veces sobre el mismo nombre es un error.
Las funciones ta.* deben ejecutarse en cada barra. Mantienen estado interno, por lo que llamar una dentro de un condicional lo corrompe silenciosamente:
// INCORRECTO — ta.sma solo avanza cuando la condición es verdadera
valor = condicion ? ta.sma(close, 20) : na
// CORRECTO — calcular sin condición, luego seleccionar
smaValue = ta.sma(close, 20)
valor = condicion ? smaValue : na
Constructores sobrecargados
line.new, label.new y box.new aceptan cada uno dos formas. Ambas son válidas:
line.new(x1=bar_index[1], y1=low[1], x2=bar_index, y2=high) // coordenadas
line.new(first_point=chart.point.now(low), second_point=chart.point.now(high))
label.new(x=bar_index, y=high, text="hola") // coordenadas
label.new(point=chart.point.now(high), text="hola")
box.new(left=bar_index[5], top=high, right=bar_index, bottom=low) // coordenadas
box.new(top_left=p1, bottom_right=p2)
Los nombres de parámetros difieren por función y son fáciles de confundir: label.new toma textalign; box.new y table.cell toman text_halign / text_valign.
Anti-repintado
// REPINTA — la barra actual de marco temporal superior aún se está formando
d = request.security(syminfo.tickerid, "D", close)
// ESTABLE — la barra anterior, cerrada
d = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_off)
Cachea la llamada en una variable; nunca la repitas en línea. Protege las divisiones de valores derivados de security con nz().
Límites de la plataforma
| Límite | Valor |
|---|---|
Llamadas plot() | 64 |
Llamadas request.*() | 40 |
| Tamaño del script | 80,000 tokens |
| Tiempo de bucle | 500 ms |
| Objetos de dibujo | 500 de cada línea/etiqueta/caja (aumentar con max_*_count) |
API añadida desde 2025 — a menudo omitida
| Característica | Lanzamiento |
|---|---|
box.set_xloc() | Mar 2025 |
active en cada input.*() | Jul 2025 |
timeframe_bars_back en time() / time_close() | Oct 2025 |
syminfo.isin | Nov 2025 |
request.footprint(), tipos footprint / volume_row | Ene 2026 |
sort_field en array.sort() / matrix.sort() | Abr 2026 |
Cadenas multilínea """…""" | Abr 2026 |
calc_on_every_history_tick en strategy() | Jul 2026 |
Las reglas también se eliminan: TradingView eliminó las restricciones de sangría para líneas envueltas en diciembre de 2025, por lo que una continuación con sangría de cuatro espacios, o sin sangría alguna, es legal. Consulta las notas de lanzamiento antes de afirmar que un símbolo es inválido.
Estructura del script
//@version=6
indicator("Título", overlay=true) // o strategy(...)
// imports -> tipos -> constantes -> inputs -> funciones
// -> cálculos -> órdenes -> plots -> alertas
Errores comunes de compilación
| Mensaje | Causa |
|---|---|
end of line without line continuation | Espacio en blanco al final después de un operador, o una expresión envuelta rota |
Undeclared identifier | Variable asignada solo dentro de un if; declárala antes con var o un valor por defecto |
Cannot call 'ta.sma' with 'series' donde se requiere simple | El argumento length debe ser simple int — los inputs lo son, los valores de serie no |
Mismatched input ... expecting | Se usó = para reasignación donde se requiere := |