Hoje, temos o prazer de anunciar o lançamento do Pine Script® v6! Essa versão atualizada de nossa linguagem de programação voltada para o trader inclui uma variedade de otimizações e aprimoramentos de recursos há muito tempo solicitados, oferecendo maior eficiência e utilidade aos programadores do Pine Script®, preparando o terreno para levar a linguagem a novos patamares.
Esta postagem descreve alguns dos aprimoramentos mais notáveis do Pine v6. Consulte nossas notas de Versão para saber mais sobre as novidades da v6 e manter-se atualizado sobre os melhorias futuras.
Ferramenta de conversão da v6
Assim como nas alterações de versões anteriores, as atualizações incluídas no Pine v6 não afetam scripts pessoais ou publicados escritos em versões anteriores do Pine. Todos os novos recursos a partir de agora serão implementados exclusivamente na versão mais recente do Pine, portanto, recomendamos que você converta seus scripts para a v6 se quiser acessar os novos recursos. O método mais fácil é usar nossa nova ferramenta de conversão para a v6, que pode ser ativada selecionando “Converter código para a v6″ no menu “Gerenciar script” do Pine Editor.

Observe que nem todos os scripts podem ser convertidos para a v6 automaticamente e, em alguns casos, são necessárias edições manuais para garantir que o script convertido funcione conforme o esperado. Se você encontrar problemas com a conversão automática ou preferir converter seus scripts para a v6 manualmente, consulte nosso prático guia de Migração.
Solicitações dinâmicas
O TradingView fornece acesso a dezenas de milhares de símbolos para instrumentos negociáveis, métricas financeiras e indicadores econômicos de todo o mundo. A família de funções request.*() permite que os scripts Pine recuperem dados de qualquer símbolo disponível em diferentes tempos gráficos, independentemente do símbolo e do tempo gráfico usados pelo gráfico.
Essas funções são utilitários poderosos com vários casos de uso. No entanto, antes elas tinham uma limitação significativa: exigiam o uso de valores de “string simples” para especificar o símbolo e o tempo gráfico da solicitação, o que significa que o contexto tinha de ser conhecido na primeira barra e não poderia mudar depois. Além disso, todas as chamadas request.*() eram forçadas a serem executadas estritamente no escopo global do script. Em outras palavras, qualquer instância request.*() no código poderia buscar dados de apenas um símbolo e tempo gráfico, e nenhuma chamada request.*() era permitida dentro de loops, estruturas condicionais ou funções de biblioteca exportadas.
No Pine Script® v6, removemos essas limitações. Agora, os scripts podem usar valores de “series string” para definir o contexto de qualquer chamada request.*(). Além disso, as chamadas request.*() agora são permitidas dentro de escopos locais. Com essas alterações, você pode calcular ou modificar símbolos em qualquer barra histórica e solicitar seus dados dinamicamente, criar coleções de símbolos e buscar seus dados em loops e fazer muitas outras coisas com as funções request.*() que antes não eram possíveis. Consulte a seção Solicitações Dinâmicas do nosso Manual do usuário para saber mais.
Para obter um exemplo do que você pode fazer com solicitações dinâmicas, confira o funcionamento interno do indicador de Performance built-in. Ele divide listas separadas por vírgulas de strings de símbolo e tempo gráfico em arrays e, em seguida, chama request.security() dinamicamente dentro de loops para buscar valores de cada conjunto de dados. No passado, um script como esse exigiria várias chamadas input.symbol() e input.timeframe(), e cada combinação de símbolo e período exigiria uma chamada request.security() separada no código:

Como referência adicional, confira estes scripts publicados pela conta do TradingView, que também utilizam solicitações dinâmicas para buscar dados de outros contextos.
- Mapa de Calor de Forex. Esse indicador cria IDs de ticker para combinações de pares de moedas com base em uma lista de códigos de moeda especificada pelo usuário. Ele solicita dinamicamente dados para cada combinação de pares dentro de loops e, em seguida, usa os dados para preencher uma tabela codificada por cores.

- Ticker Tape. Esse indicador cria uma matriz de IDs de ticker a partir de uma lista de símbolos definida pelo usuário. Ele solicita dinamicamente informações de preço e alteração diária para cada ID de ticker da array dentro de um loop e, em seguida, usa os dados para atualizar uma exibição de “tape” rotativa.

