Diese Strategie verwendet zwei Arnaud Legoux Moving Averages (ALMA), eine schnelle und eine langsame, um Crossover-Signale zu erzeugen. ALMA reduziert die Verzögerung und glättet die Signallinie im Vergleich zu traditionellen MAs. Ein Volumenfilter wird hinzugefügt, um die Signalgenauigkeit zu verbessern. Es ist für Krypto optimiert, kann aber für andere Instrumente angepasst werden.
Die wichtigsten Indikatoren und Regeln sind:
Kurzer Zeitraum, um Ausbrüche zu erfassen.
Langsamer ALMA: Längerer Zeitraum zur Messung des Trends.
Volumenfilter: Gültig, wenn die kurze EMA über die lange EMA geht.
Kaufsignal: Schnelle ALMA überschreitet langsame ALMA und Volumenfilter.
Verkaufssignal: Schnelle ALMA überschreitet langsame ALMA.
Kurzsignal: Schnelle ALMA-Kreuzungen unter langsamer ALMA-Kreuzungen und Volumenfilter.
Abdeckungssignal: Schnelle ALMA überschreitet langsame ALMA.
Die Strategie kombiniert Trend-, Momentum- und Volumenanalyse für robuste Signale. ALMA reduziert die Verzögerung und verhindert falsche Ausbrüche.
Im Vergleich zu traditionellen gleitenden Durchschnittsstrategien sind die Hauptvorteile:
ALMA reduziert die Verzögerung und verbessert die Signalqualität.
Der Volumenfilter vermeidet Verluste durch falsche Ausbrüche.
Die Kombination "Schnell/langsam" misst die Trendrichtung.
Einfache und intuitive Regeln, einfach umzusetzen.
Flexible Anpassung der MA-Parameter für verschiedene Märkte.
Ein angemessenes Risikomanagement.
Weiteres Optimierungspotenzial durch Parameter-Tuning.
Im Vergleich zu traditionellen Crossover-Strategien insgesamt verbesserte Stabilität und Qualität.
Trotz der Vorteile sind folgende Risiken zu beachten:
Crossover-Systeme sind anfällig für Whipsaws.
ALMA-Leistung hängt von Parameter-Tuning ab.
Lautstärkere Spitzen können die Signalentwicklung irreführen.
Es gibt immer eine gewisse Verzögerung, man kann nicht alle Verluste vermeiden.
Das Risiko einer Überanpassung durch übermäßige Optimierung.
Die Signale versagen, wenn die Lautstärke abnormal ist.
Techniken des maschinellen Lernens können bessere Ergebnisse liefern.
Überwachung des Verhältnisses zwischen Gewinn und Risiko, um übermäßige Abzüge zu vermeiden.
Um den Risiken entgegenzuwirken, können in folgenden Bereichen Verbesserungen vorgenommen werden:
Optimieren Sie ALMA-Parameter für eine bessere Empfindlichkeit.
Experimentieren Sie mit verschiedenen Volumenmetriken.
Einführung von Stop-Loss für die Kontrolle von Verlusten pro Handel.
Einbeziehung anderer Indikatoren für starke Signale.
Fügen Sie ein maschinelles Lernmodul hinzu, um das Signal intelligenter anzupassen.
Einführung in mehrere Produkte zur Diversifizierung der Strategie.
Optimierung von Positionsgrößenmodellen für verschiedene Märkte.
Die Robustheit wird untersucht, um eine Überanpassung zu vermeiden.
Im Vergleich zu traditionellen Crossover-Strategien verbessert diese Strategie die Signalqualität und Robustheit durch den ALMA-Algorithmus und den Volumenfilter.
/*backtest start: 2022-09-16 00:00:00 end: 2023-09-22 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/ // © Sarahann999 // Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/ //@version=5 strategy("ALMA Cross", overlay=true) //User Inputs src= (close) long_entry = input(true, title='Long Entry') short_entry = input(true, title='Short Entry') //Fast Settings ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings") alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma) //Slow Settings ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings") alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2) //Volume var cumVol = 0. cumVol += nz(volume) if barstate.islast and cumVol == 0 runtime.error("No volume is provided by the data vendor.") shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings") longlen = input.int(10, minval=1, title = "Long Length") short = ta.ema(volume, shortlen) long = ta.ema(volume, longlen) osc = 100 * (short - long) / long //Define Cross Conditions buy = ta.crossover(Alma1, Alma2) sell = ta.crossunder(Alma1, Alma2) //Calculate Take Profit Percentage longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage', minval=0.0, step=0.1, defval=2) / 100 shortProfitPerc = input.float(title="Short Take Profit", minval=0.0, step=0.1, defval=2) / 100 // Figure out take profit price 1 longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) // Make inputs that set the stop % 1 longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage', minval=0.0, step=0.1, defval=2.5) / 100 shortStopPerc = input.float(title="Short Stop Loss", minval=0.0, step=0.1, defval=2.5) / 100 // Figure Out Stop Price longStopPrice = strategy.position_avg_price * (1 - longStopPerc) shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc) //Define Conditions buySignal = buy and osc > 0 and strategy.position_size == 0 //sellSignal sellSignal = sell and osc > 0 and strategy.position_size == 0 // Submit entry orders if buySignal and long_entry strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long") alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar) if sellSignal and short_entry strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short") alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar) // Submit exit orders based on take profit price if (strategy.position_size > 0) strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}") if (strategy.position_size < 0) strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}") //Draw plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles) plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)