Estrategia doble de media móvil dinámica

El autor:¿ Qué pasa?, Fecha: 2023-12-13 16:37:05
Las etiquetas:

img

Resumen general

Esta estrategia utiliza la pendiente del promedio móvil (MA) y la pendiente de los indicadores de impulso para las decisiones comerciales. Compara la pendiente de MA y la pendiente de impulso con umbrales establecidos, y genera señales comerciales cuando ambas pendientes exceden los umbrales. La estrategia también contiene un filtro de baja volatilidad que utiliza un MA diferente para generar señales cuando la volatilidad del mercado es baja.

Estrategia lógica

El núcleo de esta estrategia radica en la comparación de dos curvas de pendiente. En primer lugar, calcula la pendiente del indicador de MA e impulso. La pendiente refleja la tasa de cambio y la dirección de la curva. Luego se utilizan dos umbrales, cuando tanto la pendiente de MA como la pendiente de impulso exceden los umbrales correspondientes, se generan señales comerciales.

Por ejemplo, cuando tanto la pendiente de MA como la pendiente de momento exceden la línea superior, se genera una señal de compra; cuando ambas curvas caen por debajo de la línea inferior, se genera una señal de venta. Esto puede filtrar algunas señales falsas.

El filtro de baja volatilidad utiliza un MA a largo plazo para determinar la volatilidad del mercado. Cuando la volatilidad es baja, se utiliza un MA con diferentes parámetros para generar señales comerciales para adaptarse a diferentes estados del mercado.

Análisis de ventajas

Esta estrategia tiene las siguientes ventajas:

  1. El doble filtro para la configuración de señales comerciales puede filtrar algo de ruido y mejorar la calidad de la señal.

  2. El filtro de baja volatilidad permite que la estrategia se adapte a las diferentes condiciones del mercado con elasticidad.

  3. La alta personalización para diferentes parámetros puede optimizarse para diferentes productos.

  4. No contiene ninguna función de repintura para reducir el impacto de la curva de ajuste.

Análisis de riesgos

Esta estrategia también tiene algunos riesgos:

  1. El filtro dual puede filtrar algunas señales reales y perder oportunidades.

  2. La determinación del umbral del filtro de baja volatilidad requiere un ensayo cuidadoso.

  3. Los parámetros para los indicadores de MA y de impulso deben optimizarse para productos específicos, y los parámetros universales son difíciles de determinar.

  4. La función de no volver a pintar no puede evitar completamente el problema de ajuste de la curva de pruebas de retroceso, y el rendimiento comercial real todavía necesita verificación.

  5. La alta personalización aumenta la complejidad del espacio de parámetros y la dificultad de optimización.

Direcciones de optimización

La estrategia se puede optimizar en las siguientes direcciones:

  1. Prueba más combinaciones de indicadores de MA e impulso para encontrar los indicadores de mejor correspondencia.

  2. Optimizar los parámetros de longitud de los indicadores de MA y de momento para equilibrar el retraso y el ruido.

  3. Optimizar los parámetros para calcular la pendiente para encontrar combinaciones de indicadores más estables.

  4. Prueba diferentes indicadores y parámetros de baja volatilidad para mejorar la elasticidad.

  5. Prueba en diferentes productos y plazos para encontrar el mejor ámbito de aplicación.

  6. Construir mecanismos adaptativos de parámetros para reducir la carga de trabajo de optimización manual.

Conclusión

Esta es una estrategia de MA dual muy flexible y personalizable. Se refiere tanto a la información de precio como a la de impulso para la toma de decisiones, lo que puede filtrar eficazmente las señales falsas. El filtro de baja volatilidad también hace que la estrategia sea más elástica para adaptarse a los cambios del mercado.

Con mejoras en la optimización de parámetros y la selección de indicadores, esta estrategia puede convertirse en una opción viable para el comercio en la vida real.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 00:00:00
period: 1h
basePeriod: 15m
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/
// © Allenlk
//@version=4
strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//Inputs
matype             = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average")
masrc              = input(close, title="MA Source", group="Moving Average")
malen              = input(5, title="Moving Average Length - LookBack Period", group="Moving Average")
factorT3           = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average")
maderiv            = input(3, title="MA Slope Lookback", minval=1, group="Moving Average")
masmooth           = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average")
momtype            = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average")
momsrc             = input(close, title="Momentum Source", group="Momentum Moving Average")
momlen             = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average")
momderiv           = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average")
momsmooth          = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average")
higherTf           = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution")
higherTfmult       = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution")
buffup             = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
bufflow            = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
lowVolMALength     = input(28, title="Big MA Length", minval=1, group="Low Volatility Function")
MAlength           = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function")
MAThresh           = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function")
Volminimum         = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function")

//Low Volatility Function
//When Volatility is low refer to the slope of a long moving average
low_vol_MA         = sma(close, lowVolMALength)
low_vol_down       = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh
low_vol_up         = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1
percent_volatility = (1 - (low / high)) * 100
chng_MA            = sma(percent_volatility, MAlength)
bad_vol            = chng_MA < Volminimum

//No repaint function
nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])

//hull ma definition
hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen)))

//TEMA definition
ema1 = ema(masrc, malen)
ema2 = ema(ema1, malen)
ema3 = ema(ema2, malen)
tema = 3 * (ema1 - ema2) + ema3

//Tilson T3
factor = factorT3 *.10
gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor 
t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor) 
tilT3 = t3(masrc, malen, factor) 
 
//MA Type 
avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3

//MA Slope Percentage
DeltaAvg      = (avg / avg[maderiv]) - 1
SmoothedAvg   = sma(DeltaAvg, masmooth) 
MAout         = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult

//Momentum indicators
Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na

//Momentum Slope Percentage
Deltamom = (Momentum / Momentum[momderiv]) - 1
SmoothedMom = sma(Deltamom, momsmooth) 
Momout   = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom)

//Plottings
plot(buffup, color=color.green, title="Buy line")
plot(bufflow, color=color.red, title="Sell line")
plot(MAout, color=color.blue, linewidth=2, title="MA Slope")
plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope")

longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup
if (longCondition)
    strategy.entry("Buy", strategy.long)

shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow
if (shortCondition)
    strategy.entry("Sell", strategy.short)

Más.