Novas Funcionalidades em Pine Script: str.format() e array.from()

May 21, 2021

Esta atualização da linguagem Pine Script acrescenta funções para trabalhar com strings e arrays.

A função str.format() permite converter os argumentos passados a ela em uma string com um formato especificado:

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

O formatString inclui um subscript N entre parênteses “{}” para substituir os argumentos formatados correspondentes (arg0, arg1..argN, que são strings ou números), e alguns dos padrões discutidos abaixo.

Portanto, para analisar as strings, não é mais necessário usar uma construção usando a função 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)

mas você pode fazer isso de uma maneira nova, mais conveniente e mais curta:

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

Os subscripts {0} e {1} entre parênteses são substituídos com os argumentos ordinais correspondentes: {0} – o resultado da execução do operador ternário, a string “comprar” ou “vender”, é devolvida dependendo da diferença de preços fechamento e abertura, {1} – syminfo.ticker, o símbolo atual no gráfico:

Usando o modelo numérico, o número convertido em uma string pode ser convertido em uma representação diferente, por exemplo, para limitar o número de casas decimais

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

Descarte a parte fracionária do número:

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

Obter informações financeiras:

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

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

Obter porcentagens:

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

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

A função str.format() suporta o modelo de data para formatação de data/hora.

Este script exibe o número de meses, semanas e dias desde o início do ano:

//@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)

 

Apenas uma variável de tempo é passada para a função str.format(), que contém a representação de tempo UNIX: a data atual, hora e fuso horário para a troca de um símbolo no gráfico. A string é formatada usando os caracteres Y, M, D, F (ano, mês, dia, semana do mês), o \n caractere especial para quebras de linha, e aspas simples ” para inserir texto entre os caracteres.

Este script produz strings formatadas para o rótulo e o resultado correspondente da função str.format() com vários 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))

A coluna da esquerda do rótulo contém os caracteres contidos em {}, a da direita é o resultado da função str.format():

A variável t é passada para a função str.format(), que contém a representação da hora UNIX: a data atual, a hora e o fuso horário.

A próxima inovação é a função array.from(), que leva um número variável de argumentos de entrada de um dos seguintes tipos: float, int, bool, string, label, line, color e retorna um array do tipo correspondente. A função permite declarar um array, atribuir valores iniciais a ele e atribuir o resultado a qualquer variável em apenas uma linha de código.

Anteriormente, para criar um array e preenchê-lo com valores iniciais, você tinha que usar a função array.new() e as funções array.push() ou array.set():

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

Agora, para criar um array que conterá as cores dos gráficos, você pode conseguir com apenas uma linha:

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

A função automaticamente lançará o array de plotColors para o tipo de cor[] com base nos argumentos recebidos:

//@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))

Informações sobre estas funções str.format() e array.from() estão sempre disponíveis em nosso manual de referência.

Se você gostaria de saber sobre atualizações do Pine Script, confira a seção Notas de Lançamento. A conta do PineCoders também transmite atualizações em seu canal Squawk Box Telegram, Twitter e o chat público do Pine Script no TradingView.

Esperamos que você considere estas melhorias úteis e, por favor, continue a compartilhar sua opinião conosco. Estamos construindo o TradingView para nossos usuários e adoramos ouvir o que você pensa sobre nossas inovações.

Look first Then leap

TradingView is built for you, so make sure you're getting the most of our awesome features
Launch Chart