Estrategia de negociación de ETF basada en ATR y rupturas


Fecha de creación: 2023-12-26 16:05:55 Última modificación: 2023-12-26 16:05:55
Copiar: 2 Número de Visitas: 822
1
Seguir
1623
Seguidores

Estrategia de negociación de ETF basada en ATR y rupturas

Descripción general

La estrategia es una estrategia de negociación automática de ETFs basada en la amplitud real promedio (ATR) y el precio de ruptura. Utiliza el ATR para calcular los puntos de parada y de pérdida, y abre o cierra posiciones cuando el precio supera el máximo o mínimo de un período determinado.

Principio de estrategia

La estrategia se basa principalmente en los siguientes principios:

  1. Utiliza los precios máximos y mínimos de un determinado período (por ejemplo, 20 líneas K) para determinar el movimiento y la dirección de los precios. Cuando el precio rompa el precio más alto del ciclo, haga más; cuando el precio rompa el precio más bajo del ciclo, haga menos.

  2. Utiliza el ATR para calcular el stop loss dinámicamente. La distancia entre el stop loss y el precio de entrada es el valor del ATR de un ciclo de ATR multiplicado por el factor ((como 2) ).

  3. Utiliza el ATR para calcular el parón. El parón es la distancia entre el precio de entrada y el valor de ATR de un ciclo de ATR multiplicado por un factor (como 1)

  4. Utiliza el multifactor ATRtrailer para rastrear los paros. El parón se produce cuando el precio supera el parón de los trailers en dirección negativa.

Esta estrategia es simple y fiable, ya que considera la dirección de la tendencia de los precios, lo que ayuda a capturar la tendencia de los precios a tiempo; también establece paradas de pérdidas y paradas de posiciones, lo que ayuda a aprovechar las oportunidades de ganancias y controlar los riesgos.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. La estrategia es simple, clara, fácil de entender y de implementar.

  2. El uso de ATR para calcular el Stop Loss, permite ajustar dinámicamente el tamaño de la posición y controlar el riesgo de forma flexible.

  3. Las estrategias de breakout son más fáciles de capturar y generan mejores ganancias.

  4. El tractor puede detenerse a tiempo para evitar riesgos.

  5. Aplicable a variedades con tendencias más evidentes, como ETF, acciones, etc.

Análisis de riesgos

La estrategia también tiene los siguientes riesgos:

  1. Cuando los precios fluctúan, puede haber más señales erróneas y inversiones.

  2. La configuración incorrecta de los parámetros de ciclo puede perderse la tendencia de los precios o el número excesivo de transacciones ficticias.

  3. La configuración incorrecta de los parámetros de los coeficientes puede causar que los paros o paradas sean demasiado radicales o conservadoras, lo que afecta a la ganancia.

  4. Los riesgos propios de los ETF, como el riesgo de política, el riesgo de prima, etc., también influyen en la estrategia.

Resolución de las mismas:

  1. Optimizar los parámetros para reducir la tasa de transacciones virtuales.
  2. Combinación de varios factores y filtros para determinar las señales de negociación.
  3. Parámetros de ajuste según el mercado.
  4. Las inversiones distribuidas controlan las posiciones de un solo ETF.

Dirección de optimización

La estrategia puede ser mejorada en los siguientes aspectos:

  1. Se utiliza para filtrar señales falsas en combinación con indicadores como la media móvil.

  2. Se añade un módulo de optimización de parámetros de adaptabilidad para optimizar automáticamente los parámetros según los diferentes ciclos y variedades.

  3. Agrega un modelo de aprendizaje automático para predecir los puntos altos y bajos de la siguiente línea K para determinar la señal de ruptura.

  4. Tenga en cuenta indicadores como el exceso de volumen de transacciones y la prevención de brechas falsas.

  5. Optimizar el tamaño y proporción de las posiciones de apertura de almacenes, la adaptabilidad de la apertura de almacenes a diferentes variedades y entornos de mercado.

Resumir

La idea general de la estrategia es clara y concisa, la ruptura del mecanismo central y el stop loss dinámico ATR pueden controlar el riesgo y bloquear los beneficios de manera efectiva. La optimización de los parámetros y la combinación de más indicadores de filtración pueden mejorar aún más la capacidad de controlar el factor de beneficio y el riesgo de la estrategia.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
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/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))