- LibraryCOT. Anteriormente, essa biblioteca fornecia apenas ferramentas para criar IDs de ticker para solicitar dados do CFTC Commitment of Traders (COT) porque as bibliotecas não podiam exportar funções que contivessem chamadas request.*(). Com as solicitações dinâmicas, essa limitação não se aplica mais. A biblioteca agora exporta uma função requestCommitmentOfTraders() que chama request.security() internamente para recuperar dados COT diretamente, proporcionando mais conveniência e versatilidade aos programadores.

Além disso, todos os códigos de relatório CFTC eram mantidos anteriormente dentro de instruções switch para retornar valores “simples”, limitando significativamente os tickers disponíveis para solicitação. Com as solicitações dinâmicas, as IDs de ticker de “string simples” não são mais necessárias, permitindo que a biblioteca armazene códigos de relatório em um mapa e ofereça suporte a mais símbolos.
Otimização booleana
Uma das melhorias mais notáveis no Pine Script® v6 pode não ser aparente, mas você provavelmente notará uma diferença na eficiência do código. Reformulamos a implementação interna dos valores “bool” no Pine e introduzimos a avaliação de curto-circuito (ou “preguiçosa”), permitindo que as operações and e or parem de avaliar outras expressões quando não forem necessárias para determinar o resultado.
Essas alterações melhoram o desempenho da maioria dos scripts no TradingView. A diferença na eficiência é especialmente perceptível em scripts relativamente grandes que dependem muito de condições e usam muitos valores “bool”, como confirmamos em nossos testes em alguns dos scripts Comunitários de código aberto mais populares.
Como bônus, a avaliação preguiçosa de “bool” geralmente permite um código mais limpo e conciso. Por exemplo, se você tiver uma condição que dependa de itens de um array, talvez seja necessário verificar o tamanho do array para garantir que o índice do item exista, pois o script será interrompido e gerará um erro se o índice estiver fora dos limites. O Pine v6, com sua avaliação lazy, permite criar uma única expressão condicional que verifica o array antes de tentar acessar um elemento, o que não era possível na 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")
Tamanho e formatação do texto
Todos os tipos de desenho que exibem texto (caixas, rótulos e tabelas) agora podem usar tamanhos de texto especificados em pontos tipográficos — os mesmos pontos usados em editores de texto padrão. Anteriormente, você teria que escolher entre constantes arbitrárias size.*, como size.large (24) e size.huge (36). Agora, com a nova especificação de ponto tipográfico, você pode garantir que o tamanho do texto seja exatamente como você deseja. Você pode até mesmo criar tamanhos de texto enormes que eram impossíveis de obter nas versões anteriores do Pine.
Além disso, introduzimos um novo parâmetro text_formatting para esses tipos de desenho, que você pode usar para tornar o texto em itálico, negrito ou ambos.

//@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)
Ordem de estratégia aparada
Os usuários ativos de scripts de estratégia devem saber que, no Pine v5, uma estratégia pode simular até 9.000 negociações antes de interromper os cálculos e gerar um erro, a menos que você esteja usando o modo de Backtesting Profundo. Essa limitação é especialmente inconveniente para estratégias que simulam negociações frequentes e criam acionadores de alerta.
No Pine Script® v6, as estratégias não param mais de calcular ou geram um erro depois de atingir o limite de 9.000 negociações. Em vez disso, a estratégia corta as ordens mais antigas para abrir espaço para as novas. As ordens cortadas não aparecem no Testador de Estratégias, mas a estratégia continua seus cálculos sem problemas. Para verificar o índice de negociação da ordem mais antiga não aparada, você pode usar a nova variável strategy.closedtrades.first_index. O índice pode ser usado como o argumento trade_num nas chamadas de função strategy.closedtrades.*().
Índices de array negativos
No Pine v6, as funções array.get(), array.set(), array.insert() e array.remove() agora podem aceitar argumentos de índice negativo para fazer referência a itens a partir do final de um array, oferecendo uma maneira mais concisa e conveniente de fazer referência a elementos do array na ordem inversa. Por exemplo, a chamada array.get(myArray, -2) recupera o penúltimo elemento de myArray, o que é equivalente a array.get(myArray, array.size(myArray) – 2).
Para se manter atualizado sobre os mais recentes aprimoramentos na experiência do Pine Script®, fique de olho nas notas de Versão do Manual do usuário — a seção v6 inclui até mesmo algumas alterações adicionais que não foram incluídas nesta publicação do blog.
Esperamos que você considere esses recursos tão úteis quanto achamos que serão e, por favor, continue nos enviando seus comentários e sugestões para que possamos tornar a plataforma a melhor possível. Criamos o TradingView para você e estamos sempre dispostos a ouvir suas opiniões.
— Team TradingView