Dynamik- und Durchschnittsverlagerungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-09-21 21:29:22
Tags:

Übersicht

Diese Strategie nutzt die Crossover-Prinzipien zwischen schnellen und langsamen gleitenden Durchschnitten, um Markttrendrichtungen zu bestimmen und Kauf- und Verkaufssignale zu generieren.

Strategie Logik

Die Strategie verwendet zwei gleitende Durchschnitte, eine schnelle Linie und eine langsame Linie. Die schnelle Linie verwendet eine 3-tägige EMA und die langsame Linie verwendet eine 15-tägige EMA. Wenn die schnelle Linie über die langsame Linie von unten geht, zeigt sie einen Aufwärtstrend an und gibt ein Kaufsignal. Im Gegenteil, wenn die schnelle Linie unter die langsame Linie von oben geht, signalisiert sie einen Abwärtstrend und gibt ein Verkaufssignal.

Die Strategie setzt auch einen schnelleren 3-Tage-EMA als schnelle Exit-Linie. Wenn der Preis unterhalb dieser schnellen Exit-Linie bricht, beurteilt sie, dass der Trend umgekehrt ist und die bestehende Long-Position verlassen sollte. Ebenso, wenn der Preis über die Exit-Linie bricht, zeigt sie einen erneuten Aufwärtstrend an und gibt ein Signal, wieder lang zu gehen.

Die spezifischen Betriebssignale sind wie folgt festgelegt:

  1. Die schnelle Linie überquert die langsame Linie von unten und geht lang.

  2. Die schnelle Linie kreuzt unterhalb der langsamen Linie von oben, geht kurz.

  3. Preisbrüche unterhalb der schnellen Ausstiegslinie, Schließung der Longposition

  4. Der Preis bricht wieder über die schnelle Ausstiegslinie und geht wieder lang ein.

Vorteile

  • Einfach zu bedienen, nur zwei gleitende Durchschnittsparameter konfigurieren, einfach zu implementieren

  • Ausreichende Daten aus dem Backtesting, Verwendung gemeinsamer Indikatoren zur Bewertung der Rentabilität

  • Viele konfigurierbare Parameter für die Optimierung

  • Übernimmt eine schnelle Exitlinie als Stop-Loss, um das Risiko besser zu kontrollieren

  • Klare Strategie-Logik, explizite Kauf- und Verkaufssignale

  • Angemessene Betriebsfrequenz, Vermeidung von Überhandelungen

Risiken

  • Anfällig für mehr falsche Signale, wenn der Trend unklar ist, als bei einer Trendstrategie

  • Bewegliche Durchschnittswerte haben einen Verzögerungscharakter, können Wendepunkte verpassen

  • Feste Parameter können sich nicht an Marktveränderungen anpassen, müssen optimiert werden

  • Stopp-Loss kann zu weich sein, um den Stop-Loss rechtzeitig zu stoppen

  • Häufige Signale können zu höheren Handelskosten führen

  • Signale können abweichen und müssen mit anderen Indikatoren bestätigt werden

Risiken können durch Parameteroptimierung, Filter hinzufügen, Stop-Loss entspannen, Parameter zeitnah aktualisieren usw. verwaltet werden.

Erweiterung

  • Prüfung und Optimierung von Parametern, um sie besser an die Marktbedingungen anzupassen

  • Einführung weiterer Indikatoren zur Bildung eines robusten Systems

  • Erstellen Sie anpassungsfähige Parameter-Einstellungen basierend auf dem Echtzeitmarkt

  • Anwendung von Modellen für maschinelles Lernen für eine intelligentere Optimierung

  • Für eine bessere Risikokontrolle einen dynamischen oder einen nachfolgenden Stop-Loss festlegen

  • Kombination von Volumenindikatoren zur Vermeidung von Abweichungen

Schlussfolgerung

Dies ist eine relativ einfache doppelte gleitende Durchschnitts-Crossover-Strategie. Sie bestimmt Markttrends und Handelssignale basierend auf der Interaktion zwischen schnellen und langsamen gleitenden Durchschnitten. Die Strategie ist einfach umzusetzen und kann über Optimierung angepasst werden. Aber sie birgt auch einige Risiken. Mehr Filter sind erforderlich, um Signale zu bestätigen und Risiken zu managen. Wenn sie richtig optimiert und auf den mittelfristigen Handel angewendet wird, kann sie zu einem sehr praktischen quantitativen Handelssystem werden.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Mehr