Estratégia de stop loss adaptável baseada no indicador ATR


Data de criação: 2023-10-19 12:42:26 última modificação: 2023-10-19 12:42:26
cópia: 0 Cliques: 843
1
focar em
1617
Seguidores

Estratégia de stop loss adaptável baseada no indicador ATR

Visão geral

A ideia central desta estratégia é usar o indicador de amplitude real média (ATR) para definir uma linha de parada de seguimento adaptável, para maximizar a proteção de posições lucrativas e evitar perdas prematuras. O indicador ATR é capaz de capturar dinamicamente a volatilidade do mercado, ajustando a distância de parada de acordo com as flutuações do mercado, garantindo a redução do risco de perda e minimizando a probabilidade de perda de parada.

Princípio da estratégia

Esta estratégia usa o valor médio de N ciclos do indicador ATR multiplicado por um múltiplo como a distância de parada básica. Quanto maior o valor do ATR, indicando que a distância de parada de mercado é mais ampla; quanto menor o valor do ATR, a distância de parada é mais estreita. Isso permite ajustar a distância de parada dinamicamente de acordo com a volatilidade do mercado.

A estratégia usa a seguinte lógica central:

  1. Calcule o valor do ATR para o período nATRPeriod.

  2. A distância de parada básica nLoss é obtida multiplicando o valor de ATR por o múltiplo ((nATRMultip)).

  3. A atualização da linha de parada xATRTrailingStop baseada nos pontos altos e baixos atuais e no período anterior.

  4. Se a baixa atual desencadeou a linha de parada do ciclo anterior, a parada é movida para a distância nLoss abaixo da baixa.

  5. Se o pico atual desencadeou a linha de parada do ciclo anterior, o pico move-se abaixo da linha de parada para a distância nLoss acima do pico.

  6. Se o stop não for acionado, o stop será ajustado de acordo com a distância entre o preço de fechamento e a linha de stop.

  7. Adição de distância de proteção de linha de sombra opcional para otimizar ainda mais a linha de parada.

  8. Trace a trajetória da faixa de Bryn para visualizar o limite superior e inferior da linha de stop loss.

  9. Determine a direção da posição com base na cor da linha de parada.

A estratégia usa o indicador ATR de forma flexível, permitindo que a linha de stop-loss se adapte às flutuações do mercado, garantindo uma distância de stop-loss razoável e evitando, na medida do possível, a perda de posição desnecessária por causa de um stop-loss demasiado radical.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O ATR é usado para ajustar a distância de parada de forma dinâmica, adaptando-se a diferentes condições de mercado.

  2. Os parâmetros de multiplicação podem ser personalizados, permitindo o ajuste flexível da distância de parada.

  3. Junte-se à órbita da faixa de Bryn para formar o limite superior e inferior da visualização da linha de parada.

  4. A proteção de linha de sombra é opcional, para evitar o “whipsaw” da cidade em choque.

  5. Pode ser usado como um tracking stop loss, permitindo a retirada máxima de posições lucrativas.

  6. A estratégia é clara e fácil de entender, os parâmetros são menos fáceis de otimizar.

  7. Pode ser usado em várias variedades e ciclos, com uma ampla área de aplicação.

Análise de Riscos

A estratégia também apresenta alguns riscos que devem ser lembrados:

  1. O indicador ATR está atrasado em responder a surpresas do mercado, o que pode levar a um atraso excessivo na distância de parada.

  2. A multiplicação excessiva também pode levar a uma distância de parada muito grande, aumentando o risco de perdas.

  3. A proteção de linha de sombra deixa a linha de parada muito frouxa quando a vibração aumenta.

  4. Não há regras de entrada e não há uma estratégia de entradas/saidas.

  5. Os parâmetros de otimização devem ser testados repetidamente para adaptar-se a diferentes variedades e ciclos.

  6. A ruptura do limite de perda pode levar à expansão dos prejuízos e requer uma gestão eficaz dos fundos.

Direção de otimização

A estratégia pode ser melhorada nos seguintes aspectos:

  1. Testar diferentes parâmetros de ciclo ATR para otimizar a distância de parada.

  2. Ajustar os parâmetros do múltiplo para encontrar um equilíbrio entre a distância de parada e a probabilidade de parada.

  3. Optimizar os parâmetros do ciclo de proteção da linha de sombra para evitar a whipsaw.

  4. Tente adicionar condições de entrada em uma base de stop loss, tornando-a uma estratégia de entradas/saidas.

  5. Adicionar indicadores de tendência e ajustar a distância de parada de acordo com a tendência.

  6. Combinando a teoria das ondas, ajuste a distância de parada de acordo com a posição das ondas.

  7. Adição de controle de posição para limitar perdas individuais.

Resumir

Esta estratégia utiliza a característica de adaptação do indicador ATR, projetando um mecanismo de parada de perda que é capaz de ajustar dinamicamente. Ao mesmo tempo em que garante a parada de perdas, também reduz o mínimo possível o desencadeamento de perdas desnecessárias. O conceito da estratégia é simples e claro, e pode ser otimizado de forma flexível de acordo com suas próprias necessidades.

Código-fonte da estratégia
/*backtest
start: 2022-10-12 00:00:00
end: 2023-10-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR 
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick) 
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
 iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick), 
//                        iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
 iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))

pos =	iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
 iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
color = pos == 1 ? red: pos == -1 ? green : blue 
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")

longCondition = (color == green and color[1] == red)
if (longCondition)
    strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
    strategy.close("Long")

shortCondition = (color == red and color[1] == green)
if (shortCondition)
    strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
    strategy.close("Short")