Estrategia de seguimiento de tendencias basada en el indicador SMA de múltiples períodos


Fecha de creación: 2024-02-04 14:50:24 Última modificación: 2024-02-04 14:50:24
Copiar: 0 Número de Visitas: 343
1
Seguir
1176
Seguidores

Estrategia de seguimiento de tendencias basada en el indicador SMA de múltiples períodos

Descripción general

Esta estrategia permite el juicio y el seguimiento de la tendencia mediante la combinación del uso de varias medias SMA de diferentes períodos. La idea central es: comparar las direcciones de subida y bajada de los SMA de diferentes períodos, para juzgar la tendencia; hacer más cuando se usa SMA de período más largo en SMA de período corto; hacer un hueco cuando se usa SMA de período más largo en SMA de período corto.

Principio de estrategia

  1. Se utiliza una media SMA de 5 ciclos diferentes: 10 ciclos, 20 ciclos, 50 ciclos, 100 ciclos y 200 ciclos.
  2. Compara la dirección de subida y bajada de las cinco medias para determinar la dirección de la tendencia. Por ejemplo, cuando la media SMA de 10 períodos, 20 períodos, 100 períodos y 200 períodos sube al mismo tiempo, se considera una tendencia alcista; cuando la media media media baja al mismo tiempo, se considera una tendencia bajista.
  3. La comparación de los valores de diferentes períodos de SMA, forma una señal de negociación. Por ejemplo, cuando el SMA de 10 períodos supera el SMA de 20 períodos, forma una señal de entrada; cuando el SMA de 10 períodos supera el SMA de 20 períodos, forma una señal de entrada.
  4. Usar Zero LagEMA como señal de confirmación de entrada y salida. Hacer más cuando el ciclo rápido de Zero LagEMA pasa por el ciclo lento.

Ventajas estratégicas

  1. El uso de una combinación de líneas medias SMA de diferentes períodos permite determinar la dirección de la tendencia del mercado.
  2. La comparación de los valores de SMA periódicos puede generar señales de negociación y formar reglas de entrada y salida cuantitativas.
  3. El filtro Zero LagEMA evita transacciones innecesarias y mejora la estabilidad de la estrategia.
  4. La combinación de la determinación de tendencias y las señales de negociación permite el seguimiento de tendencias.

Riesgos estratégicos y soluciones

  1. Cuando los mercados entran en la fase de ajuste de la oscilación, las señales de línea media SMA pueden cruzarse con frecuencia, con mayor riesgo de transacciones no válidas y pérdidas.
    • Solución: aumentar el parámetro de filtración de ZeroLagEMA para evitar la entrada de señales no válidas.
  2. Debido a la referencia a los SMA de más períodos, se concluye que la señal tiene un cierto retraso y no puede reaccionar a los cambios bruscos de precios a corto plazo.
    • La solución: en combinación con indicadores más sensibles, como el MACD, para ayudar a juzgar.

Dirección de optimización de la estrategia

  1. Optimización de los parámetros del ciclo SMA para encontrar la combinación óptima de parámetros.
  2. Aumentar las estrategias de detención de pérdidas, como el seguimiento de las paradas, para controlar aún más las pérdidas individuales.
  3. Aumentar el mecanismo de gestión de posiciones para que la estrategia aumente la posición cuando la tendencia es fuerte y disminuya la posición cuando hay una oscilación.
  4. En combinación con más indicadores auxiliares, como MACD, KDJ, etc., mejora la estabilidad general de la estrategia.

Resumir

La estrategia combina varias líneas medias de SMA de ciclo, lo que permite un juicio efectivo de la dirección de la tendencia del mercado y genera una señal de comercio cuantitativa. Al mismo tiempo, la aplicación de ZeroLagEMA mejora la fluidez de la estrategia. En general, la estrategia implementa una estrategia de comercio cuantitativa basada en el seguimiento de la tendencia.

Código Fuente de la Estrategia
/*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 ===