Estratégia dinâmica de stop-profit e stop-loss baseada em ATR double trailing stop


Data de criação: 2024-03-22 13:52:59 última modificação: 2024-03-22 13:52:59
cópia: 1 Cliques: 616
1
focar em
1617
Seguidores

Estratégia dinâmica de stop-profit e stop-loss baseada em ATR double trailing stop

Visão geral

A estratégia usa dois indicadores ATR (Average True Range) de diferentes períodos para construir uma linha de parada de dupla dinâmica, gerando um sinal de negociação quando o preço ultrapassa a linha de parada. Ao mesmo tempo, usa o comprimento da linha de parada para definir dinamicamente o preço de parada para realizar uma parada de parada dinâmica. A estratégia também combina o indicador EMA para auxiliar na determinação da tendência.

Princípio da estratégia

  1. Calcule o valor do indicador ATR de dois períodos diferentes (default 10 e 20) e multiplique por seus respectivos coeficientes de sensibilidade (default 1 e 2) para obter duas larguras de parada.
  2. O preço é gerado acima ou abaixo de duas linhas de parada e, em caso de ruptura, é gerado um sinal de multi-cabeça ou de cabea.
  3. O preço de suspensão é calculado dinamicamente com base em 1,65 vezes o comprimento da entidade de suspensão atual.
  4. Após a abertura de uma posição, se o preço atingir o preço de parada, a posição de liquidação é lucrativa.
  5. A utilização de indicadores como o EMA para auxiliar na avaliação da tendência atual e fornecer uma referência para a entrada.

A estratégia utiliza as características do indicador ATR para construir um stop loss dinâmico duplo, que pode se adaptar melhor a diferentes taxas de flutuação do mercado e, ao mesmo tempo, responder rapidamente às mudanças no mercado. A configuração do stop loss dinâmico permite que a estratégia obtenha mais lucros em situações de tendência.

Análise de vantagens

  1. A dupla linha de parada dinâmica é capaz de se adaptar a diferentes taxas de flutuação do mercado, com maior flexibilidade.
  2. O preço de parada é calculado de acordo com a dinâmica do comprimento da linha de fundo atual, permitindo obter mais lucro em situações de tendência.
  3. O uso de indicadores como a EMA para auxiliar na determinação de tendências e fornecer referências para a entrada aumenta a confiabilidade da estratégia.
  4. A lógica do código é clara, legível, fácil de entender e de otimizar.

Análise de Riscos

  1. Em mercados turbulentos, as transações frequentes podem levar a custos de comissões mais elevados, afetando os lucros.
  2. A configuração dos parâmetros da linha de parada e do multiplicador de parada precisa ser otimizada de acordo com diferentes características de mercado e produto, e os parâmetros inadequados podem levar a um mau desempenho da estratégia.
  3. A estratégia baseia-se principalmente em quebra de preços para criar sinais de stop loss dinâmico, que pode produzir sinais errados para algumas situações de brechas falsas de grandes flutuações.

Direção de otimização

  1. No caso de um mercado em choque, pode-se considerar a introdução de mais indicadores ou condições para filtrar os sinais de negociação, como RSI, MACD, etc.
  2. Para diferentes produtos e mercados, pode-se encontrar o melhor parâmetro de linha de parada e o múltiplo de parada através de retrospectiva histórica e otimização de parâmetros.
  3. Pode-se considerar a introdução de módulos de gestão de posições e controle de risco, ajustando o tamanho das posições de acordo com a volatilidade do mercado e a dinâmica de risco da conta.
  4. Aumentar os indicadores de tendências, aumentando a confiabilidade e a precisão dos sinais.

Resumir

A estratégia é melhor adaptada a diferentes ambientes de mercado através da concepção de duas linhas de parada dinâmica e paradas dinâmicas, e tem um excelente desempenho em situações de tendência. No entanto, em mercados turbulentos, é possível enfrentar problemas de negociação freqüente e compensação de ganhos e perdas. Portanto, a estratégia é mais adequada para uso em mercados de tendência, e requer otimização e ajuste de parâmetros em combinação com as características do produto e do ambiente de mercado. Além disso, ainda há espaço para otimização adicional, como a introdução de mais condições de filtragem, gerenciamento de posição e módulos de controle de risco, para aumentar a robustez e a lucratividade da estratégia.

Código-fonte da estratégia
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)