Stratégie de combinaison des moyennes mobiles dynamiques

Auteur:ChaoZhang est là., Date: 2024-02-05 10h23
Les étiquettes:

img

Résumé

La Dynamic Moving Average Crossover Combo Strategy est une stratégie de trading combinée qui intègre plusieurs indicateurs techniques et détections des conditions du marché. Elle calcule dynamiquement la volatilité du marché et détermine trois phases du marché en fonction de la distance de prix par rapport à la moyenne mobile à long terme et à la volatilité: volatile, tendance et consolidation.

La logique de la stratégie

Calculer la volatilité du marché

Utilisez l'indicateur ATR pour mesurer la volatilité du marché au cours des 14 derniers jours.

Déterminer les phases du marché

Calculez la distance entre le prix et la SMA de 200 jours. Si la distance absolue dépasse 1,5 fois la volatilité moyenne avec une direction claire, elle est déterminée comme un marché tendance. Si la volatilité actuelle dépasse 1,5 fois la moyenne, c'est un marché volatil.

Le transfert entre les EMA et les SMA

La période EMA rapide est de 10 jours. La période SMA lente est de 30 jours. Un signal d'achat est généré lorsque l'EMA rapide traverse au-dessus de la SMA lente.

Le MACD

Calculer le MACD avec 12, 26, 9 paramètres. Un histogramme MACD positif donne un signal d'achat.

Les bandes de Bollinger

Si la largeur du canal est inférieure à la SMA de 20 jours elle-même, elle se consolide.

Règles d'entrée

Volatile: Entrez long lorsque le crossover ou le MACD est positif avec le prix à l'intérieur des bandes.

Tendance: Entrez long lorsque le crossover ou le MACD est positif.

Consolidation: Entrez long lorsque le prix est au-dessus de la bande inférieure.

Règles de sortie

Général: sortie lorsque le MACD est négatif pendant 2 bars et que le prix chute pendant 2 jours.

Volatile: plus sortie lorsque StockRSI est suracheté.

Consolidation: plus sortie lorsque le prix est inférieur à la marge supérieure.

Les avantages

La stratégie présente les points forts suivants:

  1. Opérations systématiques avec des interventions moins subjectives.

  2. Paramètres adaptatifs ajustés en fonction des conditions du marché.

  3. Une précision de signal plus élevée avec une combinaison de plusieurs indicateurs.

  4. Moins de risque avec les bandes de Bollinger.

  5. Filtrage des conditions afin d'éviter les faux signaux.

  6. Stop-loss dynamique et profit pour suivre les tendances.

Les risques

Les principaux risques sont les suivants:

  1. Stratégie invalide si le paramètre n'est pas réglé correctement.

  2. Échec du modèle dû à des événements soudains.

  3. Marge de profit réduite sur le coût de négociation.

  4. Plus de complexité avec plusieurs modules.

Amélioration

Les orientations possibles d'optimisation sont les suivantes:

  1. Améliorer les critères d'appréciation de l'environnement du marché.

  2. Introduire l'apprentissage automatique pour l'adaptation automatique des paramètres.

  3. Ajoutez l'analyse de texte pour détecter les événements.

  4. Tests antérieurs sur plusieurs marchés pour trouver les meilleurs paramètres.

  5. Mettez en œuvre une stratégie d'arrêt de trail pour un meilleur profit.

Conclusion

La stratégie Dynamic Moving Average Crossover Combo est un système de trading quantitatif intelligent à multiples indicateurs. Elle ajuste les paramètres de manière dynamique en fonction des conditions du marché pour mettre en œuvre un trading systématique basé sur des règles. La stratégie est très adaptative et déterministe. Mais les paramètres et les modules supplémentaires doivent être introduits avec soin pour éviter une complexité excessive.


/*backtest
start: 2024-01-28 00:00:00
end: 2024-02-04 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)
avg_volatility_sma = ta.sma(volatility, 100)
avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma

// Market Phase detection
long_term_ma = ta.sma(close, 200)
distance_from_long_term_ma = close - long_term_ma
var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma)
var bool isVolatile = volatility > 1.5 * avg_volatility

// EMA/MA Crossover
fast_length = 10
slow_length = 30
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal or (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
isConsolidating = (upper - lower) < ta.sma(upper - lower, 20)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 75
oversold = 25

var float potential_SL = na
var float potential_TP = na
var bool buy_condition = na
var bool sell_condition = na

// Buy and Sell Control Variables
var bool hasBought = false
var bool hasSold = true

// Previous values tracking
prev_macdHistogram = macdHistogram[1]
prev_close = close[1]

// Modify sell_condition with the new criteria
if isVolatile
    buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper)
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

if isTrending
    buy_condition := not hasBought and crossover_signal or macd_signal
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - volatility
    potential_TP := close + 2 * volatility

if isConsolidating
    buy_condition := not hasBought and crossover_signal and (close > lower)
    sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

// Update the hasBought and hasSold flags
if buy_condition
    hasBought := true
    hasSold := false

if sell_condition
    hasBought := false
    hasSold := true

// Strategy Entry and Exit
if buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05)

if sell_condition
    strategy.close("BUY")
    
// Visualization
plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)


Plus de