Estratégia Adaptive Stop Trailing


Data de criação: 2023-10-08 15:06:28 última modificação: 2023-10-08 15:06:28
cópia: 0 Cliques: 771
1
focar em
1617
Seguidores

Visão geral

A estratégia implementa principalmente um mecanismo de parada de perda adaptável, que pode ajustar automaticamente a posição de parada de acordo com a flutuação do preço, para obter melhores efeitos de parada. A estratégia usa o indicador ATR para calcular um alcance de parada razoável e, em combinação com a linha de equilíbrio EMA, gera um sinal de negociação, fazendo um extra-cancelamento quando a posição é rompida e, ao mesmo tempo, acompanha a parada com o algoritmo de parada adaptável.

Princípio da estratégia

  1. Calcule o indicador ATR, definindo o valor do ATR multiplicado pelo parâmetro a como o intervalo de stop loss nLoss.
  2. Calcule a linha média da EMA.
  3. Faça mais quando o preço está acima da EMA e faça menos quando está abaixo da EMA.
  4. O TrailingStop ajusta automaticamente o ponto de parada xATRTrailingStop usando um algoritmo de parada adaptativo, com as seguintes regras:
    • Quando o preço ultrapassa o limite de perda para cima, o limite de perda é ajustado para o preço menos o limite de perda nLoss.
    • Quando o preço se move para baixo, o ponto de parada é ajustado para o preço mais o intervalo de parada nLoss.
    • Em outras circunstâncias, o stop loss permanece inalterado.
  5. Quando o preço atinge o ponto de parada, a posição é parada.

Análise de vantagens

  1. Implementa um mecanismo de parada de perda adaptável, que pode ajustar automaticamente a amplitude de parada de perda de acordo com a volatilidade do mercado, controlando efetivamente o risco.
  2. Combinando o cálculo do ATR com um limite razoável de stop loss, evite um stop loss excessivo ou pequeno.
  3. A utilização de EMA para gerar sinais de negociação pode reduzir transações desnecessárias e filtrar o ruído do mercado.
  4. A estratégia é simples e clara, o código é fácil de entender, fácil de examinar e de otimizar.
  5. Os parâmetros de entrada podem ser ajustados para adaptar-se a diferentes ambientes de mercado.

Riscos e melhorias

  1. A EMA pode gerar sinais de negociação com atraso, resultando em entrada tardia. Pode-se considerar o uso de outros indicadores para auxiliar o julgamento de entrada antecipada.
  2. O tempo de detenção é incerto, não há controle sobre o tamanho do stop loss único. Pode-se definir um lucro-alvo ou um tempo de detenção máximo para evitar grandes perdas.
  3. Em mercados de tendência significativa, o stop loss pode ser acionado com demasiada frequência. Pode-se considerar ajustar os parâmetros de acordo com a situação da tendência ou adicionar condições de filtragem.
  4. Os parâmetros devem ser ajustados de acordo com as características de diferentes variedades, como o ciclo ATR, o múltiplo de parada, etc., sem usar os valores padrão.

Direção de otimização

  1. Pode-se considerar a inclusão de indicadores de avaliação de tendências, fazer pedidos em direção a tendências e evitar negociações adversas.
  2. Pode-se ajustar o multiplicador de stop loss de acordo com a magnitude da taxa de flutuação, com uma largura de parada adequada em grandes flutuações.
  3. Pode-se definir o tempo máximo de detenção da posição, e depois de um determinado tempo, a parada ativa do campo de perda.
  4. Pode-se adicionar uma estratégia de stop loss móvel, que aumenta o stop loss gradualmente à medida que o preço avança.
  5. Os parâmetros do ciclo ATR podem ser personalizados de acordo com as características de cada ação.

Resumir

Esta estratégia é clara e fácil de entender, usando o indicador ATR para definir um limite de perda de adaptação, e em conjunto com a EMA para gerar sinais de negociação, para controlar efetivamente a perda. Mas a estratégia em si é mais passiva, o espaço de otimização é maior, pode considerar a inclusão de julgamento de tendência, de acordo com a situação do mercado de ajuste de parâmetros de estratégia mais ativa. Em geral, a estratégia como uma estratégia de parada de perda de base é uma boa idéia e modelo, mas precisa ser ajustado e otimizado de acordo com as diferentes características do produto, não pode ser transferido para o uso de hardware.

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

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 

// Inputs
a = input(1,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
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 = true
 
////////////////////////////////////////////////////////////////////////////////


xATR  = atr(c)
nLoss = a * xATR

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

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

ema   = ema(src,1)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)

buy  = src > xATRTrailingStop and above 
sell = src < xATRTrailingStop and below

barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop 

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

barcolor(barbuy  ? color.green : na)
barcolor(barsell ? color.red   : na)

strategy.entry("long",   true, when = buy  and time_cond)
strategy.entry("short", false, when = sell and time_cond)