
La estrategia combina el cruce de la media móvil y el indicador de movimiento para lograr un seguimiento efectivo de la tendencia y una reversión oportuna. La estrategia utiliza primero las medias móviles rápidas y las medias móviles lentas para formar señales de golden forks y dead forks. Luego, se combina el indicador de movimiento de ciertos parámetros, y si el indicador de movimiento en la media móvil rápida sube nuevamente, se considera que la tendencia continúa y se mantiene.
La lógica central de la estrategia se basa en señales de tendencia que se forman al cruzarse las medias móviles, y los indicadores de dinámica determinan la reversión de la tendencia. La lógica del código de las partes clave es la siguiente:
Calcula el precio de la media móvil rápida1 y el precio de la media móvil lenta2. Donde el precio1 es el HMA de 5 períodos y el precio2 es el HMA de 7 períodos.
Cuando el precio 1 sobrepasa el precio 2 se genera una señal múltiple, y cuando el precio 1 debajo de él atraviesa el precio 2 se genera una señal de brecha. Este es el uso habitual basado en promedios móviles.
Si el indicador de la dinámica de la media móvil rápida price1 vuelve a subir después de la activación de la señal de multiplicación, se considera que la tendencia continúa y se mantiene en el estado de multiplicación.
Cuando el indicador de dinámica roc1 baja, se considera que la tendencia se invierte y se ejecuta la posición en blanco. La lógica de procesamiento de la señal de vacío es la misma.
Introducción de los umbrales ADX para filtrar señales falsas en el estado de no tendencia, sólo se producen señales de comodidad reales cuando el ADX está por encima de los umbrales.
La mayor ventaja de esta estrategia, en comparación con la simple estrategia de media móvil, es la introducción de un indicador de dinámica para determinar la reversión de la tendencia, que permite un seguimiento más oportuno y preciso de la tendencia y la reversión. Las ventajas específicas son las siguientes:
Las medias móviles se retrasan en la respuesta a los cambios en el precio, mientras que los indicadores de movimiento pueden capturar más rápidamente las señales de reversión, lo que es favorable para detener o revertir las posiciones a tiempo.
Las señales de reversión basadas en indicadores de dinámica son más confiables y reducen la necesidad de cerrar posiciones innecesariamente en el comercio de tendencias.
La aplicación de los indicadores ADX evita las señales erróneas en los mercados no tendenciales y permite que la estrategia se centre más en las fases de tendencia, lo que aumenta la probabilidad de obtener ganancias.
La lógica de la estrategia es clara y simple, fácil de entender y seguir, adecuada para los principiantes en el aprendizaje de la negociación algorítmica.
El espacio de optimización de los parámetros del indicador es amplio, y se puede optimizar para diferentes mercados mediante el ajuste del ciclo de las medias móviles, los parámetros de la dinámica, etc.
Los principales riesgos de esta estrategia provienen de los siguientes aspectos:
El promedio móvil se retrasa en la respuesta a los cambios en el precio, lo que puede causar que la señal se retrase y se pierda el mejor momento de entrada.
Las brechas falsas producen posiciones abiertas o cerradas innecesarias que requieren una optimización adicional de los parámetros del indicador o la introducción de condiciones de filtración adicionales.
La inversión de tendencias se basa en el indicador de dinámica, cuyo efecto puede ser rebajado cuando el mercado cambia drásticamente.
El índice ADX no puede determinar perfectamente la tendencia y la consolidación, y el ajuste de los umbrales demasiado altos o demasiado bajos puede causar problemas.
La estrategia no tiene en cuenta los costos de transacción, y en la práctica debe tenerse en cuenta el establecimiento de puntos de parada para controlar el riesgo.
La estrategia puede ser optimizada en los siguientes aspectos:
Pruebe otros tipos de medias móviles o ajuste los parámetros de las medias móviles para optimizar el efecto de suavización de los indicadores.
Optimización de la longitud del indicador de movimiento para que sea más sensible a la captura de cambios de precio.
Trate de establecer un filtro de precios cuando el indicador de movimiento se invierte para evitar ser engañado por pequeñas fluctuaciones a corto plazo.
Mejorar aún más el uso de ADX, por ejemplo, usando diferentes parámetros para diferentes niveles de ADX.
Introducción de condiciones auxiliares como indicadores de volumen de transacciones, mejora de la calidad de la señal y filtración de brechas falsas.
Añadir un mecanismo de stop loss para controlar las pérdidas individuales. Evaluar el nivel de las comisiones en el mercado real y establecer un stop loss razonable.
La estrategia integra las ventajas de los indicadores de medias móviles y de dinámica para lograr el seguimiento de la tendencia y la captura de la reversión. En comparación con el seguimiento de tendencias puras, la estrategia puede responder con mayor flexibilidad a las diferentes etapas del mercado, mientras se mantiene el comercio de tendencias y se evita la pérdida de la reversión de los rebotes.
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")
price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])
ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")
//plot(sig, color=color.red, title="ADX")
f_hma(_src, _length)=>
_return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
sma(price, ma1)
else
if (type1 == "EMA")
ema(price, ma1)
else
f_hma(price, ma1)
price2 = if (type2 == "SMA")
sma(price, ma2)
else
if (type2 == "EMA")
ema(price, ma2)
else
f_hma(price, ma2)
//plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)
//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
strategy.entry("Short", strategy.short)
lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)
ma1up = false
ma1down = false
ma2up = false
ma2down = false
ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])
trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01
if crossover(roc1, trendStrength1)
ma1up := true
ma1down := false
if crossunder(roc1, -trendStrength1)
ma1up := false
ma1down := true
shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
strategy.close("Short")
longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
strategy.close("Long")