
La estrategia óptima de stop loss multiplicador de ATR es una estrategia de seguimiento de tendencias que utiliza el multiplicador de la amplitud real media (ATR) para establecer un punto de parada y ajustar el riesgo dinámicamente. Cuando la tendencia de los precios cambia, puede detenerse a tiempo y evitar grandes pérdidas.
La estrategia primero calcula el promedio móvil simple de los períodos SMA rápidos y SMA lentos, haciendo más cuando se atraviesa el SMA lento en los SMA rápidos y haciendo menos cuando se atraviesa el SMA lento en los SMA rápidos.
Después de la entrada, se monitorea el valor de ATR en tiempo real. ATR representa la amplitud de fluctuación promedio en un período determinado en el pasado. Esta política nos permite configurar la longitud de ciclo de ATR (default 14) y el múltiplo (default 2). El sistema calcula el valor de ATR en la entrada y luego multiplica el múltiplo configurado como la distancia de parada.
Por ejemplo, si el ATR después de la entrada es de 50 puntos y el multiplicador se establece en 2, el stop loss es de 100 puntos. Si el precio se ejecuta posteriormente más de 100 puntos, se activará el stop loss. Esto puede detener el stop loss a tiempo y evitar pérdidas excesivas.
La estrategia toma en cuenta al mismo tiempo el juicio de la tendencia, y sólo se activa la parada de la posición larga cuando la señal de compra coincide con la tendencia a la alza. La señal de descubierto se activa cuando coincide con la tendencia a la baja.
La línea de parada se traza en el gráfico, y podemos verificarla en tiempo real. Cuando se activan las condiciones de parada, la posición correspondiente también se liquida automáticamente por el sistema.
La mayor ventaja de esta estrategia es que la distancia de detención se ajusta de forma dinámica y se puede modificar automáticamente el umbral de riesgo en función de los cambios en la volatilidad del mercado. Cuando la volatilidad se expande, la distancia de detención también se extiende, lo que reduce la probabilidad de que se rompa la parada.
En comparación con la distancia de parada fija, esta forma permite controlar eficazmente las pérdidas individuales mientras se sigue la tendencia. A la vez que garantiza un espacio de ganancias, también presta atención a la gestión de riesgos.
Además, combinado con el juicio de tendencias, este tipo de paradas puede reducir las salidas por temblores en las zonas de reajuste.
El principal riesgo de esta estrategia es el riesgo de que las líneas cortas de precios se retrasen durante la tenencia de la posición, lo que desencadena una orden de suspensión de pérdidas. Especialmente si el ciclo de ATR es demasiado corto, la distancia de suspensión no puede filtrar completamente los efectos de las fluctuaciones a corto plazo.
Otro riesgo es que, en situaciones extremas, el movimiento de salto en el precio puede romper directamente la línea de parada. Esto requiere la configuración de un mayor multiplicador de parada, pero también significa una reducción del margen de ganancia.
Finalmente, la estrategia no tiene en cuenta el impacto de las operaciones nocturnas y antes del cierre en el valor del ATR. Esto puede causar que los datos del ATR calculados por la estrategia no sean precisos en el momento de la apertura o el cierre.
La estrategia puede ser optimizada en los siguientes aspectos:
Optimización de los parámetros del ciclo ATR para probar la mejor combinación de parámetros en diferentes mercados
Comparación de las tasas de rendimiento de los conjuntos de multiplicadores fijos y variables
ATR calculado en combinación con el disco nocturno y los datos previos al disco para minimizar el impacto del salto en el precio de apertura
Configuración de condiciones ATR: activado solo cuando el ATR alcanza un determinado nivel, para evitar pérdidas innecesarias en mercados de baja volatilidad
Incorpora más filtros: tendencias a gran escala, indicadores de energía, etc.
La mejor estrategia de stop loss multiplicador de ATR logra un equilibrio eficaz entre el seguimiento de tendencias y el control de riesgos mediante el ajuste dinámico del stop loss. En comparación con el stop loss fijo, puede limitar eficazmente las pérdidas individuales al tiempo que garantiza un espacio de ganancias.
Por supuesto, aún hay que tener en cuenta algunos riesgos potenciales, como el salto en los precios, el stop loss demasiado sensible, etc. Podemos seguir optimizando la estrategia en varios niveles para mejorar la estabilidad y la rentabilidad.
/*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)