May 21, 2021

Nuevas funciones en Pine Script: str.format() y array.from()

Esta actualización del lenguaje Pine Script añade funciones para trabajar con cadenas y matrices.

La función str.format() permite convertir los argumentos que se le pasan en una cadena con un formato determinado:

str.format(formatString, arg0, arg1, ...) -> string

El formatString incluye un subíndice N entre paréntesis «{}» para sustituir los argumentos formateados correspondientes (arg0, arg1..argN, que son cadenas o números), y algunos de los patrones que se comentan a continuación.

Así, para analizar cadenas, ya no es necesario utilizar una construcción con la función str.replace_all():

txt := "Time to {0} some {1}!"

txt := str.replace_all(txt, "{0}", close > open ? "buy" : "sell")

txt := str.replace_all(txt, "{1}", syminfo.ticker)

pero puede hacerlo de una forma nueva, más cómoda y corta:

txt = str.format("Time to {0} some {1}!", close > open ? "buy" : "sell", syminfo.ticker)

Los subíndices {0} y {1} encerrados entre paréntesis se sustituyen por los argumentos ordinales correspondientes: {0} – el resultado de la ejecución del operador ternario, la cadena «buy» o «sell«, se devuelve en función de la desigualdad de los precios de cierre y apertura, {1}syminfo.ticker, el símbolo actual en el gráfico:

Utilizando la plantilla de number, el número convertido a una cadena puede ser convertido a una representación diferente, por ejemplo, para limitar el número de decimales

str.format("{0,number,#.#}", 1.34) // returns: 1.3

Descarta la parte fraccionaria del número:

str.format("{0,number,integer}", 1.34) // returns: 1

Obtenga información financiera:

str.format("The cash turnover amounted to {0,number,currency}", 1340000) 

// “The cash turnover amounted to $1,340,000.00”.

Obtenga porcentajes:

str.format("Expected return is {0,number,percent} - {1,number,percent}", 0.1, 0.2)  

// returns: Expected return is 10% - 20%. 

La función str.format() admite la plantilla date para formatear la fecha/hora.

Este script muestra el número de meses, semanas y días desde el comienzo del año:

//@version=4
study("str_format_date")

//formatting string with date pattern
txt = str.format("Current bar date: {0,date, Y-MM-d'.' \n M 'months \n' F 'weeks \n' D 'days \n from the beginning of the year' }", timenow)

//printing label
var l1 = label.new(na, na, color = #FFFFFF00)
label.set_x(l1, bar_index)
label.set_yloc(l1, yloc.belowbar)
label.set_text(l1, txt)

plot(close)

Sólo se pasa una variable timenow a la función str.format(), que contiene la representación de la hora UNIX: la fecha, la hora y la zona horaria actuales para el intercambio de un símbolo en el gráfico. La cadena se formatea utilizando los caracteres Y, M, D, F (año, mes, día, semana del mes), el carácter especial \n para los saltos de línea, y las comillas simples » para insertar texto entre caracteres.

Este script da salida a las cadenas formateadas en la etiqueta y al resultado correspondiente de la función str.format() con varios caracteres:

//@version=4
study("str_format_date_time")

// creating date-time variable: 2021.05.04. 14:30:59
t = timestamp("GMT+0", 2021, 05, 04, 14, 30, 59)

// function for left side of the label
f_print_left(_text)  => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_right, color.green, size.large, text.align_right), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

// function for right side of the label
f_print_right(_text) => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_left, color.red, size.large, text.align_left), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

var string format = 
  "{0,date,y.MM.dd hh:mm:ss}\n" +
  "{1,date,short}\n" +
  "{2,date,medium}\n" +
  "{3,date,long}\n" +
  "{4,date,full}\n" +
  "{5,date,h a z (zzzz)}\n" +
  "{6,time,short}\n" +
  "{7,time,medium}\n" +
  "{8,time,long}\n" +
  "{9,time,full}\n" + 
  "{10,time,hh:mm:ss}\n" +
  "{11,time,HH:mm:ss}\n"

// printing format string 
f_print_left(format)
//printing formatted string
f_print_right(str.format(format, t, t, t, t, t, t, t, t, t, t, t, t))

La columna izquierda de la etiqueta contiene los caracteres encerrados en {}, la derecha es el resultado de la función str.format:

La variable t se pasa a la función str.format(), que contiene la representación de la hora UNIX: la fecha, la hora y la zona horaria actuales.

La siguiente innovación es la función array.from(), que toma un número variable de argumentos de entrada de uno de los siguientes tipos: float, int, bool, string, label, line, color y devuelve un array del tipo correspondiente. La función permite declarar un array, asignarle valores iniciales y asignar el resultado a cualquier variable en una sola línea de código.

Antes, para crear un array y llenarlo de valores iniciales, había que utilizar la función array.new() y las funciones array.push() o array.set():

color[] plotColors = array.new_color(size=0)
array.push(plotColors, color.red)
array.push(plotColors, color.green)
array.push(plotColors, #0000FF)

Ahora, para crear un array que contenga los colores de los gráficos, puedes arreglártelas con una sola línea:

plotColors = array.from(color.red, color.green, #0000FF)

La función convertirá automáticamente la matriz plotColors al tipo color[] en función de los argumentos recibidos:

//@version=4
study(title="array_from")

f_arr (series1, series2, color1, color2) =>
    [ array.from(series1, series2), array.from(color1, color2) ]

[lines, colors] = f_arr(close, open, color.red, color.green)    

plot ( array.get(lines, 0), color = array.get(colors, 0))
plot ( array.get(lines, 1), color = array.get(colors, 1))

La información sobre estas funciones str.format() y array.from() está siempre disponible en nuestro manual de referencia.

Si quiere conocer las actualizaciones de Pine Script, consulta la sección de Notas de la Versión. La cuenta de PineCoders también difunde las actualizaciones en su canal Squawk Box Telegram, en Twitter y en el chat público de Pine Script en TradingView.

Esperamos que estas mejoras le resulten útiles, y le rogamos que siga compartiendo su opinión con nosotros. Estamos construyendo TradingView para nuestros usuarios, y nos encanta escuchar lo que piense sobre nuestras innovaciones.

Look first / Then leap

Abrir gráfico