O indicador ATR pode capturar dinamicamente a volatilidade do mercado e ajustar a distância de perda de parada com base na volatilidade do mercado, garantindo uma perda de parada efetiva enquanto minimiza a probabilidade de perda de parada. Esta estratégia também incorpora Bandas de Bollinger para visualizar os limites superior e inferior da linha de perda de parada, com a opção de adicionar proteção de mecha para neutralizar o efeito da serra no mercado.
Esta estratégia usa a média do período N do indicador ATR multiplicada por um fator como a distância de stop loss base. Quanto maior o valor ATR, maior a volatilidade do mercado, portanto, maior a distância de stop loss é definida. Quanto menor o valor ATR, menor a distância de stop loss é definida. Isso permite o ajuste dinâmico da distância de stop loss com base na volatilidade do mercado.
Especificamente, a estratégia utiliza a seguinte lógica básica:
Calcular o valor ATR do período ATR (nATRPeriod).
Obter a distância básica de stop loss nLoss multiplicando o valor ATR por um fator (nATRMultip).
Atualizar a linha de stop loss xATRTrailingStop com base na linha de alto, baixo e stop loss atual do período anterior.
Se a baixa atual desencadear a linha de stop loss do período anterior, a linha de stop loss se move para baixo da distância baixa de nLoss.
Se a alta atual desencadear a linha de stop loss do período anterior, a linha de stop loss desce para cima da distância máxima de nLoss.
Se o stop loss não for acionado, ajuste a linha de stop loss com base na distância do preço de fechamento até ela.
Adicionar a distância de proteção da mecha opcional para otimizar ainda mais a linha de perda de parada.
Traçar Bandas de Bollinger para visualizar o limite superior e inferior da linha de stop loss.
Determine a direção da posição com base na cor da linha de stop loss.
A estratégia utiliza de forma flexível o indicador ATR para permitir que a linha de stop loss se ajuste de forma adaptativa com base na volatilidade do mercado, garantindo uma distância de stop loss razoável, evitando, ao mesmo tempo, uma stop loss excessiva que provoque perdas desnecessárias de posições.
As vantagens desta estratégia:
Usar o indicador ATR para ajustar a distância de stop loss adaptando-se dinamicamente às diferentes condições de mercado.
O multiplicador personalizável permite um ajuste flexível da distância de stop loss.
A adição de Bandas de Bollinger fornece a visualização dos limites superior e inferior da linha de stop loss.
A proteção opcional da mecha evita a serrada em mercados variados.
Pode ser usado como stop loss para maximizar a retirada de posições lucrativas.
A lógica estratégica é clara e fácil de entender com poucos parâmetros otimizáveis.
Aplicável a múltiplos produtos e prazos.
Alguns riscos desta estratégia a observar:
O indicador ATR reage lentamente aos choques do mercado, levando a uma grande distância de stop loss.
A definição excessiva do multiplicador também aumenta a distância de stop loss, aumentando o risco de perda.
A proteção da mecha pode tornar a linha de stop loss muito frouxa quando a serra aumenta.
Regras de entrada não consideradas, não podem ser utilizadas como estratégia de entradas/saídas.
Testes extensos e otimização dos parâmetros necessários para diferentes produtos e prazos.
A ruptura de perdas de parada pode aumentar as perdas, exigindo uma gestão eficaz do capital.
A estratégia pode ser otimizada nos seguintes aspectos:
Teste diferentes períodos de ATR para otimizar a distância de perda de parada.
Ajuste o multiplicador para equilibrar a distância de stop loss e a probabilidade.
Otimizar o período de proteção da mecha para evitar a serra.
Tente adicionar condições de entrada em cima do stop loss para torná-lo estratégia de Entradas/Sais.
Adicionar indicador de tendência para ajustar a distância de stop loss com base na tendência.
Ajuste o stop loss com base na teoria das ondas de Elliott.
O valor da posição deve ser calculado de acordo com o método de classificação da posição.
Esta estratégia utiliza a característica adaptativa do indicador ATR para projetar um mecanismo de stop loss dinâmico. Ao mesmo tempo em que garante o stop loss, também minimiza os gatilhos de stop loss desnecessários. A lógica da estratégia é simples e clara, permitindo otimização flexível com base nas necessidades.
/*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")