ALMA Crossover-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-09-23 15:11:02
Tags:

Übersicht

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.

Strategie Logik

Die wichtigsten Indikatoren und Regeln sind:

  1. Kurzer Zeitraum, um Ausbrüche zu erfassen.

  2. Langsamer ALMA: Längerer Zeitraum zur Messung des Trends.

  3. Volumenfilter: Gültig, wenn die kurze EMA über die lange EMA geht.

  4. Kaufsignal: Schnelle ALMA überschreitet langsame ALMA und Volumenfilter.

  5. Verkaufssignal: Schnelle ALMA überschreitet langsame ALMA.

  6. Kurzsignal: Schnelle ALMA-Kreuzungen unter langsamer ALMA-Kreuzungen und Volumenfilter.

  7. 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.

Vorteile

Im Vergleich zu traditionellen gleitenden Durchschnittsstrategien sind die Hauptvorteile:

  1. ALMA reduziert die Verzögerung und verbessert die Signalqualität.

  2. Der Volumenfilter vermeidet Verluste durch falsche Ausbrüche.

  3. Die Kombination "Schnell/langsam" misst die Trendrichtung.

  4. Einfache und intuitive Regeln, einfach umzusetzen.

  5. Flexible Anpassung der MA-Parameter für verschiedene Märkte.

  6. Ein angemessenes Risikomanagement.

  7. Weiteres Optimierungspotenzial durch Parameter-Tuning.

  8. Im Vergleich zu traditionellen Crossover-Strategien insgesamt verbesserte Stabilität und Qualität.

Risiken

Trotz der Vorteile sind folgende Risiken zu beachten:

  1. Crossover-Systeme sind anfällig für Whipsaws.

  2. ALMA-Leistung hängt von Parameter-Tuning ab.

  3. Lautstärkere Spitzen können die Signalentwicklung irreführen.

  4. Es gibt immer eine gewisse Verzögerung, man kann nicht alle Verluste vermeiden.

  5. Das Risiko einer Überanpassung durch übermäßige Optimierung.

  6. Die Signale versagen, wenn die Lautstärke abnormal ist.

  7. Techniken des maschinellen Lernens können bessere Ergebnisse liefern.

  8. Überwachung des Verhältnisses zwischen Gewinn und Risiko, um übermäßige Abzüge zu vermeiden.

Erweiterung

Um den Risiken entgegenzuwirken, können in folgenden Bereichen Verbesserungen vorgenommen werden:

  1. Optimieren Sie ALMA-Parameter für eine bessere Empfindlichkeit.

  2. Experimentieren Sie mit verschiedenen Volumenmetriken.

  3. Einführung von Stop-Loss für die Kontrolle von Verlusten pro Handel.

  4. Einbeziehung anderer Indikatoren für starke Signale.

  5. Fügen Sie ein maschinelles Lernmodul hinzu, um das Signal intelligenter anzupassen.

  6. Einführung in mehrere Produkte zur Diversifizierung der Strategie.

  7. Optimierung von Positionsgrößenmodellen für verschiedene Märkte.

  8. Die Robustheit wird untersucht, um eine Überanpassung zu vermeiden.

Schlussfolgerung

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)

Mehr