Estratégia SuperTrend

Autora:ChaoZhang, Data: 2023-10-13 17:03:55
Tags:

Resumo

A estratégia SuperTrend é uma estratégia de tendência baseada no cálculo da faixa média verdadeira.

Estratégia lógica

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.

Vantagens

  1. 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.

  2. A estratégia tem poucos parâmetros fáceis de compreender e operar.

  3. 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.

  4. Configurável para negociação apenas de longo prazo ou bidirecional para atender a diferentes estilos de negociação.

  5. Pode ser utilizado em qualquer período e para vários instrumentos de negociação.

Riscos

  1. Em mercados variáveis, o ATR pode ser puxado para cima, levando a um stop loss mais amplo e a mais sinais falsos.

  2. 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.

  3. O prazo ideal para cada instrumento de negociação é desconhecido e precisa de ser testado.

  4. O melhor momento de entrada não é claro e existe algum atraso.

  5. Há riscos de não estar no mercado quando a tendência é fraca.

  6. Os riscos de que seja atingido um stop loss podem ser considerados.

Reforço

  1. Outros indicadores como MACD, RSI podem ser incorporados para filtragem para evitar sinais errados em mercados variados.

  2. O aprendizado de máquina ou algoritmos genéticos podem ser usados para encontrar os conjuntos de parâmetros ideais.

  3. A otimização de parâmetros pode ser feita para cada instrumento para encontrar o melhor período de ATR e multiplicador.

  4. Os indicadores de volume podem ser utilizados para determinar um melhor calendário de entrada e evitar uma entrada prematura.

  5. Considere usar estratégias de bloqueio para manter posições quando não estiver no mercado.

  6. A largura do stop loss pode ser relaxada e otimizada com indicadores de força da tendência.

Conclusão

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()


Mais.