Mejor estrategia de ATR Stop múltiple

El autor:¿ Qué pasa?, Fecha: 2024-02-21 14:24:22
Las etiquetas:

img

Resumen general

La mejor estrategia ATR Stop Multiple es una estrategia de seguimiento de tendencias que utiliza múltiplos del rango verdadero promedio (ATR) para establecer puntos de stop loss y ajustar dinámicamente el riesgo.

Estrategia lógica

La estrategia primero calcula los promedios móviles simples de los períodos de SMA rápido y lento.

Después de ingresar, monitoriza el valor de ATR en tiempo real. El ATR representa la volatilidad promedio durante un cierto período de retroceso. La estrategia nos permite establecer el período de ATR (por defecto 14) y el multiplicador (por defecto 2).

Por ejemplo, si el ATR después de la entrada es de 50 puntos, y el multiplicador está establecido en 2, entonces la distancia de parada sería de 100 puntos.

La estrategia también considera la determinación de tendencia. El stop loss largo solo está habilitado cuando la señal de compra coincide con una tendencia al alza. El stop loss corto coincide con una tendencia a la baja.

Las líneas de stop loss están trazadas en el gráfico para que podamos verificarlas en tiempo real.

Análisis de ventajas

La mayor ventaja de esta estrategia es que ajusta dinámicamente la distancia de stop loss y modifica automáticamente la exposición al riesgo en función de los cambios de volatilidad del mercado.

En comparación con las distancias fijas de stop loss, este enfoque controla eficazmente las pérdidas por operación mientras sigue las tendencias.

Además, en combinación con la determinación de tendencias, dichos métodos de stop loss pueden reducir la posibilidad de ser detenidos por los whipssaws en las zonas de consolidación.

Análisis de riesgos

El principal riesgo de esta estrategia es la posibilidad de que los precios retroceden a corto plazo durante una posición, lo que desencadena el stop loss.

Otro riesgo es que los precios puedan romper el nivel de stop loss en movimientos violentos. Esto requeriría ajustes de multiplicador ATR más grandes, pero eso también significa un potencial de ganancia reducido.

Por último, la estrategia no tiene en cuenta el impacto de las operaciones después del horario de apertura y antes del mercado en los valores del ATR, lo que puede dar lugar a un cálculo inexacto de los datos del ATR en las operaciones de apertura o de cierre.

Direcciones de optimización

La estrategia se puede optimizar en varios aspectos:

  1. Optimizar los parámetros del período ATR y probar las mejores combinaciones para diferentes mercados

  2. Comparar los múltiplos ATR fijos y dinámicos en términos de rendimiento

  3. Incorporar los datos de las horas extras en el cálculo de ATR para reducir las lagunas en las

  4. Configurar las condiciones de ATR: permitir las paradas solo cuando ATR alcance ciertos niveles, evitando las paradas innecesarias en entornos de baja volatilidad

  5. Incorporar más filtros: tendencias principales, indicadores de volumen/momentum, etc.

Conclusión

La mejor estrategia ATR Stop Multiple equilibra efectivamente el seguimiento de tendencias y el control de riesgos ajustando dinámicamente las distancias de parada.

Por supuesto, algunos riesgos persisten, como las brechas de precios y las paradas demasiado sensibles.


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


Más.