Hoy nos complace anunciar el lanzamiento de Pine Script® v6. Esta versión mejorada de nuestro lenguaje de programación centrado en los operadores incluye una serie de optimizaciones y mejoras de funciones largamente solicitadas, que ofrecen una mayor eficiencia y utilidad a los programadores de Pine Script®, preparando el terreno para llevar el lenguaje a nuevas cotas.
En este artículo se describen algunas de las mejoras más destacadas de Pine v6. Consulte nuestras Notas de la versión para obtener más información sobre las novedades de la v6 y mantenerse al día sobre futuras mejoras.
Herramienta de conversión v6
Al igual que con los cambios de versiones anteriores, las actualizaciones incluidas en Pine v6 no afectan a los scripts personales o publicados escritos en versiones anteriores de Pine. Todas las nuevas funciones a partir de este momento se implementarán exclusivamente en la última versión de Pine, por lo que recomendamos convertir sus scripts a v6 si desea acceder a las nuevas funciones. El método más sencillo es utilizar nuestra nueva herramienta de conversión a v6, que puede activar seleccionando «Convertir código a v6» en el menú «Gestionar script» del Editor de Pine.
Tenga en cuenta que no todos los scripts pueden convertirse a la v6 automáticamente y que, en algunos casos, es necesario realizar ediciones manuales para garantizar que el script convertido funciona como se espera. Si tiene problemas con la conversión automática o prefiere convertir sus scripts a v6 manualmente, consulte nuestra práctica Guía de migración.
Solicitudes dinámicas
TradingView proporciona acceso a decenas de miles de símbolos de instrumentos negociables, métricas financieras e indicadores económicos de todo el mundo. La familia de funciones request.*() permite a los scripts de Pine recuperar datos de cualquier símbolo disponible en distintos intervalos de tiempo, independientemente del símbolo y el intervalo de tiempo utilizados por el gráfico.
Estas funciones son potentes utilidades con numerosos casos de uso. Sin embargo, antes tenían una limitación importante: requerían el uso de valores de «cadena simple» para especificar el símbolo y el intervalo de tiempo de la solicitud, lo que significaba que el contexto tenía que conocerse en la primera barra y no podía cambiar después. Además, todas las llamadas a request.*() debían ejecutarse estrictamente en el ámbito global del script. En otras palabras, cualquier instancia de request.*() en el código solo podía obtener datos para un símbolo y un intervalo de tiempo, y no se permitían llamadas a request.*() dentro de bucles, estructuras condicionales o funciones de biblioteca exportadas.
En Pine Script® v6, hemos eliminado estas limitaciones. Ahora, los scripts pueden utilizar valores de «cadena de serie» para definir el contexto de cualquier llamada a request.*(). Además, ahora se permiten las llamadas request.*() dentro de ámbitos locales. Con estos cambios, puede calcular o modificar símbolos en cualquier barra histórica y solicitar sus datos dinámicamente, crear colecciones de símbolos y obtener sus datos dentro de bucles, y hacer muchas otras cosas con las funciones request.*() que antes no eran posibles. Consulte la sección Peticiones dinámicas de nuestro Manual de usuario para obtener más información.
Para ver un ejemplo de lo que se puede hacer con peticiones dinámicas, eche un vistazo al funcionamiento interno del indicador de Rendimiento incorporado. Divide listas separadas por comas de cadenas de símbolos e intervalos de tiempo en matrices y, a continuación, llama a request.security() dinámicamente dentro de bucles para obtener valores de cada conjunto de datos. En el pasado, una secuencia de comandos como ésta habría requerido múltiples llamadas a input.symbol() y input.timeframe() y cada combinación de símbolo-tiempo habría requerido una llamada a request.security() separada en el código:
Como referencia adicional, consulte estos scripts publicados por la cuenta TradingView, que también utilizan solicitudes dinámicas para obtener datos de otros contextos.
- Mapa de calor de divisas. Este indicador crea identificadores de ticker para combinaciones de pares de divisas basándose en una lista de códigos de divisas especificada por el usuario. Solicita dinámicamente datos para cada combinación de pares dentro de bucles y, a continuación, utiliza los datos para rellenar una tabla codificada por colores.
- Ticker tape. Este indicador crea una matriz de identificadores de tape a partir de una lista de símbolos definida por el usuario. Solicita dinámicamente información sobre el precio y el cambio diario para cada ID de ticker de la matriz dentro de un bucle y, a continuación, utiliza los datos para actualizar una pantalla de «cinta» giratoria.
- Biblioteca COT. Anteriormente, esta biblioteca solo proporcionaba herramientas para crear identificadores de ticker para solicitar datos del Commitment of Traders (COT) de la CFTC porque las bibliotecas no podían exportar funciones que contuvieran llamadas a request.*() Con las solicitudes dinámicas, esta limitación ya no se aplica. La biblioteca exporta ahora una función requestCommitmentOfTraders() que llama internamente a request.security() para recuperar datos COT directamente, proporcionando más comodidad y versatilidad a los programadores.
Además, todos los códigos de informe CFTC se mantenían anteriormente dentro de sentencias switch para devolver valores «simples», limitando significativamente los tickers disponibles para solicitud. Con las solicitudes dinámicas, ya no se necesitan identificadores de cinta de «cadena simple», lo que permite a la biblioteca almacenar códigos de informe en un mapa y ofrecer compatibilidad con más símbolos.
Optimización booleana
Una de las mejoras más notables en Pine Script® v6 puede no ser evidente en la superficie, pero es probable que note una diferencia en la eficiencia del código. Hemos rediseñado la implementación interna de los valores «bool» en Pine y hemos introducido la evaluación de cortocircuito (o «relajada»), permitiendo que las operaciones y y o dejen de evaluar expresiones adicionales cuando no son necesarias para determinar el resultado.
Estos cambios mejoran el rendimiento de la mayoría de los scripts en TradingView. La diferencia en la eficiencia es especialmente notable con scripts relativamente grandes que dependen en gran medida de las condiciones y utilizan muchos valores «bool», como confirmamos en nuestras pruebas con algunos de los Scripts de la comunidad de código abierto más populares.
Como ventaja adicional, la evaluación «bool» relajada a menudo permite un código más limpio y conciso. Por ejemplo, si tiene una condición que depende de elementos de un array, puede que tenga que comprobar el tamaño del array para asegurarse de que el índice del elemento existe, ya que el script se detendrá y generará un error si el índice está fuera de los límites. Pine v6, con su evaluación relajada, le permite crear una única expresión condicional que comprueba la matriz antes de intentar acceder a un elemento, lo que no era posible en v5.
//@version=6 indicator("Lazy evaluation demo") //@variable A "bool" array without a fixed size. array<bool> myArray = array.new<bool>() // Push a new value into `myArray` when the `close` is above the `open`. if close > open myArray.push(true) // Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`. // It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`. if myArray.size() != 0 and myArray.first() label.new(bar_index, high, "Test")
Tamaño y formato del texto
Todos los tipos de dibujo que muestran texto (cuadros, etiquetas y tablas) pueden utilizar ahora tamaños de texto especificados en puntos tipográficos, los mismos puntos que se utilizan en los editores de texto estándar. Antes, había que elegir entre constantes arbitrarias size.*, como size.large (24) y size.huge (36). Ahora, con la nueva especificación de puntos tipográficos, puede asegurarse de que el tamaño del texto es exactamente el que desea. Incluso puede crear tamaños de texto masivos que eran imposibles de conseguir en versiones anteriores de Pine.
Además, hemos introducido un nuevo parámetro text_formatting para estos tipos de dibujo, que puede utilizar para que el texto aparezca en cursiva, negrita o ambas.
//@version=6 indicator("Text size showcase", overlay = true) var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1) if barstate.islastconfirmedhistory t.cell(0, 0, "text_size = size.huge", text_size = size.huge) t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
Estrategia de recorte de órdenes
Los usuarios de scripts de estrategias activas deben saber que en Pine v5, una estrategia puede simular hasta 9000 operaciones antes de detener sus cálculos y generar un error, a menos que esté utilizando el modo Backtesting profundo. Esta limitación es especialmente inconveniente para las estrategias que simulan operaciones frecuentes y crean disparadores de alerta.
En Pine Script® v6, las estrategias ya no detienen el cálculo ni generan un error tras alcanzar el límite de 9000 operaciones. En su lugar, la estrategia recorta las órdenes más antiguas para hacer espacio para las nuevas. Las órdenes recortadas no aparecen en el Probador de estrategias, pero la estrategia continúa sus cálculos sin problemas. Para comprobar el índice de operación de la orden más antigua no recortada, puede utilizar la nueva variable strategy.closedtrades.first_index. El índice se puede utilizar como el argumento trade_num en las llamadas a la función strategy.closedtrades.*().
Índices de array negativos
En Pine v6, las funciones array.get(), array.set(), array.insert(), y array.remove() ahora pueden aceptar argumentos de index para referenciar elementos empezando por el final de un array, ofreciendo una forma más concisa y cómoda de referenciar elementos de un array en orden inverso. Por ejemplo, la llamada array.get(myArray, -2) recupera el penúltimo elemento de myArray, que equivale a array.get(myArray, array.size(myArray) – 2).
Para estar al día de las últimas mejoras de la experiencia Pine Script®, eche un vistazo a las notas de la versión del Manual del usuario: su sección v6 incluye incluso algunos cambios adicionales que no se han incluido en esta entrada del blog.
Esperamos que estas funciones le resulten tan útiles como creemos que serán, y le rogamos que siga enviándonos sus comentarios y sugerencias para que podamos hacer que la plataforma sea lo mejor posible. Construimos TradingView para usted, y siempre estamos dispuestos a escuchar sus opiniones.
– Equipo TradingView