Estratégias: O Básico
Introdução às estratégias e backtesting
Neste capítulo
Declaração de Estratégia
strategy()
A declaração strategy() define seu script como uma estratégia:
strategy(title, shorttitle, overlay, format, precision, scale, pyramiding,
calc_on_order_fills, calc_on_every_tick, max_bars_back, backtest_fill_limits_assumption,
default_qty_type, default_qty_value, initial_capital, currency, slippage, commission_type,
commission_value, process_orders_on_close, close_entries_rule, margin_long, margin_short)Parâmetros Importantes
| Parâmetro | Descrição |
|---|---|
`initial_capital` | Capital inicial para backtest |
`default_qty_type` | Tipo de quantidade (percent_of_equity, fixed, etc.) |
`default_qty_value` | Valor da quantidade |
`commission_type` | Tipo de comissão (percent, cash_per_contract, etc.) |
`commission_value` | Valor da comissão |
`slippage` | Slippage em ticks |
`pyramiding` | Número máximo de entradas na mesma direção |
Execução de Ordens
Por padrão, ordens são executadas na abertura da próxima barra após a condição ser detectada. Isso simula a realidade onde você não pode executar no preço exato do sinal.
Estratégia Simples
Cruzamento de médias móveis
1//@version=6
2strategy("Cruzamento de Médias", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
3
4// Inputs
5fastLen = input.int(10, "Período Rápida")
6slowLen = input.int(30, "Período Lenta")
7
8// Médias
9smaFast = ta.sma(close, fastLen)
10smaSlow = ta.sma(close, slowLen)
11
12// Condições
13longCondition = ta.crossover(smaFast, smaSlow)
14shortCondition = ta.crossunder(smaFast, smaSlow)
15
16// Ordens
17if longCondition
18 strategy.entry("Long", strategy.long)
19if shortCondition
20 strategy.close("Long")
21
22// Plots
23plot(smaFast, "SMA Rápida", color.blue)
24plot(smaSlow, "SMA Lenta", color.red)Tipos de Ordem
Funções de Ordem
strategy.entry()
Abre posição:
strategy.entry(id, direction, qty, limit, stop, oca_name, oca_type, comment, alert_message)strategy.close()
Fecha posição por ID:
strategy.close(id, comment, qty, qty_percent, alert_message, immediately)strategy.exit()
Define stop loss e take profit:
strategy.exit(id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, oca_name, comment, alert_message)strategy.close_all()
Fecha todas as posições abertas.
Variáveis Úteis
| Variável | Descrição |
|---|---|
`strategy.position_size` | Tamanho da posição atual |
`strategy.position_avg_price` | Preço médio de entrada |
`strategy.opentrades` | Número de trades abertos |
`strategy.closedtrades` | Número de trades fechados |
`strategy.netprofit` | Lucro líquido |
`strategy.equity` | Equity atual |
Estratégia Completa
Com stop loss e take profit
1//@version=6
2strategy("RSI com SL/TP", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
3
4// Parâmetros
5rsiLen = input.int(14, "Período RSI")
6rsiOS = input.int(30, "Nível Sobrevendido")
7rsiOB = input.int(70, "Nível Sobrecomprado")
8slPercent = input.float(2.0, "Stop Loss %") / 100
9tpPercent = input.float(4.0, "Take Profit %") / 100
10
11// Cálculos
12rsi = ta.rsi(close, rsiLen)
13
14// Condições de entrada
15longCondition = ta.crossover(rsi, rsiOS)
16shortCondition = ta.crossunder(rsi, rsiOB)
17
18// Entrada Long
19if longCondition and strategy.position_size == 0
20 strategy.entry("Long", strategy.long)
21 strategy.exit("Exit Long", "Long", stop=close * (1 - slPercent), limit=close * (1 + tpPercent))
22
23// Entrada Short
24if shortCondition and strategy.position_size == 0
25 strategy.entry("Short", strategy.short)
26 strategy.exit("Exit Short", "Short", stop=close * (1 + slPercent), limit=close * (1 - tpPercent))
27
28// Plot RSI em painel separado
29plot(rsi, "RSI", color.purple, display=display.pane)
30hline(rsiOS, "Sobrevendido", color.green, display=display.pane)
31hline(rsiOB, "Sobrecomprado", color.red, display=display.pane)