Stratégie de moyenne d'inversion de l'enveloppe moyenne mobile

Auteur:ChaoZhang est là., Date: 2023-12-04 16:12:39 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie des moyennes mobiles est une stratégie de trading basée sur les moyennes mobiles. Elle utilise la moyenne mobiles double exponentielle (DEMA) comme calcul de base et ajoute plusieurs enveloppes au-dessus et en dessous. Lorsque le prix touche les bandes d'enveloppe, il ouvre des positions longues ou courtes en fonction de la direction.

La logique de la stratégie

La stratégie utilise la moyenne mobile exponentielle double (DEMA) comme indicateur de base, qui est une moyenne mobile plus sensible aux changements de prix récents. Au-dessus et en dessous de la DEMA, plusieurs bandes de prix sont ajoutées pour former une zone d'enveloppe.

Lorsque le prix augmente et s'approche de la bande supérieure de l'enveloppe, la stratégie ouvre une position courte. Lorsque le prix baisse et atteint la bande inférieure de l'enveloppe, elle ouvre une position longue. Elle ajoute une nouvelle position à chaque fois qu'une nouvelle bande de prix est touchée. Lorsque le prix régresse près de la moyenne mobile, toutes les positions sont fermées.

En capturant les fluctuations de prix excessives avec les bandes d'enveloppe et en profitant des renversements, la stratégie vise à acheter bas et à vendre haut.

Les avantages

  • Utilise la moyenne mobile exponentielle double, qui est sensible aux variations de prix à court terme pour détecter les renversements de tendance.
  • Les bandes d'enveloppe autour de la moyenne mobile peuvent capturer avec précision les renversements de prix.
  • Ouvre des positions par lots, en utilisant pleinement l'efficacité du capital.
  • Changez rapidement de direction après avoir réalisé des profits pour vous adapter aux changements du marché.
  • Les paramètres peuvent être librement optimisés.

Les risques

  • Incapable de tirer profit de la forte tendance des marchés.
  • Des paramètres incorrects peuvent entraîner une survente.
  • Il a besoin de marchés relativement stables, qui ne conviennent pas à des environnements très volatils.
  • Les enveloppes trop étroites peuvent empêcher l'entrée dans les positions.

Les risques peuvent être réduits en élargissant de manière appropriée la plage d'enveloppe afin d'accroître la sensibilité et en ajustant la longueur de la moyenne mobile pour qu'elle s'adapte aux différents cycles du marché.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Testez différents algorithmes de moyenne mobile.

  2. Ajustez le paramètre de longueur moyenne mobile pour mieux s'adapter aux fluctuations à court terme.

  3. Optimiser les paramètres de l'enveloppe en testant différents paramètres de pourcentage.

  4. Ajoutez des méthodes de stop loss comme le stop loss de trailing pour limiter les pertes d'un seul trade.

  5. Ajouter des conditions de filtrage avec d'autres indicateurs pour éviter les entrées non valides sur des marchés irrationnels.

Conclusion

La stratégie des moyennes moyennes mobiles capture efficacement les opportunités de réversion moyennes en construisant un canal de prix autour de la moyenne mobile. Elle peut être adaptée de manière flexible à différents environnements de marché grâce à des ajustements de paramètres.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Plus de