Strategie für den gleitenden Durchschnitt

Schriftsteller:ChaoZhang, Datum: 2023-12-04 16:12:39
Tags:

img

Übersicht

Die Mean Reversion Envelope Moving Average Strategy ist eine mittlere Reversion-Handelsstrategie, die auf gleitenden Durchschnitten basiert. Sie verwendet den Doppel-Exponentiellen Gleitenden Durchschnitt (DEMA) als Basisberechnung und fügt mehrere Umschläge darüber und darunter hinzu. Wenn der Preis die Umschlagbänder berührt, öffnet er lange oder kurze Positionen basierend auf der Richtung. Wenn der Preis zum gleitenden Durchschnitt zurückfällt, schließt er alle Positionen.

Strategie Logik

Die Strategie verwendet als Basisindikator den Doppel-Exponentiellen gleitenden Durchschnitt (DEMA), ein gleitender Durchschnitt, der empfindlicher auf die jüngsten Preisänderungen reagiert.

Wenn der Preis steigt und sich dem oberen Envelope-Band nähert, eröffnet die Strategie eine Short-Position. Wenn der Preis fällt und den unteren Envelope-Band erreicht, eröffnet sie eine Long-Position. Jedes Mal, wenn ein neuer Preisbereich berührt wird, fügt sie eine neue Position hinzu. Wenn der Preis nahe dem gleitenden Durchschnitt zurückgeht, werden alle Positionen geschlossen.

Durch die Erfassung übermäßiger Preisschwankungen mit den Umschlagbändern und das Profitieren von Umkehrungen zielt die Strategie darauf ab, niedrig zu kaufen und hoch zu verkaufen.

Vorteile

  • Verwendet doppelte exponentielle gleitende Durchschnitte, die für kurzfristige Preisänderungen empfindlich sind, um Trendumkehrungen zu erfassen.
  • Die Umschlagbänder um den gleitenden Durchschnitt können Preisumkehrungen genau erfassen.
  • Eröffnet Positionen in Chargen und nutzt die Kapitaleffizienz voll aus.
  • Schnell nach dem Gewinn wechseln, um sich an Marktveränderungen anzupassen.
  • Die Parameter können frei optimiert werden.

Risiken

  • Nicht in der Lage, von stark trendigen Märkten zu profitieren.
  • Falsche Parameter können zu einem Überhandel führen.
  • Er benötigt relativ stabile Märkte, die nicht für sehr volatile Umgebungen geeignet sind.
  • Zu schmale Umschläge können das Betreten von Positionen verhindern.

Die Risiken können durch eine angemessene Erweiterung des Envelope-Bereichs zur Erhöhung der Empfindlichkeit und die Anpassung der gleitenden Durchschnittslänge an verschiedene Marktzyklen verringert werden.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Verschiedene gleitende Durchschnittsalgorithmen testen.

  2. Anpassen des gleitenden Durchschnittslängenparameters, um sich besser an kurzfristige Schwankungen anzupassen.

  3. Optimieren Sie die Umschlagparameter, indem Sie verschiedene Prozentsatz-Einstellungen testen.

  4. Fügen Sie Stop-Loss-Methoden wie Trailing-Stop-Loss hinzu, um Einzelhandelsverluste zu begrenzen.

  5. Hinzufügen von Filterbedingungen mit anderen Indikatoren, um ungültige Eintritte in irrationale Märkte zu vermeiden.

Schlussfolgerung

Die Mean Reversion Envelope Moving Average Strategie erfasst durch den Aufbau eines Preiskanals rund um den gleitenden Durchschnitt effektiv durchschnittliche Reversionschancen. Sie kann durch Parameteranpassungen flexibel an verschiedene Marktumgebungen angepasst werden.


/*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)


Mehr