Melhor estratégia ATR Stop Multiple

Autora:ChaoZhang, Data: 2024-02-21 14:24:22
Tags:

img

Resumo

A melhor estratégia ATR Stop Multiple é uma estratégia de seguimento de tendências que usa múltiplos da faixa verdadeira média (ATR) para definir pontos de stop loss e ajustar dinamicamente o risco.

Estratégia lógica

A estratégia primeiro calcula as médias móveis simples dos períodos SMA rápidos e lentos.

Após a entrada, ele monitora o valor do ATR em tempo real. O ATR representa a volatilidade média durante um determinado período de retrocesso. A estratégia permite definir o período ATR (padrão 14) e o multiplicador (padrão 2).

Por exemplo, se o ATR após a entrada for de 50 pontos, e o multiplicador for definido em 2, então a distância de parada seria de 100 pontos.

A estratégia também considera a determinação da tendência. O stop loss longo só é habilitado quando o sinal de compra corresponde a uma tendência ascendente. O stop loss curto corresponde a uma tendência descendente.

As linhas de stop loss são traçadas no gráfico para que possamos verificá-las em tempo real.

Análise das vantagens

A maior vantagem desta estratégia é que ajusta dinamicamente a distância de stop loss e modifica automaticamente a exposição ao risco com base nas mudanças de volatilidade do mercado.

Em comparação com as distâncias fixas de stop loss, esta abordagem controla efetivamente as perdas por transação, acompanhando as tendências.

Além disso, em combinação com a determinação da tendência, esses métodos de stop loss podem reduzir a possibilidade de serem interrompidos por whipssaws em zonas de consolidação.

Análise de riscos

O principal risco desta estratégia é a chance de os preços recuarem no curto prazo durante uma posição, desencadeando o stop loss.

Outro risco é que os preços possam atravessar o nível de stop loss em movimentos violentos.

Por último, a estratégia não considera o impacto das negociações após o horário de funcionamento e antes do início do mercado sobre os valores ATR, o que pode conduzir a um cálculo impreciso dos dados ATR sobre as aberturas e os fechamentos.

Orientações de otimização

A estratégia pode ser otimizada em vários aspectos:

  1. Otimizar os parâmetros do período ATR e testar as melhores combinações para diferentes mercados

  2. Comparar múltiplos ATR fixos e dinâmicos em termos de rendimento

  3. Incorporar os dados após o horário de trabalho no cálculo do ATR para reduzir as lacunas em abertos

  4. Configurar condições de ATR: permitir paradas apenas quando a ATR atingir determinados níveis, evitando paradas desnecessárias em ambientes de baixa volatilidade

  5. Incorporar mais filtros: tendências principais, indicadores de volume/momentum, etc.

Conclusão

A melhor estratégia ATR Stop Multiple equilibra efetivamente o seguimento da tendência e o controle de riscos ajustando dinamicamente as distâncias de parada.

Naturalmente, alguns riscos permanecem, como diferenças de preços e paradas supersensíveis.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt
//This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

SystemName = "BEST ATR Stop Multiple Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay )

fastSMAperiod = input(defval=15, title='Fast SMA', type=input.integer, minval=2, step=1)
slowSMAperiod = input(defval=45, title='Slow SMA', type=input.integer, minval=2, step=1)

src = close
// Calculate moving averages
fastSMA = sma(src, fastSMAperiod)
slowSMA = sma(src, slowSMAperiod)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

is_signal = enterLong or enterShort

// get the entry price
entry_price = valuewhen(enterLong or enterShort, src, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// ATR multiple Stop
stop_atr_length         = input(14,title="ATR Length", minval=1, type=input.integer)
stop_atr_mult           = input(2,title="ATR Multiple", minval=0.05, step=0.1, type=input.float)

// Global STOP

stop_price = 0.0, stop_price := nz(stop_price[1])

// STOP ATR
var stop_atr      = 0.0
var entry_stop_atr   = 0.0

stop_atr          := nz(atr(stop_atr_length))

if enterLong or enterShort
    entry_stop_atr := stop_atr * stop_atr_mult

// display the ATR value multiple
plotshape(enterLong, title='ATR Long Stop value', style=shape.labelup, 
 location=location.bottom, color=color.green, transp=0, text='', textcolor=color.navy, editable=true, size=size.small, show_last=1, size=size.small)

// var label atr_long_label = na
// var label atr_short_label = na
lapos_y_entry_up = lowest(30)
lapos_y_entry_dn = highest(30)

// text_label = "ATR value: " + tostring(stop_atr, '#.#') + "\n\nATR Multiple value: " + tostring(entry_stop_atr, '#.#')

// if enterLong

//     label.delete(atr_long_label)

//     atr_long_label := label.new(bar_index, lapos_y_entry_up, text=text_label, 
//      xloc=xloc.bar_index, yloc=yloc.price, color=color.green, style=label.style_labelup, textcolor=color.white, 
//      size=size.normal)    

// if enterShort

//     label.delete(atr_short_label)

//     atr_short_label := label.new(bar_index, lapos_y_entry_dn, text=text_label, 
//      xloc=xloc.bar_index, yloc=yloc.price, color=color.red, style=label.style_labeldown, textcolor=color.black, 
//      size=size.normal)    

// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = entry_price - entry_stop_atr
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = entry_price + entry_stop_atr
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 

cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


Mais.