Estrategia de canal de precios adaptativo

El autor:¿ Qué pasa?, Fecha: 2023-12-04 16:33:45
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de canal de precios adaptativa basada en el indicador de rango verdadero promedio (ATR) y el índice direccional promedio (ADX).

Estrategia lógica

  1. Calcular el máximo máximo (HH) y el mínimo mínimo (LL) en una longitud dada. Calcular también el ATR en la misma longitud.

  2. Calcular +DI y -DI basado en los movimientos al alza y a la baja de los precios.

  3. Si el ADX < 25, el mercado se considera lateral. Si se cierra > el canal superior (HH - multiplicador ATR * ATR), vaya largo. Si se cierra < el canal inferior (LL + multiplicador ATR * ATR), vaya corto.

  4. Si ADX >= 25 y +DI > -DI, el mercado es alcista.

  5. Si ADX >= 25 y +DI < -DI, el mercado es bajista.

  6. Posición de salida después de las barras exit_length desde la entrada.

Análisis de ventajas

  1. La estrategia se adapta automáticamente en función de las condiciones del mercado, utilizando la estrategia de canal en el mercado lateral y la tendencia en el mercado de tendencia.

  2. El uso de ATR y ADX asegura la adaptabilidad. ATR ajusta el ancho del canal, ADX determina la tendencia.

  3. La salida forzada añade estabilidad.

Análisis de riesgos

  1. ADX puede generar señales falsas con frecuencia.

  2. Los malos parámetros de ATR y ADX conducen a un mal rendimiento.

  3. Incapaz de protegerse eficazmente contra los eventos del cisne negro.

Direcciones de optimización

  1. Optimizar los parámetros de ATR y ADX para mejorar la adaptabilidad.

  2. Añadir stop loss para limitar las pérdidas.

  3. Añadir filtros para evitar señales falsas.

Conclusión

La estrategia combina indicadores y mecanismos para adaptarse a las condiciones del mercado, pero pueden ocurrir juicios erróneos debido a las limitaciones de los indicadores, futuras optimizaciones de parámetros y control de riesgos.


/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)

length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")

startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")

hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)

// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100

// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)

var int barSinceEntry = na

if (not na(close[length]) )
    if (adx < 25) // Sideways market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
        else if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI > minusDI) // Bullish market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI < minusDI) // Bearish market
        if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0

if (na(barSinceEntry))
    barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
    strategy.close("PChLE")
    strategy.close("PChSE")
    barSinceEntry := na

plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)



Más.