Estratégia SuperTrend

Autora:ChaoZhang, Data: 2024-02-02 11:11:48
Tags:

img

Resumo

Esta estratégia usa o indicador Supertrend para determinar tendências de preços e entra em posições longas ou curtas quando as tendências mudam. A estratégia permite ajustar o período ATR e o multiplicador para otimizar parâmetros. Também fornece a opção de alterar o método de cálculo ATR para resultados ligeiramente diferentes.

A estratégia possui intervalos de datas de backtesting embutidos e a capacidade de negociar apenas dentro de certos horários do dia e fechar todos os negócios no final desse período de tempo. Isso é especialmente útil para ações de negociação diária.

A estratégia também permite que você especifique níveis de stop loss e take profit baseados em porcentagem. Na maioria dos casos, a parada baseada em ATR fornecida pela própria Supertrend torna um stop loss adicional desnecessário.

Finalmente, existem campos de alerta personalizados para mensagens de entrada e saída a serem utilizados com serviços de negociação automatizados.

Estratégia lógica

A estratégia Supertrend baseia-se nos seguintes princípios fundamentais:

  1. Calcular o valor do ATR: Pode escolher entre o cálculo do SMA ou o indicador ATR incorporado.

    atr2 = sma(tr, Periods)
    
  2. Calcule as bandas superior e inferior. Banda superior é perto menos ATR multiplicador vezes ATR. Banda inferior é perto mais multiplicador vezes ATR.

    up = close - (Multiplier * atr) 
    dn = close + (Multiplier * atr)
    
  3. Determine a direção da tendência comparando o preço com as faixas. Tendência ascendente quando o preço cruza acima da faixa inferior. Tendência descendente quando o preço cruza abaixo da faixa superior.

    trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
    
  4. Gerar sinais de negociação sobre a mudança de tendência, por exemplo, sinal de venda quando se muda de tendência ascendente para tendência descendente:

    sellSignal = trend == -1 and trend[1] == 1 
    
  5. Filtrar a entrada com base em sinais e condições adicionais.

  6. Use stop loss e take profit para bloquear lucros ou limitar riscos.

Estes são os principais princípios de trabalho por trás da estratégia Supertrend. Combinado com otimização de parâmetros, pode produzir bons resultados de negociação.

Vantagens

A estratégia Supertrend tem várias vantagens:

  1. O próprio Supertrend identifica efetivamente tendências e é comumente usado para trailing stops.

  2. Os parâmetros de ATR personalizáveis podem ser otimizados em todos os produtos para melhor ajuste.

  3. Os intervalos de tempo de backtest e de negociação em tempo real configuráveis se adaptam às diferentes sessões de negociação.

  4. A opção de entrar no primeiro comércio imediatamente ou esperar o sinal atende a diferentes produtos.

  5. O stop loss e take profit incorporados ajudam a melhorar a gestão de riscos ou a obter mais lucros.

  6. Alertas comerciais personalizáveis para integração com sistemas de negociação automatizados e bots.

Riscos

Há também alguns riscos a considerar:

  1. Supertrend pode produzir sinais falsos que precisam ser filtrados com condições adicionais.

  2. Parâmetros ATR incorretos podem levar a excesso de negociação ou tendências em falta.

  3. O stop loss muito próximo pode acabar prematuramente com negócios lucrativos.

  4. A configuração de um quadro de tempo deficiente pode fazer com que as sessões de negociação sejam perdidas ou a margem seja reduzida desnecessariamente.

Estes riscos podem ser combatidos através de ajustamentos adequados dos parâmetros ou de filtros adicionais para melhorar a robustez.

Oportunidades de otimização

Algumas maneiras de otimizar ainda mais a estratégia:

  1. Teste diferentes períodos de ATR para encontrar o equilíbrio certo, normalmente 10-20 funciona bem.

  2. Tente diferentes valores do multiplicador ATR, geralmente 2-5 é apropriado, ajuste para encontrar o ideal.

  3. Adicione filtros como MACD, RSI etc. para reduzir sinais falsos.

  4. Otimizar os níveis de stop loss e de lucro para obter melhores resultados.

  5. Teste diferentes intervalos de tempo de negociação. Durações mais curtas se adequam às estratégias intradiárias e de alta frequência.

  6. Implementar a seleção automática de símbolos para rastrear impulso ou volatilidade elevados.

Conclusão

No geral, esta é uma estratégia de tendência bastante comum e prática. Ele rastreia eficientemente as tendências com parâmetros personalizáveis, mas também tem riscos inerentes a gerenciar. Com otimização e condições adicionais, ele pode ser refinado em um sistema de negociação de quantidade robusto com alfa consistente.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © REV0LUTI0N

//@version=4

// Strategy
strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
enableentry = input(true, title="Enter First Trade ASAP")
waitentry = input(false, title="Wait To Enter First Trade")

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
Long = (trend == 1 ? up : na)
buySignal = trend == 1 and trend[1] == -1

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
Short = (trend == 1 ? na : dn)
sellSignal = trend == -1 and trend[1] == 1

// Strategy Backtesting
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if Long and time_cond and timetobuy and enableentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if Short and time_cond and timetobuy and enableentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if buySignal and time_cond and timetobuy and waitentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if sellSignal and time_cond and timetobuy and waitentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)






Mais.