Estratégia adaptativa de suspensão do atraso

Autora:ChaoZhang, Data: 2023-10-08 15:06:28
Tags:

Resumo

Esta estratégia implementa principalmente um mecanismo de stop loss adaptativo que ajusta automaticamente a posição de stop loss com base em flutuações de preços para alcançar um melhor efeito de stop loss. A estratégia usa o indicador ATR para calcular um intervalo de stop loss razoável e gera sinais de negociação em combinação com linhas EMA. Ele abre posições longas ou curtas quando o preço quebra as linhas EMA e usa um algoritmo de stop loss adaptativo para rastrear a stop loss.

Estratégia lógica

  1. Calcular o indicador ATR e definir o valor ATR multiplicado pelo parâmetro a como intervalo de stop loss nLoss.
  2. Calcule a linha EMA.
  3. Vá longo quando o preço quebra acima da linha EMA, e vá curto quando o preço quebra abaixo da linha EMA.
  4. Utilize o algoritmo de stop loss adaptativo para ajustar automaticamente a posição de stop loss xATRTrailingStop, com as seguintes regras:
    • Quando o preço ultrapassa a posição stop loss, ajuste o stop loss para o preço menos o intervalo stop loss nLoss.
    • Quando o preço ultrapassa a posição stop loss, ajuste o stop loss para o preço mais o intervalo stop loss nLoss.
    • Caso contrário, manter o stop loss inalterado.
  5. Fechar posição para stop loss quando o preço atingir o nível de stop loss.

Análise das vantagens

  1. Implementa um mecanismo de stop loss adaptativo que ajusta automaticamente a faixa de stop loss com base na volatilidade do mercado, controlando efetivamente os riscos.
  2. Calcula o intervalo razoável de perdas de parada com o indicador ATR, evitando perdas de parada demasiado grandes ou demasiado pequenas.
  3. Utiliza a EMA para gerar sinais de negociação, reduzindo as negociações desnecessárias e filtrando o ruído do mercado.
  4. Lógica estratégica simples e clara, fácil de entender e otimizar.
  5. Permite o ajustamento dos parâmetros de entrada para se adaptarem aos diferentes ambientes de mercado.

Riscos e melhorias

  1. Os sinais da EMA podem demorar, levando a uma entrada tardia.
  2. Período de retenção incerto, incapaz de controlar o tamanho de uma única perda de parada.
  3. Considerar ajustar parâmetros ou adicionar filtros com base nas condições da tendência.
  4. Os parâmetros como o período ATR, o multiplicador de perda de parada devem ser ajustados com base nas características do símbolo, os valores padrão não devem ser usados cegamente.

Orientações de otimização

  1. Considere adicionar um indicador de tendência, fazendo negociações na direção da tendência para evitar negociações contra-tendência.
  2. Ajustar o multiplicador de stop loss com base na volatilidade, permitindo um stop mais amplo em condições de alta volatilidade.
  3. O prazo máximo de retenção, stop loss ativo após exceder um determinado período.
  4. Adicione uma estratégia de stop loss em movimento, aumentando gradualmente o stop à medida que o preço se move.
  5. Personalizar o parâmetro do período ATR com base nas características do símbolo.

Conclusão

A estratégia tem uma lógica clara e simples, gerenciando riscos com sinais de stop loss e EMA adaptativos baseados em ATR para o comércio. Mas é relativamente passiva com muito espaço para otimização. Considere adicionar julgamento de tendência, ajuste de parâmetros dinâmicos com base nas condições do mercado para torná-lo mais proativo.


/*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)

Mais.