A estratégia SuperTrend é uma estratégia de tendência baseada no cálculo da faixa média verdadeira.
A estratégia primeiro calcula a faixa média verdadeira (ATR) durante um determinado período. Em seguida, usa o valor de ATR multiplicado por um fator de escala para calcular a linha de stop loss longa e a linha de stop loss curta. O cálculo específico é o seguinte:
atr = mult * atr(length)
longStop = hl2 - atr
shortStop = hl2 + atr
Onde o comprimento é o período para calcular o ATR e o mult é o fator de escalado para o ATR.
Após calcular as linhas de stop loss, a estratégia continua a julgar se o preço quebra a linha de stop loss da barra anterior para determinar a direção da tendência:
dir := dir == -1 and close > shortStopPrev ? 1 :
dir == 1 and close < longStopPrev ? -1 : dir
Quando a linha longa de stop loss é quebrada, a tendência é considerada de alta.
De acordo com a mudança de direção da tendência, são gerados sinais de compra e venda:
buySignal = dir == 1 and dir[1] == -1
sellSignal = dir == -1 and dir[1] == 1
Por último, as ações comerciais correspondentes são tomadas quando aparecem sinais de compra ou venda.
Usar o ATR para calcular as linhas de stop loss pode filtrar efetivamente o ruído do mercado e capturar sinais de tendência mais confiáveis.
A estratégia tem poucos parâmetros fáceis de compreender e operar.
Usar a ruptura da linha de stop loss para determinar a mudança de direção da tendência pode controlar efetivamente os riscos e parar a perda no tempo.
Configurável para negociação apenas de longo prazo ou bidirecional para atender a diferentes estilos de negociação.
Pode ser utilizado em qualquer período e para vários instrumentos de negociação.
Em mercados variáveis, o ATR pode ser puxado para cima, levando a um stop loss mais amplo e a mais sinais falsos.
A combinação ideal de parâmetros é incerta, o período ATR e o multiplicador precisam de otimização com base nas condições do mercado.
O prazo ideal para cada instrumento de negociação é desconhecido e precisa de ser testado.
O melhor momento de entrada não é claro e existe algum atraso.
Há riscos de não estar no mercado quando a tendência é fraca.
Os riscos de que seja atingido um stop loss podem ser considerados.
Outros indicadores como MACD, RSI podem ser incorporados para filtragem para evitar sinais errados em mercados variados.
O aprendizado de máquina ou algoritmos genéticos podem ser usados para encontrar os conjuntos de parâmetros ideais.
A otimização de parâmetros pode ser feita para cada instrumento para encontrar o melhor período de ATR e multiplicador.
Os indicadores de volume podem ser utilizados para determinar um melhor calendário de entrada e evitar uma entrada prematura.
Considere usar estratégias de bloqueio para manter posições quando não estiver no mercado.
A largura do stop loss pode ser relaxada e otimizada com indicadores de força da tendência.
A estratégia SuperTrend usa linhas de stop loss dinâmicas calculadas a partir do ATR para detectar mudanças de tendência quando ocorre uma quebra de preço. É um sistema de seguimento de tendência relativamente confiável e controlado pelo risco. A estratégia é simples de usar e aplicável a vários instrumentos, mas os parâmetros e regras precisam de otimização para um melhor desempenho em diferentes mercados. Combinando-se com outros indicadores técnicos e estratégias pode melhorar ainda mais os resultados comerciais.
/*backtest start: 2023-09-12 00:00:00 end: 2023-10-12 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // strategy("SuperTrend Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000) LongOnly = input(title="Long Only ?", type=input.bool, defval=true) length = input(title="ATR Period", type=input.integer, defval=22) mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval=1, title="From Day", minval=1, maxval=31) fromMonth = input(defval=1, title="From Month", minval=1, maxval=12) fromYear = input(defval=2019, title="From Year", minval=1970) // To Date Inputs toDay = input(defval=1, title="To Day", minval=1, maxval=31) toMonth = input(defval=1, title="To Month", minval=1, maxval=12) toYear = input(defval=2020, title="To Year", minval=1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// atr = mult * atr(length) longStop = hl2 - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = hl2 + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir longColor = color.green shortColor = color.red plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor) buySignal = dir == 1 and dir[1] == -1 plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0) plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0) plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor) sellSignal = dir == -1 and dir[1] == 1 plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0) plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0) if LongOnly if buySignal and time_cond strategy.entry("Long", strategy.long, comment="Long") if(sellSignal and time_cond) strategy.close("Long") else if buySignal and time_cond strategy.entry("Long", strategy.long, comment="Long") else strategy.cancel("Long") if sellSignal and time_cond strategy.entry("Short", strategy.short, comment="Short") else strategy.cancel("Short") if not time_cond strategy.close_all()