Estratégia de negociação a longo prazo baseada na SuperTrend

Autora:ChaoZhang, Data: 2023-09-20 17:14:33
Tags:

Resumo

Esta estratégia identifica oportunidades longas usando o indicador SuperTrend. Ele usa ATR e um multiplicador para determinar níveis de suporte dinâmico para entrada longa.

Estratégia lógica

  1. As bandas superior e inferior são calculadas com base no período ATR, multiplicador.

  2. A tendência atual é rastreada, com 1 para tendência de alta e -1 para tendência de baixa. A quebra do preço acima da faixa superior muda a tendência de baixo para cima, gerando sinal de compra. A quebra abaixo da faixa inferior muda de cima para baixo, gerando sinal de venda.

  3. Uma média móvel é adicionada como um filtro de tendência. Compre somente se o preço estiver acima do MA ao quebrar acima da faixa superior. Venda somente se o preço estiver abaixo do MA ao quebrar abaixo da faixa inferior. Isso evita quebra falsas.

  4. Os auxiliares visuais destacam tendências, sinais, etc., para ajudar na tomada de decisões.

Análise das vantagens

As vantagens desta estratégia:

  1. A SuperTrend monitora dinamicamente as alterações de preços e reflete as mudanças de tendência em tempo útil.

  2. O ATR stop loss ajusta as paradas com base na volatilidade do mercado, ajudando a garantir os lucros.

  3. O filtro MA elimina sinais falsos do ruído em mercados variados.

  4. O design visual apresenta de forma intuitiva a mecânica da estratégia e a situação do mercado.

  5. Apenas as inversões da tendência de negociação o tornam adequado para a detenção a longo prazo.

Análise de riscos

Os principais riscos são:

  1. A SuperTrend é sensível aos parâmetros, os ajustes frequentes da faixa podem levar ao excesso de negociação.

  2. Em mercados agitados, as paradas podem ser desencadeadas com frequência.

  3. Sem considerar os custos de negociação, as pequenas contas sofrem mais impacto.

  4. A ausência de stop loss significa um elevado risco de retirada.

  5. O filtro de tendências pode perder algumas oportunidades.

Os riscos podem ser reduzidos:

  1. Otimizar os parâmetros do ATR para uma frequência de ajuste de banda mais baixa.

  2. Adicionar um filtro de barras equivalente para evitar paradas por oscilações menores de alta frequência.

  3. Implementar stop loss e take profit para proteger os lucros.

  4. Ajuste do período médio móvel para efeito de filtragem do equilíbrio.

  5. Otimizar a gestão do dinheiro para reduzir os impactos dos custos comerciais.

Orientações de otimização

A estratégia pode ser reforçada nos seguintes aspectos:

  1. Teste diferentes fontes de preços, como perto, alto, etc.

  2. Tente outros indicadores dinâmicos de stop loss como Chandelier Exit.

  3. Adicionar dimensionamento de posições para otimizar a utilização do capital.

  4. Incorporar indicadores de volatilidade para refinar as entradas.

  5. Implementar stop loss e tomar lucro para controlar os riscos.

  6. Ajustar parâmetros para diferentes mercados.

  7. Explorar o aprendizado de máquina para otimização de parâmetros.

  8. Combinar outros indicadores para melhorar a precisão do filtro.

Conclusão

Esta estratégia usa SuperTrend com paradas dinâmicas para determinar tendências e adiciona um filtro MA para identificar entradas longas.


/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)

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)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

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

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       

window()  => time >= start and time <= finish ? true : false

longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())

shortCondition = sellSignal
if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short, when = window())

buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)


Mais.