Estrategia de negociación de ruptura de impulso

El autor:¿ Qué pasa?, Fecha: 2023-12-19 15:46:38
Las etiquetas:

img

Resumen general

La estrategia de negociación de ruptura de momento es una estrategia de seguimiento de tendencias que genera señales de negociación al detectar rupturas de precios más allá de los niveles clave de soporte / resistencia.

Estrategia lógica

El indicador central de esta estrategia es el canal de Donchian. El canal de Donchian consiste en el precio más alto, el precio más bajo y el precio de la línea media durante un período determinado. La banda superior e inferior del canal conectan los precios más altos y más bajos en consecuencia durante el período de retroceso. Una señal larga se genera cuando el precio se rompe por encima de la banda superior, mientras que una señal corta se genera en una ruptura por debajo de la banda inferior, lo que refleja los cambios en el impulso del mercado.

La media móvil se utiliza para medir la dirección de la tendencia.

Específicamente, la condición de entrada consiste en: el precio rompe por encima de la banda superior del canal de Donchian Y cierra por encima del promedio móvil.

El stop loss sigue la banda inferior del Canal de Donchian, asegurando que el stop se ajuste más alto junto con la tendencia.

Análisis de ventajas

Esta estrategia combina de manera efectiva dos indicadores para juzgar la dirección de la tendencia y el impulso, evitando operaciones erróneas de señales falsas de ruptura.

En concreto, las ventajas son:

  1. El canal de Donchian determina dinámicamente los niveles clave de soporte/resistencia, identificando los puntos de inflexión de la tendencia.

  2. El promedio móvil filtra las consolidaciones, evitando los golpes innecesarios.

  3. Seguir la banda inferior del Canal de Donchian permite maximizar las ganancias.

  4. Los parámetros razonables proporcionan flexibilidad en diversos entornos de mercado.

Análisis de riesgos

Los principales riesgos a los que se enfrentan:

  1. El riesgo de ruptura fallido - El precio no puede mantener el impulso después de la ruptura por encima de la banda superior.

  2. El riesgo de reversión de tendencia es el riesgo de reversión del precio antes de alcanzar el stop loss.

  3. Riesgo de optimización de parámetros - Los parámetros ineficaces conducen a un exceso de operaciones o a señales insuficientes.

Para mitigar, se deben incorporar factores como la confirmación del volumen, el ajuste de la media móvil y las distancias razonables de parada.

Oportunidades de mejora

Más optimizaciones:

  1. Agregue el filtro de volumen para asegurar una alta velocidad.

  2. Optimizar los períodos de media móvil para las características de los instrumentos.

  3. Mecanismo de stop loss adaptativo basado en la dinámica de volatilidad de precios.

  4. Mecanismo de reentrada después de la parada inicial para capturar movimientos adicionales de reanudación de tendencia.

  5. Pruebas robustas en varios mercados para identificar parámetros por matices del producto.

Conclusión

La estrategia de negociación de ruptura de impulso combina indicadores para medir efectivamente la tendencia y la fuerza del impulso, evitando los problemas comunes que enfrentan los sistemas de tendencia con respecto a las entradas ciegas.


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

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when Donchian Channel breaks out
//      Exit: Trail a stop with the lower Donchian Channel band
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable DC Channel length


// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Donchian Breakout", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Donchian Breakout", overlay=true)


// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action
stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"])
dcPeriod = input(title="DC period", type=input.integer, defval=20)

// === PLOT THE DONCHIAN CHANNEL ===
// Logic
dcUpper = highest(high, dcPeriod)
dcLower = lowest(low, dcPeriod)
dcMid = avg(dcUpper, dcLower)

// Plotting
dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line")
dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line")
dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average")
fill(dcUplot, dcLplot, color=color.gray, transp=90)

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 100, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    0

// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close.  Intraday should use wick.
trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar
sellSignal = trigSupport <= dcLower[1]

buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy


// (STRATEGY ONLY) Comment out for Study
// This string of code enters and exits at the close
if (trigInput == "Close")
    strategy.entry("Long", strategy.long, when = buy)
    strategy.close("Long", when = sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if (trigInput == "Wick")
    strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck)
    strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])





Más.