Stratégie quantitative de croisement de moyennes mobiles dynamiques à indicateurs multiples

SMA EMA WMA VWMA HMA RMA ALMA MA
Date de création: 2025-01-06 13:46:47 Dernière modification: 2025-01-06 13:46:47
Copier: 2 Nombre de clics: 443
1
Suivre
1617
Abonnés

Stratégie quantitative de croisement de moyennes mobiles dynamiques à indicateurs multiples

Aperçu

Cette stratégie est un système de trading quantitatif basé sur plusieurs signaux de croisement de moyennes mobiles. Il combine sept types différents d’indicateurs de moyenne mobile, notamment la moyenne mobile simple (SMA), la moyenne mobile exponentielle (EMA), la moyenne mobile pondérée (WMA), la moyenne mobile pondérée du volume (VWMA), la moyenne mobile de Hull (LME), et bien plus encore. Moyenne mobile élevée (HMA), moyenne mobile approximative (RMA) et moyenne mobile d’Arnold-Leguise (ALMA). La stratégie prend en charge un système de croisement à deux ou trois lignes et peut choisir de manière flexible d’être long ou court en fonction des conditions du marché.

Principe de stratégie

La logique principale de la stratégie est de juger la tendance du marché en observant la relation croisée entre les moyennes mobiles de différentes périodes. Lorsque la moyenne mobile rapide croise la moyenne mobile lente vers le haut, un signal long est généré ; sinon, un signal court est généré. Le système propose deux méthodes d’entrée : l’une est basée sur le croisement direct de la moyenne mobile, et l’autre est basée sur la relation de position du cours de clôture par rapport à la moyenne mobile. Le système à trois lignes augmente la fiabilité et la stabilité du signal en introduisant la moyenne mobile à moyen terme.

Avantages stratégiques

  1. Forte adaptabilité : en intégrant sept moyennes mobiles différentes, la stratégie peut s’adapter à différents environnements de marché et produits de trading
  2. Signal stable : plusieurs mécanismes de confirmation sont utilisés pour éviter les faux signaux
  3. Paramètres flexibles : prend en charge les paramètres de cycle personnalisés, facile à optimiser et à tester en amont
  4. Risque contrôlable : Fournir un mécanisme de vente à découvert pour aider à saisir les opportunités de trading bidirectionnel
  5. Visualisation claire : la stratégie fournit une interface graphique intuitive, comprenant des aides visuelles telles que le remplissage des zones de tendance

Risque stratégique

  1. Décalage : les moyennes mobiles sont essentiellement des indicateurs retardés et peuvent manquer le meilleur point d’entrée sur un marché volatil.
  2. Ne convient pas aux marchés volatils : de faux signaux fréquents peuvent être générés dans un marché latéral et volatil
  3. Dépendance des paramètres : les performances des différentes combinaisons de paramètres varient considérablement et doivent être optimisées en permanence
  4. Risque systémique : il peut être impossible d’arrêter les pertes à temps lorsque des événements de marché se produisent.

Orientation de l’optimisation de la stratégie

  1. Présentation des indicateurs de volatilité : Il est recommandé de combiner des indicateurs de volatilité tels que l’ATR pour ajuster dynamiquement la taille de la position
  2. Ajouter un filtre d’environnement de marché : vous pouvez ajouter des indicateurs de force de tendance pour filtrer les signaux de trading sur les marchés volatils
  3. Optimiser le mécanisme de stop loss : Il est recommandé d’ajouter une fonction de stop loss suiveur pour améliorer les capacités de contrôle des risques
  4. Ajouter une analyse de volume : il est recommandé de combiner les changements de volume pour confirmer la validité de la tendance

Résumer

Cette stratégie est un système complet de suivi des tendances qui fournit aux traders un cadre de trading quantitatif fiable en intégrant plusieurs indicateurs de moyenne mobile et des paramètres flexibles. Bien qu’il existe un certain décalage, la stratégie présente néanmoins une bonne valeur pratique grâce à une optimisation raisonnable des paramètres et à des mesures de contrôle des risques. Il est recommandé aux traders d’effectuer une optimisation ciblée dans le cadre d’un trading réel en fonction des caractéristiques spécifiques du marché.

Code source de la stratégie
/*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)