Diga Oi para o Pine Script v5

Oct 7, 2021

Hoje, Pine se formou para a v5! A nova versão de nossa linguagem de programação de indicadores e estratégias traz uma série de novos e interessantes recursos e melhorias. O Pine está agora mais poderoso do que nunca, e as mudanças na v5 nos ajudarão a levar a linguagem a novos patamares. Este post apresenta apenas algumas das últimas funcionalidades disponíveis; não deixe de ler nossas Notas de Lançamento e nosso Guia de Migração.

CONVERSOR v4 PARA v5

Os scripts de Pine existentes que usem versões anteriores do Pine continuarão a funcionar normalmente, mas fornecemos uma ferramenta de conversão no Pine Editor para ajudar os programadores a converter seus scripts v4 para v5. Futuras melhorias no Pine serão implementadas exclusivamente para a v5, por isso recomendamos a conversão de seus indicadores e estratégias se você desejar se beneficiar dos novos recursos. A ferramenta de conversão v4 para v5 está disponível quando um script v4 é carregado no Editor, a partir do menu suspenso Mais:

Observe que nem todo código v4 pode ser convertido automaticamente. Se você encontrar problemas de conversão ou preferir converter seus scripts manualmente, nosso Guia de Migração que documenta todas as mudanças entre v4 e v5 vai te ajudar.

BIBLIOTECAS

Uma importante novidade do Pine que vem com a v5 são as bibliotecas. As bibliotecas são um novo tipo de publicação que permite a criação de funções personalizadas para serem reutilizadas em outros scripts. Uma vez publicada uma biblioteca, outros scripts (sejam indicadores, estratégias ou mesmo outras bibliotecas) podem importá-la e usar suas funções. Você pode usar bibliotecas para incluir algoritmos complexos ou funções freqüentemente utilizadas para que você, ou toda a comunidade Pine, possa facilmente reutilizá-las.

Para começar a trabalhar com bibliotecas, consulte nossa página de Manual do Usuário em bibliotecas. No final deste post, você encontrará exemplos de bibliotecas publicadas por membros de nossa equipe do PineCoders. Você pode ver as bibliotecas publicadas a partir do script feed aqui.

VALORES PADRÃO PARA FUNÇÕES DEFINIDAS PELO USUÁRIO

Uma melhoria que anda de mãos dadas com as bibliotecas: um valor padrão pode ser definido para parâmetros em funções definidas pelo usuário, o que efetivamente os torna opcionais. No exemplo abaixo, declaramos uma função customizada customPow() que eleva a base à potência de exp. Se exp não é especificado quando a função é chamada, 2 é usado:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

SWITCH

A nova declaração de switch é uma novidade na habitual declaração if. Se você já teve que criar uma grande árvore de declarações de if-else, você vai apreciar como é muito mais conveniente alcançar o resultado desejado com switch. Você pode aprender mais sobre isso no nosso Manual de Referência. Veja isso em ação no código abaixo. É nosso indicador incorporado de Média de Amplitude Variação, que agora utiliza uma declaração de switch para fornecer diferentes algoritmos de suavização em seus cálculos:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

COLEÇÕES DE DESENHOS

Uma grande melhoria na qualidade de vida para trabalhar com desenhos Pine: a nova line.all, label.all, box.all, e table.all, todas as variáveis de array embutidas sempre contêm os IDs de todos os desenhos do tipo especificado desenhados por seu script.

Você pode usá-lo, por exemplo, para reduzir o número de desenhos exibidos no gráfico com base em um valor definido pelo usuário. No script abaixo, desenhamos uma linha em cada nova abertura diária (até um limite de ~50, com base no limite padrão da linha do script). Verificamos então se o número de linhas permitidas através das entradas do script foi excedido, e apagamos a linha mais antiga, se for o caso:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

WHILE

Outro recurso há muito esperado do Pine que vem com a v5 é o while looping. A declaração while cria um loop que pára quando a condição é falsa ou quando um comando de quebra (break) é usado no loop.

