Die Ressourcen sind geladen. Beförderung...

Mehrindikator-Dynamische gleitende Durchschnitts-Quantitative Crossover-Strategie

Schriftsteller:ChaoZhang, Datum: 2025-01-06 13:46:47
Tags:SMAEMAWMAVWMAHMARMAALMA- Nein.

img

Übersicht

Diese Strategie ist ein quantitatives Handelssystem, das auf mehreren gleitenden Durchschnitts-Crossover-Signalen basiert. Es integriert sieben verschiedene Arten von gleitenden Durchschnitten, darunter einfachen gleitenden Durchschnitt (SMA), exponentiellen gleitenden Durchschnitt (EMA), gewichteten gleitenden Durchschnitt (WMA), Volumen gewichteten gleitenden Durchschnitt (VWMA), Hull gleitenden Durchschnitt (HMA), Glätteten gleitenden Durchschnitt (RMA), und Arnaud Legoux gleitenden Durchschnitt (ALMA).

Strategieprinzip

Die Kernlogik der Strategie besteht darin, Markttrends zu bestimmen, indem die Crossover-Beziehungen zwischen gleitenden Durchschnitten verschiedener Perioden beobachtet werden. Ein langes Signal wird erzeugt, wenn der schnelle gleitende Durchschnitt über den langsamen gleitenden Durchschnitt überschreitet und umgekehrt für kurze Signale. Das System bietet zwei Eingangsmethoden: eine basiert auf direkten gleitenden Durchschnitts-Crossovers und eine andere basiert auf der Position des Schlusskurses in Bezug auf die gleitenden Durchschnitte. Das dreilinige System führt einen mittelfristigen gleitenden Durchschnitt ein, um die Signalzuverlässigkeit und Stabilität zu verbessern.

Strategische Vorteile

  1. Hohe Anpassungsfähigkeit: Die Integration von sieben verschiedenen gleitenden Durchschnitten ermöglicht es der Strategie, sich an verschiedene Marktumgebungen und Handelsinstrumente anzupassen
  2. Signalstabilität: Mehrere Bestätigungsmechanismen helfen, falsche Signale zu vermeiden
  3. Flexible Parameter: Unterstützt anpassbare Perioden-Einstellungen für Optimierung und Backtesting
  4. Risikokontrolle: beinhaltet einen Leerverkaufsmechanismus zur Nutzung bilateraler Handelschancen
  5. Klare Visualisierung: Die Strategie bietet eine intuitive grafische Schnittstelle mit visuellen Hilfsmitteln wie dem Ausfüllen von Trendbereichen

Strategische Risiken

  1. Verzögerungseffekt: Gleitende Durchschnitte sind von Natur aus verzögerte Indikatoren, die möglicherweise optimale Einstiegspunkte in volatile Märkte vermissen
  2. Schlechte Performance in den Märkten mit unterschiedlichen Märkten: Kann häufige falsche Signale in den seitlichen Märkten erzeugen
  3. Parameterabhängigkeit: Die Leistung variiert signifikant mit verschiedenen Parameterkombinationen und erfordert eine kontinuierliche Optimierung
  4. Systematisches Risiko: Kann nicht schnell genug auf plötzliche Marktereignisse reagieren, um einen Stop-Loss zu erzielen

Strategieoptimierungsrichtlinien

  1. Einbeziehung von Volatilitätsindikatoren: Die Einbeziehung von ATR oder ähnlichen Indikatoren für die dynamische Positionsgrößerung wird vorgeschlagen.
  2. Zusatz von Marktumgebungsfiltern: Kann Trendstärkenindikatoren enthalten, um Signale in verschiedenen Märkten auszufiltern
  3. Optimierung des Stop-Loss-Mechanismus: Empfehlung zur Verbesserung der Risikokontrolle, die Funktionalität für einen nachträglichen Stop-Loss hinzuzufügen
  4. Erweiterte Volumenanalyse: Vorschlag, Volumenänderungen einzubeziehen, um die Gültigkeit des Trends zu bestätigen

Zusammenfassung

Diese Strategie ist ein umfassendes Trendfolgensystem, das durch die Integration mehrerer gleitender Durchschnittsindikatoren und flexibler Parameter-Einstellungen einen zuverlässigen quantitativen Handelsrahmen bietet.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Cruce de Medias Total", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100,max_bars_back=1000)

// Parámetros de entrada
periodo_rapida = input.int(50, title="Periodos para media rápida", minval=1)
periodo_lenta = input.int(200, title="Periodos para media lenta", minval=1)

