Estrategia dinámica de suspensión de pérdidas basada en ATR

El autor:¿ Qué pasa?, Fecha: 2023-10-10 10:50:21
Las etiquetas:

Resumen general

Esta estrategia utiliza el indicador ATR para establecer puntos de stop loss dinámicos y ajustar posiciones de stop loss basadas en las fluctuaciones de precios, con el fin de controlar los riesgos. Principalmente entra en largo cuando 5EMA cruza por encima de 20EMA, y luego utiliza el indicador ATR para establecer posiciones de stop loss y take profit. La posición de stop loss se ajustará de acuerdo con los movimientos de precios para obtener más ganancias.

Estrategia lógica

La estrategia primero juzga si 5EMA cruza por encima de 20EMA para ir largo. Después de entrar, calcula los múltiplos ATR del precio de entrada al precio actual utilizando el indicador ATR y establece la posición de stop loss en 1.5ATR por debajo del precio de entrada. A medida que el precio aumenta, la posición de stop loss se eleva gradualmente para aumentar las ganancias de la posición.

En concreto, la estrategia define las siguientes variables:

  • precio de entrada: precio de entrada
  • Precio de detención: precio de detención de pérdida
  • Precio de toma_beneficio: precio de toma de beneficio
  • atr_down: línea descendente de ATR
  • atr_up: ATR hacia arriba
  • atr_current: línea ATR actual
  • Atr_ref: Valor de ATR

Después de ingresar, calcula atr_ref como el valor actual de ATR y atr_div como los múltiplos de ATR del precio de entrada al precio actual. Luego establece las posiciones de atr_down, atr_current y atr_up basadas en atr_div. El precio de stop loss stop_price se establece en 1.5ATR por debajo del precio de entrada.

A medida que el precio sube, al comparar el precio actual avg y atr_up, si avg cruza por encima de atr_up, recalcula las posiciones de la línea atr_div y ATR, elevando gradualmente la línea de stop loss para aumentar las ganancias.

Si el precio se eleva por encima del 3ATR del precio de entrada, cerrará parcialmente la posición para bloquear las ganancias y establecerá tookProfit a true. Después, si el precio sigue subiendo, continuará aumentando la stop loss. Cuando se activa el stop loss, comprueba tookProfit - si ya tomó ganancias parciales antes, solo cerrará la posición restante; de lo contrario, cerrará la posición completa.

Ventajas

  1. El uso del indicador ATR para ajustar dinámicamente el stop loss puede establecer una distancia de parada razonable basada en la volatilidad del mercado.

  2. Sigue las tendencias mientras limitas las pérdidas.

  3. El mecanismo de toma parcial de ganancias bloquea algunas ganancias y reduce el riesgo.

Los riesgos

  1. El indicador ATR no es sensible a las reversiones bruscas y a las lagunas.

  2. Las EMA no pueden determinar la inversión de tendencia, pueden entrar en nuevas posiciones en las inversiones de tendencia.

  3. Alta probabilidad de pérdidas después de una ganancia parcial.

  4. Los parámetros necesitan una mayor optimización, 1.5ATR stop y 3ATR take profit deben ajustarse para diferentes productos.

Mejoras

  1. Considere la posibilidad de añadir otros indicadores de stop loss como el canal Donchian para compensar el retraso del ATR.

  2. Pruebe diferentes promedios móviles o agregue MACD, etc. para juzgar la inversión de tendencia.

  3. Optimizar los ratios de ganancia parcial y la frecuencia para diferentes productos.

  4. Optimización de parámetros en los múltiplos de ATR para detener y tomar ganancias.

  5. El rendimiento de las pruebas durante tendencias débiles puede desactivar la estrategia durante tendencias débiles.

Resumen de las actividades

La estrategia tiene una lógica clara de usar ATR para la gestión dinámica de stop loss que es su mayor fortaleza. Sin embargo, ATR en sí tiene limitaciones como el retraso. La adición de otros indicadores de stop y tendencia lo mejorará. También la toma parcial de ganancias necesita optimizaciones en todos los productos. En general, proporciona la idea de gestión de stop loss basada en ATR, pero necesita más optimizaciones y mejoras.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ekinbasarkomur

//@version=5
strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true)

// Simple EMA tracking
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema (close, 20)
atr = ta.atr(14)

// We define entry price for future reference
var float entry_price = na
// We define stop and take profit for future calculations
var float stop_price = na
var float take_profit_price = na

// We define atr limtim its here
var float atr_down = na
var float atr_up = na
var float atr_current = na
var float atr_ref = na

avg = (low + high) / 2

// Conditions
enterCondition = ta.crossover(fastEMA, slowEMA)
var bool tookProfit = false
timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0)
InTrade = strategy.position_size > 0

// Go long if conditions are met
if (enterCondition and timePeriod and not InTrade)
    // Calculate and update variables
    entry_price := avg
    atr_ref := atr
    atr_div = int((avg - entry_price) / atr_ref)
    atr_down := entry_price + (atr_ref * (atr_div - 1.5))
    atr_up := entry_price + (atr_ref * (atr_div + 1))
    atr_current := entry_price + (atr_ref * atr_div) 
    stop_price := (entry_price - (atr_ref * 1.5))
    take_profit_price := (entry_price + (atr_ref * 3))
    strategy.order("buy", strategy.long, qty = 2)

// Enter here if in position
if InTrade or tookProfit
    stopCondition = avg < stop_price
    takeProfitCondition = avg > take_profit_price

    if avg < atr_down
        stopCondition := true

    // Move stop price and exit price if price for each atr price increase
    if avg > atr_up
        if tookProfit
            atr_ref := atr
        atr_div = int((avg - entry_price) / atr_ref)
        atr_down := entry_price + (atr_ref * (atr_div - 1))
        atr_up := entry_price + (atr_ref * (atr_div + 1))
        atr_current := entry_price + (atr_ref * atr_div) 

    // Take half of the investment if current price is 3 atr higher than entry price
    if (takeProfitCondition and timePeriod and InTrade and not tookProfit)
        strategy.order("take_half_profit", strategy.short, qty = 1)
        tookProfit := true

    // Exit position if conditions are met and reset the variables
    if (stopCondition and timePeriod and InTrade)
        if tookProfit
            strategy.order("exit", strategy.short, qty = 1)
        else
            strategy.order("stop_loss", strategy.short, qty = 2)

        tookProfit := false

// Plot EMA's
plot(fastEMA, color = color.blue)
plot(slowEMA, color = color.yellow)

// Plot ATR Limit/Stop positions
profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr)
close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr)
stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr)
fill(profit_plot, close_plot, color = color.new(color.green, 80))
fill(close_plot, stop_plot, color =color.new(color.red,80))

Más.