Vollständige Krypto-Swing ALMA Kreuz MACD Quantitative Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-05 10:24:34
Tags:

img

Übersicht

Diese Strategie basiert auf den goldenen Kreuz- und toten Kreuzsignalen der doppelten ALMA- gleitenden Durchschnittslinien, kombiniert mit den langen und kurzen Signalen des MACD-Indikators, um automatische Long- und Short-Positionen zu erzielen.

Strategieprinzip

Die Strategie verwendet schnelle und langsame Linien, die aus ALMA konstruiert wurden, um den doppelten gleitenden Durchschnitt zu erstellen. Die Schnelle Linienlänge beträgt 20 und die langsame Linienlänge 40, wobei beide eine Verschiebung von 0,9 und eine Standardabweichung von 5 annehmen. Wenn die schnelle Linie über die langsame Linie geht, wird ein langes Signal erzeugt. Wenn die schnelle Linie unterhalb der langsamen Linie geht, wird ein kurzes Signal erzeugt.

Gleichzeitig enthält die Strategie das Histogrammsignal des MACD-Indikators. Nur wenn das MACD-Histogramm positiv ist (steigend), ist das lange Signal gültig; nur wenn das MACD-Histogramm negativ ist (fallend), ist das kurze Signal gültig.

Die Strategie legt auch die Bedingungen für Take Profit und Stop Loss fest. Der Long Take Profit beträgt 2 Mal und der Stop Loss 0,2 Mal; der Short Take Profit beträgt 0,05 Mal und der Stop Loss 1 Mal.

Analyse der Vorteile

Die Strategie kombiniert das Trendbeurteil des doppelten gleitenden Durchschnitts und das Energiebeurteil des MACD-Indikators, das falsche Signale effektiv filtern und die Genauigkeit des Eintrags verbessern kann.

Die Backtest-Daten werden seit 2017 übernommen und decken mehrere Bullen- und Bären-Konversionszyklen ab. Die Strategie funktioniert immer noch über die Perioden hinweg gut. Dies beweist, dass sich die Strategie sowohl an die Linearität als auch an die Nichtlinearität des Marktes anpasst.

Risikoanalyse

Die Strategie birgt folgende Risiken:

  1. Der doppelte gleitende Durchschnitt selbst hat eine Verzögerungseffekt, möglicherweise fehlende kurzfristige Möglichkeiten
  2. Wenn das MACD-Histogramm null ist, wird die Strategie keine Signale erzeugen.
  3. Die Profit- und Stop-Loss-Kennzahlen sind voreingestellt, können von der tatsächlichen Marktlage abweichen

Lösungen:

  1. Der gleitende Durchschnittszyklus sollte angemessen verkürzt werden, um die Empfindlichkeit für die kurzfristige Entwicklung zu verbessern.
  2. Optimieren Sie die MACD-Parameter, um die Schwankungen des Histogramms häufiger zu machen
  3. Dynamische Anpassung der Gewinn- und Stop-Loss-Einstellungen

Optimierungsrichtlinien

Die Strategie kann auch in folgenden Aspekten optimiert werden:

  1. Versuchen Sie verschiedene Arten von gleitenden Durchschnitten, um bessere Glättungseffekte zu finden
  2. Optimierung der Parameter der gleitenden Durchschnitte und des MACD für verschiedene Produkte und Zyklen
  3. Hinzufügen zusätzlicher Bedingungen wie Handelsvolumenänderungen zu Filtersignalen
  4. Anpassung der Gewinn- und Stop-Loss-Verhältnisse in Echtzeit für eine bessere Anpassungsfähigkeit

Schlussfolgerung

Die Strategie kombiniert erfolgreich das Trendurteil von gleitenden Durchschnitten und das Hilfsurteil des MACD und legt angemessene Take-Gewinne und Stop-Losses fest, die in verschiedenen Marktbedingungen stabile Renditen erzielen können.


/*backtest
start: 2023-11-04 00:00:00
end: 2023-12-04 00:00:00
period: 1h
basePeriod: 15m
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/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')

Mehr