// Selección del tipo de media móvil
tipo_de_media = input.string(title="Elige el tipo de media móvil", defval="Simple sma", options=["Simple sma", "Exponencial ema", "Ponderada wma", "Volumen ponderada vwma", "Hull hma", "Media suavizada rma", "Media de Arnaud Legoux alma"])

// Posibilidad de estrategia con cruce de tres medias móviles
tres_medias = input.bool(false, title="Estrategia con cruce de 3 medias móviles")
periodo_media = input.int(100, title="Periodos para media media", minval=1)

// Opción de operar en corto
permitir_corto = input.bool(false, title="Permitir operaciones en corto")

// Opción de cuando comprar
cuando_comprar = input.string(title="Cuando comprar", defval="Cruce de medias", options=["Vela anterior cierra por encima de las medias", "Cruce de medias"])
// Opción de cuando vender
cuando_vender = input.string(title="Cuando vender", defval="Cruce de medias", options=["Vela anterior cierra por debajo de las medias", "Cruce de medias"])

float media_mov_rapida = na
float media_mov_media = na
float media_mov_lenta = na

// Definición de las medias móviles
if tipo_de_media == "Simple sma"
    media_mov_rapida := ta.sma(close, periodo_rapida)
    media_mov_media := ta.sma(close, periodo_media)
    media_mov_lenta := ta.sma(close, periodo_lenta)
else if tipo_de_media == "Exponencial ema"
    media_mov_rapida := ta.ema(close, periodo_rapida)
    media_mov_media := ta.ema(close, periodo_media)
    media_mov_lenta := ta.ema(close, periodo_lenta)
else if tipo_de_media == "Ponderada wma"
    media_mov_rapida := ta.wma(close, periodo_rapida)
    media_mov_media := ta.wma(close, periodo_media)
    media_mov_lenta := ta.wma(close, periodo_lenta)
else if tipo_de_media == "Volumen ponderada vwma"
    media_mov_rapida := ta.vwma(close, periodo_rapida)
    media_mov_media := ta.vwma(close, periodo_media)
    media_mov_lenta := ta.vwma(close, periodo_lenta)
else if tipo_de_media == "Hull hma"
    media_mov_rapida := ta.hma(close, periodo_rapida)
    media_mov_media := ta.hma(close, periodo_media)
    media_mov_lenta := ta.hma(close, periodo_lenta)
else if tipo_de_media == "Media suavizada rma"
    media_mov_rapida := ta.rma(close, periodo_rapida)
    media_mov_media := ta.rma(close, periodo_media)
    media_mov_lenta := ta.rma(close, periodo_lenta)
else if tipo_de_media == "Media de Arnaud Legoux alma"
    offset = input.int(0, title="Desfase para ALMA", minval=-100, maxval=100)
    sigma = input.float(6, title="Sigma para ALMA", minval=0.1, maxval=10)
    media_mov_rapida := ta.alma(close, periodo_rapida, offset, sigma)
    media_mov_media := ta.alma(close, periodo_media, offset, sigma)
    media_mov_lenta := ta.alma(close, periodo_lenta, offset, sigma)

// Graficar las medias móviles en el gráfico
plot_rapida = plot(media_mov_rapida, color=color.green, linewidth=2, title="Media Móvil Rápida")
plot_media = plot(tres_medias ? media_mov_media : na, color=color.blue, linewidth=2, title="Media Móvil Media")
plot_lenta = plot(media_mov_lenta, color=color.red, linewidth=2, title="Media Móvil Lenta")

// Rellenar el área entre las medias móviles con color condicionado
fill(plot_rapida, plot_lenta, media_mov_rapida > media_mov_lenta ? color.new(color.green, 90) : color.new(color.red, 90), title="Relleno entre Medias")

// Lógica de la estrategia para cruce de medias
comprado = strategy.position_size > 0  // Verifica si ya hay una posición abierta
vendido = strategy.position_size < 0 

if not comprado  // Solo compra si no hay una posición abierta
    if tres_medias and cuando_comprar == "Cruce de medias"
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Cruce de medias"
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_media and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)

// Condición de cierre de la posición
if comprado
    if tres_medias and cuando_vender == "Cruce de medias"
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Cruce de medias"
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_media and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)

// Condición de entrar en corto
if not vendido and permitir_corto
    if tres_medias
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)
    else
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)

// Condición de cierre de posición corta
if vendido
    if tres_medias
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)
    else
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)


Verwandt

Mehr