Gestão de Risco

Stop loss, take profit e position sizing

Stop Loss e Take Profit

Tipos de Stop

Stop Fixo em Percentual

stopLoss = strategy.position_avg_price * (1 - 0.02)  // 2%
takeProfit = strategy.position_avg_price * (1 + 0.04)  // 4%

Stop Baseado em ATR

O ATR (Average True Range) é uma medida de volatilidade muito usada para definir stops dinâmicos:

atrValue = ta.atr(14)
stopLoss = strategy.position_avg_price - (atrValue * 2)
takeProfit = strategy.position_avg_price + (atrValue * 3)

Trailing Stop

Stop que acompanha o preço:

strategy.exit("Exit", "Long", trail_points=10, trail_offset=5)
Gestão com ATR

Stop dinâmico baseado em volatilidade

1//@version=6
2strategy("Gestão com ATR", overlay=true, initial_capital=10000)
3
4// Parâmetros
5atrLen = input.int(14, "Período ATR")
6atrMult = input.float(2.0, "Multiplicador ATR para Stop")
7rrRatio = input.float(2.0, "Ratio Risco/Retorno")
8
9// Cálculos
10atr = ta.atr(atrLen)
11sma50 = ta.sma(close, 50)
12
13// Sinal de entrada
14longSignal = ta.crossover(close, sma50)
15shortSignal = ta.crossunder(close, sma50)
16
17// Variáveis para níveis
18var float stopLevel = na
19var float targetLevel = na
20
21// Entrada Long
22if longSignal and strategy.position_size == 0
23    stopLevel := close - (atr * atrMult)
24    targetLevel := close + (atr * atrMult * rrRatio)
25    strategy.entry("Long", strategy.long)
26    strategy.exit("Exit Long", "Long", stop=stopLevel, limit=targetLevel)
27
28// Entrada Short
29if shortSignal and strategy.position_size == 0
30    stopLevel := close + (atr * atrMult)
31    targetLevel := close - (atr * atrMult * rrRatio)
32    strategy.entry("Short", strategy.short)
33    strategy.exit("Exit Short", "Short", stop=stopLevel, limit=targetLevel)
34
35// Reset quando não em posição
36if strategy.position_size == 0
37    stopLevel := na
38    targetLevel := na
39
40// Plots
41plot(sma50, "SMA 50", color.blue)
42plot(stopLevel, "Stop", color.red, style=plot.style_linebr)
43plot(targetLevel, "Target", color.green, style=plot.style_linebr)

Position Sizing

Dimensionamento de Posição

O position sizing adequado é crucial para gestão de risco.

Risco Fixo por Trade

Limitar a perda máxima a um percentual do capital:

riskPercent = 0.02  // 2% de risco por trade
capitalRisco = strategy.equity * riskPercent
distanciaStop = close - stopLevel
qtdContratos = capitalRisco / distanciaStop

Fórmula de Kelly (Simplificada)

Para traders mais avançados:

// f* = (bp - q) / b
// onde b = odds, p = probabilidade de ganho, q = 1 - p

Posição Fixa

A mais simples:

strategy.entry("Long", strategy.long, qty=1)

Percentual do Equity

strategy(..., default_qty_type=strategy.percent_of_equity, default_qty_value=10)
Position Sizing Baseado em Risco

Calcular quantidade baseada no risco máximo

1//@version=6
2strategy("Position Sizing por Risco", overlay=true, initial_capital=10000)
3
4// Parâmetros de risco
5riskPercent = input.float(2.0, "Risco por Trade %") / 100
6atrLen = input.int(14, "Período ATR")
7atrMult = input.float(2.0, "Multiplicador ATR")
8
9// Cálculos
10atr = ta.atr(atrLen)
11sma20 = ta.sma(close, 20)
12
13// Sinal
14longSignal = ta.crossover(close, sma20)
15
16// Calcular tamanho da posição baseado no risco
17if longSignal and strategy.position_size == 0
18    // Distância do stop (em preço)
19    stopDistance = atr * atrMult
20    
21    // Capital que podemos arriscar
22    capitalAtRisk = strategy.equity * riskPercent
23    
24    // Quantidade de ações/contratos
25    qty = capitalAtRisk / stopDistance
26    
27    // Níveis
28    stopLevel = close - stopDistance
29    targetLevel = close + (stopDistance * 2)  // 2:1 R:R
30    
31    // Entrada com quantidade calculada
32    strategy.entry("Long", strategy.long, qty=qty)
33    strategy.exit("Exit", "Long", stop=stopLevel, limit=targetLevel)
34
35plot(sma20, "SMA 20", color.blue)