
La estrategia es una estrategia de canal de precios adaptativa basada en el rango real promedio (ATR) y el índice de dirección promedio (ADX). Su objetivo es identificar mercados y tendencias en el movimiento de los precios y operar de acuerdo con ellos.
Calcule el precio más alto ((HH) y el precio más bajo ((LL) de la raíz de longitud K más reciente. También calcule el ATR en la raíz de longitud K.
Calcular +DI y -DI según la subida y bajada del precio, y luego calcular ADX.
Si el ADX < 25, se considera que el mercado se ha cerrado. En este momento, si el precio de cierre es superior al límite superior del canal de precios, entonces HH - ATR multiplicado por*ATR), hacer más; si el precio de cierre está por debajo del límite inferior del canal de precios*No hay tiempo libre.
Si el ADX es mayor que 25 y el +DI es menor que -DI, se considera un mercado alcista. Si el precio de cierre es superior al límite superior del canal de precios, se hace un alza.
Si el ADX es mayor que 25 y el +DI es menor que -DI, se considera que el mercado está vacío. Si el precio de cierre está por debajo del límite inferior del canal de precios, se hace un vacío.
Después de entrar en la posición, si la línea K de la raíz de exit_length no se detiene, se obliga a detener la posición de pérdida.
La estrategia se adapta automáticamente al entorno del mercado. Se utiliza una estrategia de canal de precios en el mercado consolidado y se negocia siguiendo la dirección de la tendencia en el mercado de tendencia.
El uso de indicadores ATR y ADX asegura la adaptabilidad de la estrategia. ATR se utiliza para ajustar la anchura de los canales de precios, ADX se utiliza para juzgar las tendencias del mercado.
El mecanismo de suspensión obligatoria de pérdidas contribuye a la estabilidad de la estrategia.
La probabilidad de que el ADX produzca una señal errónea es mayor.
La configuración incorrecta de los indicadores ATR y ADX puede causar una estrategia ineficaz.
El riesgo de no poder evitar de manera efectiva las variaciones de comportamiento.
Optimización de los parámetros de los indicadores ATR y ADX para una mejor autoadaptación.
Aumentar la línea de stop loss para reducir el riesgo de pérdidas.
Aumentar las condiciones del filtro para filtrar las señales de error.
La estrategia de canales de precios de adaptación automática utiliza una variedad de indicadores y mecanismos, adopta diferentes estrategias en diferentes situaciones y tiene cierta adaptabilidad y estabilidad. Sin embargo, debido a la limitación de la configuración de indicadores y la selección de parámetros, la estrategia también enfrenta cierto riesgo de error. La dirección de optimización futura está en la optimización de parámetros, control de riesgos, etc.
/*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)