Se você já tentou marcar sinais de compra e venda direto no gráfico do TradingView, provavelmente esbarrou nas funções label.new e label.delete do Pine Script. Elas são simples na superfície, mas têm detalhes — limite de labels, persistência entre barras e gerenciamento de memória — que derrubam o script de quem está começando. Este guia mostra, de forma honesta e direta, como usar as duas funções de verdade no Pine Script v5/v6, com código que você pode copiar e testar hoje.

Quer transformar esses sinais visuais em execução automática numa corretora de opções? Veja como conectar análise e robô:

Ver bot e API Quotex em Python →

O que faz cada função

De forma curta: label.new() cria uma etiqueta (label) no gráfico e retorna um identificador do tipo label. label.delete() recebe esse identificador e remove a etiqueta. Você praticamente sempre usa as duas juntas: cria quando aparece um sinal e apaga as antigas para não poluir o gráfico nem estourar o limite.

Limite importante: o TradingView permite no máximo 500 labels por indicador (ajustável via max_labels_count, até 500). Se você criar uma label a cada barra sem apagar, o script some com os desenhos mais antigos sem avisar.

Exemplo 1: marcar todo cruzamento de EMAs

O caso mais comum. Aqui criamos uma label de COMPRA quando a EMA rápida cruza para cima e VENDA quando cruza para baixo:

//@version=5 indicator(“Sinais com Labels”, overlay=true, max_labels_count=500) emaRapida = ta.ema(close, 9) emaLenta = ta.ema(close, 21) compra = ta.crossover(emaRapida, emaLenta) venda = ta.crossunder(emaRapida, emaLenta) plot(emaRapida, color=color.aqua) plot(emaLenta, color=color.orange) if compra label.new(bar_index, low, text=”COMPRA”, style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) if venda label.new(bar_index, high, text=”VENDA”, style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)

Os argumentos principais de label.new são a posição x (normalmente bar_index), a posição y (um preço, como high ou low), o text, o style (formato e direção da seta), e as cores. size aceita size.tiny até size.huge.

Exemplo 2: manter só a última label (o uso real de label.delete)

Em muitos casos você não quer um histórico inteiro de etiquetas, e sim apenas a mais recente. O padrão é guardar o identificador numa variável var (que persiste entre barras) e apagar a anterior antes de criar a nova:

//@version=5 indicator(“Ultima label apenas”, overlay=true) emaRapida = ta.ema(close, 9) emaLenta = ta.ema(close, 21) sinal = ta.crossover(emaRapida, emaLenta) or ta.crossunder(emaRapida, emaLenta) // var faz a variavel sobreviver de uma barra para outra var label ultima = na if sinal label.delete(ultima) // apaga a anterior (na e ignorado sem erro) ehCompra = ta.crossover(emaRapida, emaLenta) ultima := label.new(bar_index, ehCompra ? low : high, text = ehCompra ? “COMPRA” : “VENDA”, style = ehCompra ? label.style_label_up : label.style_label_down, color = ehCompra ? color.green : color.red, textcolor = color.white)
Detalhe que evita bug: label.delete(na) não gera erro. Por isso você pode chamar delete antes mesmo de ter criado a primeira label, sem precisar de um if not na(ultima).

Exemplo 3: limitar o histórico com um array

Se você quer manter, digamos, as últimas 5 labels e apagar automaticamente as mais velhas, guarde os identificadores num array<label>:

//@version=5 indicator(“Ultimas 5 labels”, overlay=true) var labels = array.new<label>() maxLabels = 5 if ta.crossover(ta.ema(close,9), ta.ema(close,21)) lb = label.new(bar_index, low, “COMPRA”, style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) array.push(labels, lb) if array.size(labels) > maxLabels antiga = array.shift(labels) // tira a mais antiga do array label.delete(antiga) // e apaga do grafico

Erros comuns que travam o script

O primeiro é criar labels fora de um if, fazendo uma por barra e atingindo o limite. O segundo é esquecer o var e perder o identificador a cada barra — aí o label.delete nunca encontra a etiqueta certa. O terceiro é tentar modificar uma label já apagada: depois de label.delete, qualquer label.set_text naquele id gera erro de runtime. Se precisa só atualizar o texto/posição de uma label fixa, prefira label.set_* em vez de apagar e recriar.

Dica de performance: apagar e recriar é mais pesado do que atualizar. Para uma label que mostra preço atual ou contagem, crie uma vez com var e use label.set_xy e label.set_text nas barras seguintes.

FAQ

label.new funciona igual no v5 e no v6? Sim. A assinatura e o comportamento de label.new e label.delete são os mesmos. O v6 trouxe melhorias de tipos e desempenho, mas o código acima roda nas duas versões.

Posso usar texto dinâmico, como o preço? Pode. Use str.tostring(close, format.mintick) dentro do text para mostrar valores formatados.

Por que minhas labels antigas somem sozinhas? É o limite de 500. Aumente com max_labels_count=500 no indicator() ou gerencie com array, como no Exemplo 3.

label.new envia ordens para a corretora? Não. Labels são apenas desenho visual no gráfico. Para executar operações de verdade você precisa de uma estratégia (strategy) em backtest ou de uma ponte externa via API/robô.

Aviso: opções binárias e trading alavancado são produtos de alto risco e podem levar à perda total do capital. Este conteúdo é educacional, não constitui recomendação de investimento nem promessa de resultado. Indicadores e scripts não garantem lucro. Teste sempre em conta demo antes de usar dinheiro real.