Estratégia de trailing trading de stop loss dinâmico


Data de criação: 2023-10-09 16:59:57 última modificação: 2023-10-09 16:59:57
cópia: 0 Cliques: 724
1
focar em
1228
Seguidores

Visão geral

A estratégia baseia-se no indicador de amplitude real média (ATR) para definir uma linha de parada dinâmica, acompanhar as mudanças no preço das ações e maximizar os lucros ao mesmo tempo em que realiza a proteção de parada.

Princípio da estratégia

A estratégia é implementada através das seguintes etapas:

  1. Para calcular o indicador ATR, o ciclo ATR é definido pelo parâmetro nATRPeriod, assumindo por defeito 5;

  2. A amplitude de stop loss é definida pelo parâmetro nATRMultip, que é 3.5 vezes o ATR por defeito;

  3. Quando o preço das ações sobe, o limiar de parada é aumentado para o preço das ações menos o limiar de parada se estiver acima do limiar de parada anterior; quando o preço das ações cai, o limiar de parada é reduzido para o preço das ações mais o limiar de parada se estiver abaixo do limiar de parada anterior;

  4. Para avaliar se o preço da ação ultrapassou o limite de perda, o que emite um sinal de compra ou venda;

  5. De acordo com o sinal de quebrar a linha de parada, entrar em uma posição de fazer mais ou vazio, e no momento em que tocar novamente a linha de parada para a posição de equilíbrio.

Quando o preço das ações sobe, a linha de parada aumenta, bloqueando os lucros; quando o preço das ações cai, a linha de parada diminui, bloqueando os lucros. O indicador ATR pode refletir com mais precisão a volatilidade do preço das ações, ajustando a linha de parada de acordo com a dinâmica do ATR, evitando que os lucros sejam demasiado radicais ou conservadores.

Análise de vantagens

  • Ajuste dinâmico da linha de parada para evitar a expansão dos prejuízos
  • Ajuste da linha de parada mais suave para evitar parada prematura
  • Utilizando o indicador ATR para refletir sobre as últimas flutuações e calcular um limite de perda mais razoável
  • A linha de parada é um bom método para traçar os lucros

Análise de Riscos

  • A configuração dos parâmetros do indicador ATR deve ser feita com cautela, pois um período ATR muito curto pode levar a um aumento excessivo da linha de parada, enquanto que um período muito longo não pode refletir os movimentos de preços em tempo hábil.
  • Os parâmetros de stop loss precisam ser ajustados de acordo com a volatilidade específica das ações, sendo que o excesso ou a insuficiência podem afetar a eficácia da estratégia
  • O rastreamento de um stop loss pode reduzir a margem de lucro e travar um stop loss antes que o preço suba novamente.
  • A frequência de ajustes de posições gera custos de transação mais elevados

Pode-se encontrar a melhor combinação de parâmetros para o equilíbrio entre a parada e o rastreamento através da otimização de parâmetros, ajustando os parâmetros do ciclo ATR e a amplitude de parada. Também pode ser combinado com outros indicadores técnicos para filtrar o tempo de entrada no mercado e reduzir a parada desnecessária.

Direção de otimização

  • Optimizar os parâmetros do ciclo ATR para aproximar as mudanças da linha de stop loss das oscilações de preços
  • Optimizar parâmetros de amplitude de parada para tornar a parada mais racional
  • Adição de outros indicadores para determinar o tempo de entrada de filtros
  • Só se pode entrar em posições a mais quando há uma clara tendência de alta no preço das ações
  • Considerar a inclusão do mecanismo de reentrada para evitar a impossibilidade de participar após a paralisação das ações, que devem continuar a subir

Resumir

A estratégia realiza o bloqueio de perdas e lucros durante a manutenção da posição, através do método de ajuste dinâmico da linha de parada ATR. Em comparação com a posição de parada fixa, a estratégia é mais adaptável à flutuação do preço das ações, evitando perdas excessivamente radicais ou conservadoras. O indicador ATR torna o ajuste da linha de parada mais direcionado. No entanto, a configuração de parâmetros e a estratégia de reentrada precisam ser ainda mais otimizadas para reduzir perdas desnecessárias e expandir o espaço de ganho.

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

//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, 
  initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
  
nATRPeriod      = input(5, "ATR Period")
nATRMultip      = input(3.5, "ATR Multiplier")
useShorts       = input(false, "Test w/Shorts?")
daysBackMax     = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin     = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax       = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin       = 1000 * 60 * 60 * 24 * daysBackMin

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop := 
 iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
  iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), 
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) 
                       
pos = na 
pos := 
 iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1, 
  iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
        
color = pos == -1 ? red: pos == 1 ? green : blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))

buy     = crossover(close, xATRTrailingStop)
sell    = crossunder(close, xATRTrailingStop)

strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)