Diese Strategie nutzt die Crossover-Prinzipien zwischen schnellen und langsamen gleitenden Durchschnitten, um Markttrendrichtungen zu bestimmen und Kauf- und Verkaufssignale zu generieren.
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:
Die schnelle Linie überquert die langsame Linie von unten und geht lang.
Die schnelle Linie kreuzt unterhalb der langsamen Linie von oben, geht kurz.
Preisbrüche unterhalb der schnellen Ausstiegslinie, Schließung der Longposition
Der Preis bricht wieder über die schnelle Ausstiegslinie und geht wieder lang ein.
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
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.
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
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))