Estrategia de cruce de la media móvil doble

El autor:¿ Qué pasa?, Fecha: 2023-12-11 15:21:58
Las etiquetas:

img

Resumen general

La doble estrategia de cruce de promedios móviles es una estrategia de seguimiento de tendencias que utiliza el cruce de dos promedios móviles de diferentes períodos como señales de negociación.

Estrategia lógica

La estrategia emplea dos promedios móviles: un MA rápido con un período más corto (por ejemplo, 15 períodos) para capturar los movimientos de precios a corto plazo, y un MA lento con un período más largo (por ejemplo, 21 períodos) para identificar la dirección de la tendencia principal.

Al ajustar las combinaciones de períodos de MA, la estrategia puede ajustar el marco de tiempo de las tendencias para capturarlas.

La estrategia también incorpora módulos de gestión de riesgos, incluidos los módulos de toma de ganancias, stop loss y trailing stop loss, que ayudan a limitar la ganancia/pérdida máxima de operaciones individuales y contienen el riesgo general.

Ventajas

La estrategia de doble AM tiene las siguientes ventajas:

  1. Logística sencilla y fácil de entender/implementar;
  2. flexibilidad para adaptarse a las condiciones del mercado ajustando los períodos de admisión;
  3. Estabilidad por menos señales comerciales;
  4. Control eficaz del riesgo mediante el stop loss;
  5. Facilidad de optimización de los MA, parámetros de riesgo, etc.

Los riesgos

También hay algunos riesgos a tener en cuenta:

  1. Crossovers excesivos y frecuencia de negociación durante los mercados limitados al rango;
  2. Las MAs con retraso pueden perder los puntos de inversión de precios y no detener las pérdidas a tiempo;
  3. vulnerabilidad a las falsas rupturas que den lugar a pérdidas innecesarias;
  4. Inprecisión general en el seguimiento de precios debido al retraso de las AMP.

Estas debilidades pueden aliviarse mediante optimizaciones como señales de filtrado, stop loss de seguimiento, etc.

Oportunidades de mejora

La estrategia puede mejorarse en aspectos como:

  1. Añadir filtros sobre el volumen o la volatilidad para evitar los golpes;
  2. Prueba de más tipos de AUE y de períodos/fórmulas de ajuste fino para adaptarlos a diferentes productos y plazos;
  3. Examinar los tipos de MA como EMA, LWMA para el seguimiento más rápido de los precios;
  4. Automatizar el ajuste de MA y el dimensionamiento de pérdidas de parada con aprendizaje automático;
  5. El valor de las pérdidas se calcula en función de las pérdidas que se hayan producido durante el período de referencia.

Se espera un aumento significativo en la tasa de ganancias y rendimientos ajustados al riesgo de estos aumentos.

Conclusión

En general, la estrategia de cruce de media móvil dual ofrece simplicidad, flexibilidad y riesgos controlables. Su facilidad de implementación y optimización la convierte en una estrategia cuantitativa inicial ideal. Con pruebas y ajustes recurrentes, tiene las credenciales para evolucionar en un sistema robusto con el tiempo.


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

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Más.