Gestão de Risco
Stop loss, take profit e position sizing
Neste capítulo
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 / distanciaStopFórmula de Kelly (Simplificada)
Para traders mais avançados:
// f* = (bp - q) / b
// onde b = odds, p = probabilidade de ganho, q = 1 - pPosiçã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)