Tendencia siguiendo la estrategia basada en la SMA de varios períodos

El autor:¿ Qué pasa?, Fecha: 2024-02-04 14:50:24
Las etiquetas:

img

Resumen general

Esta estrategia combina múltiples líneas de SMA con diferentes períodos para identificar y seguir la tendencia. La idea central es: comparar las direcciones de subida/caída de las SMA con diferentes períodos para determinar la tendencia; ir largo cuando la SMA de corto período cruza la SMA de largo período, y ir corto cuando la SMA corta cruza por debajo de la SMA larga.

Estrategia lógica

  1. Utilice 5 líneas SMA con períodos de 10, 20, 50, 100 y 200 respectivamente.
  2. Comparar las direcciones de estos 5 SMA para determinar la tendencia. Por ejemplo, cuando los SMA de 10-, 20-, 100 y 200 períodos están aumentando juntos, indica una tendencia al alza; cuando todos están cayendo, indica una tendencia a la baja.
  3. Compare los valores de las SMA con diferentes períodos para generar señales de negociación. Por ejemplo, cuando la SMA de 10 períodos cruza la SMA de 20 períodos, vaya largo; cuando la SMA de 10 períodos cruza por debajo de la SMA de 20, vaya corto.
  4. Utilice ZeroLagEMA para confirmación de entrada y señales de salida. Ir largo cuando el ZeroLagEMA rápido cruza el ZeroLagEMA lento, salir largo cuando cruza por debajo. La lógica de juicio para los shorts es lo contrario.

Ventajas

  1. La combinación de múltiples SMA con períodos diferentes puede determinar eficazmente la tendencia del mercado.
  2. La comparación de los valores de la SMA genera reglas cuantitativas de entrada y salida.
  3. El filtro ZeroLagEMA evita intercambios innecesarios y mejora la estabilidad.
  4. La combinación de juicio de tendencia y señales comerciales logra tendencia después de la negociación.

Riesgos y soluciones

  1. Cuando el mercado entra en consolidación, los cruces frecuentes de SMA pueden causar pérdidas redundantes.
    • Solución: aumentar el filtro ZeroLagEMA para evitar las entradas de señal no válidas.
  2. A juzgar por las SMA de varios períodos, tiene un cierto retraso, al no poder responder rápidamente a los bruscos cambios de precios a corto plazo.
    • Solución: añadir indicadores más rápidos como el MACD para ayudar a juzgar.

Direcciones de optimización

  1. Optimizar los parámetros del período SMA para encontrar la mejor combinación.
  2. Agregue estrategias de stop loss como el trailing stop para limitar aún más las pérdidas.
  3. Añadir un mecanismo de dimensionamiento de posiciones para aumentar las apuestas en tendencias fuertes y disminuir las apuestas en consolidaciones.
  4. Incorporar más indicadores de ayuda como el MACD y el KDJ para mejorar la estabilidad general.

Conclusión

Esta estrategia determina efectivamente la tendencia del mercado mediante la combinación de SMAs de varios períodos y genera señales comerciales cuantificadas. ZeroLagEMA mejora la tasa de ganancia. En resumen, la estrategia logró una tendencia cuantitativa después de la negociación, con resultados notables.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, 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)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===

Más.