Dicas Práticas

Dicas e truques úteis

Otimização de Performance

Dicas de Performance

1. Evite loops desnecessários

Use funções built-in quando possível:

// ❌ Lento
sum = 0.0
for i = 0 to length - 1
    sum += close[i]

// ✅ Rápido
sum = math.sum(close, length)

2. Use var para variáveis persistentes

// ❌ Recalcula todo bar
contador = 0
if condicao
    contador := contador + 1  // Sempre 0 ou 1

// ✅ Mantém valor
var int contador = 0
if condicao
    contador := contador + 1  // Acumula

3. Evite request.security() em loops

Cada chamada é custosa. Calcule fora do loop.

4. Use nz() para evitar propagação de na

valor = nz(calculoQuePodeSerNa, 0)

5. Limite labels e lines

indicator(..., max_labels_count=50, max_lines_count=50)

Erros Comuns

Erros Comuns e Soluções

1. Loop com comprimento variável

// ❌ Erro: length deve ser const/input
for i = 0 to seriesValue
    
// ✅ Solução: use max_bars_back
for i = 0 to math.min(seriesValue, 100)

2. Plotar condicionalmente

// ❌ Erro: plot() não pode estar em if
if condição
    plot(valor)
    
// ✅ Solução: use cor condicional
plot(condição ? valor : na)

3. Comparar com na

// ❌ Problemático
if valor == na

// ✅ Correto
if na(valor)

4. Funções em blocos condicionais

// ❌ Problemático: SMA pode não executar em todas as barras
if condição
    minhaSma = ta.sma(close, 20)
    
// ✅ Correto: Pré-calcule
minhaSma = ta.sma(close, 20)
if condição
    // use minhaSma

5. Ordem de execução

Lembre-se: ordens são executadas na PRÓXIMA barra!

strategy.entry("Long", strategy.long)
// A posição não está aberta neste mesmo bar
// strategy.position_size ainda é 0
Template de Boas Práticas

Estrutura recomendada para scripts

1//@version=6
2indicator("Template Boas Práticas", overlay=true, max_labels_count=50)
3
4// ═══════════════════════════════════════════════
5// ░░░░░░░░░░░░░░░ INPUTS ░░░░░░░░░░░░░░░░░░░░░░░
6// ═══════════════════════════════════════════════
7
8// Grupo: Parâmetros Principais
9length = input.int(20, "Período", minval=1, group="Parâmetros")
10source = input.source(close, "Fonte", group="Parâmetros")
11
12// Grupo: Visual
13showSignals = input.bool(true, "Mostrar Sinais", group="Visual")
14bullColor = input.color(color.green, "Cor Alta", group="Visual")
15bearColor = input.color(color.red, "Cor Baixa", group="Visual")
16
17// ═══════════════════════════════════════════════
18// ░░░░░░░░░░░░░░░ FUNÇÕES ░░░░░░░░░░░░░░░░░░░░░░
19// ═══════════════════════════════════════════════
20
21// Função bem documentada
22//@function Calcula a tendência baseada em SMA
23//@param src Série de preços
24//@param len Período da média
25//@returns 1 para alta, -1 para baixa, 0 para lateral
26calcTrend(float src, int len) =>
27    sma = ta.sma(src, len)
28    src > sma ? 1 : src < sma ? -1 : 0
29
30// ═══════════════════════════════════════════════
31// ░░░░░░░░░░░░░░░ CÁLCULOS ░░░░░░░░░░░░░░░░░░░░░
32// ═══════════════════════════════════════════════
33
34// Pré-calcular indicadores (fora de condicionais)
35smaLine = ta.sma(source, length)
36trend = calcTrend(source, length)
37
38// Variáveis persistentes
39var int trendBars = 0
40trendBars := trend == trend[1] ? trendBars + 1 : 1
41
42// Condições
43bullish = trend == 1
44bearish = trend == -1
45trendChange = trend != trend[1]
46
47// ═══════════════════════════════════════════════
48// ░░░░░░░░░░░░░░░ VISUALIZAÇÃO ░░░░░░░░░░░░░░░░░
49// ═══════════════════════════════════════════════
50
51// Plots
52plot(smaLine, "SMA", bullish ? bullColor : bearColor, 2)
53
54// Sinais condicionais
55plotshape(showSignals and trendChange and bullish, "Bull", shape.triangleup, location.belowbar, bullColor, size=size.small)
56plotshape(showSignals and trendChange and bearish, "Bear", shape.triangledown, location.abovebar, bearColor, size=size.small)
57
58// Background sutil
59bgcolor(color.new(bullish ? bullColor : bearish ? bearColor : color.gray, 95))