Como exemplo, aqui está um indicador que calcula a diferença entre a distância média que precisamos procurar no passado para encontrar o volume para cima e para baixo igual ao volume total das últimas n barras. Quanto mais precisamos procurar para trás para encontrar o volume para cima ou para baixo, mais baixo ou alto é seu valor:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

O script do loop while é executado até que o volume requerido seja encontrado tanto em volumes para cima como para baixo, e não procuramos além do número máximo de barras permitido. O script também apresenta outro recurso adicionado ao Pine v5: runtime.error().

RUNTIME.ERROR()

A função runtime.error() agora torna possível interromper a execução de um script e exibir uma mensagem de erro em qualquer condição que você possa definir no Pine. Isto será útil para os criadores de scripts que desejam evitar que os usuários utilizem seus indicadores de forma incorreta. Ele também pode ser usado como uma ferramenta de depuração não ortodoxa, para interromper a execução durante um loop ou de dentro de uma função, por exemplo.

Para usar a nova função, basta chamar a função runtime.error() quando suas condições forem atendidas. Quando ela for executada, ela interromperá o script e exibirá o ponto de exclamação familiar ao lado do nome do indicador. Quando os usuários clicam no ícone do ponto de exclamação, aparecerá a mensagem que você usou na chamada da função.

O código abaixo é um indicador VWAP de barebones com dois erros personalizados. O primeiro aparece quando o símbolo não tem nenhum dado de volume: O VWAP é calculado com base no volume, portanto, se não houver volume, o script não pode funcionar. O segundo aparece quando o intervalo de tempo no gráfico é 1D ou superior. Os cálculos básicos do VWAP acumulam dados de média móvel ponderada por volume em cada nova barra e reinicializam no início de um novo dia, de modo que o indicador só é útil em intervalos de tempo intradiários.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

NOVOS PARÂMETROS DE ESTRATÉGIA

Boas notícias para programadores de estratégia! Adicionamos um monte de novas variáveis e funções que lhe dão acesso a detalhes sobre propriedades de negociação, estatísticas e métricas. Seus valores são atualizados à medida que a corretora emuladora executa suas ordens, para que você possa acompanhar os valores à medida que sua estratégia avança.

Clique aqui para ver o Manual de Referência do Pine para detalhes sobre cada um deles

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

NOVOS NAMESPACES

Nossa comunidade de programadores de Pine nos diz que eles apreciam a taxa sem precedentes de adições que fizemos ao Pine nos últimos anos, e pretendemos manter o mesmo ritmo no futuro. Isto, entretanto, cria um fluxo constante de novas funções e variáveis incorporadas ao Pine. Para suportar este crescimento absurdo, precisávamos organizar melhor os ~600 nomes atuais usados na linguagem. Fizemos isso adicionando novos namespaces para agrupar funções de forma a melhor refletir seu uso. Muitos nomes de parâmetros de funções também foram renomeados para torná-los mais fáceis de entender.

Um exemplo de um novo namespace é ta., que agora inclui todas as variáveis e funções relacionadas à análise técnica. Isto facilita a navegação no Manual de Referência e encontra todas as variáveis e funções que retornam os valores dos indicadores correspondentes. Assim, sma() é agora ta.sma(). Não é necessário lembrar os novos namespaces; se você digitar o nome antigo de uma função sem seu namespace no Editor e pressionar a tecla de atalho Autocompletar (Ctrl + Espaço, ou Cmd + Espaço no MacOS), aparece um popup mostrando sugestões de correspondência:

O mesmo vale quando se pesquisa no Manual de Referência; digitando um nome de uma função conhecida sem seu namespace, será possível obter seu novo nome. Você pode ver a lista completa de mudanças para a v5 em nosso Guia de Migração.

BIBLIOTECAS PUBLICADAS

As seguintes publicações são exemplos de bibliotecas publicadas no TradingView pelos PineCoders que nos ajudam a testar novos recursos do Pine:

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Esperamos que você considere úteis as novas funções. E, por favor, continue nos enviando comentários e sugestões — estamos construindo o TradingView para você, e estamos sempre interessados em saber o que você acha das atualizações de nossa plataforma.

Look first Then leap

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