Estratégias: O Básico

Introdução às estratégias e backtesting

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âmetroDescriçã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ávelDescriçã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)