Quantitative Trendfolgestrategie


Erstellungsdatum: 2024-02-01 11:42:22 zuletzt geändert: 2024-02-01 11:42:22
Kopie: 0 Klicks: 524
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitative Trendfolgestrategie

Überblick

Die Strategie nutzt mehrere Indikatoren wie Bollinger Bands, RSI, ADX und MACD, um die Markttrends zu beurteilen und hat eine starke Trenderkennungsfähigkeit. Wenn der Indikatorsignal gleichzeitig bullish ist, wird eine Nachholstrategie angewendet; Wenn der Indikatorsignal gleichzeitig bearish ist, wird ein Stillstand eingestellt.

Strategieprinzip

  • Benutzung der Bollinger Bands, um zu beurteilen, ob der Preis in der Nähe der Bollinger Bands auf oder abwärts bewegt ist, als Grundlage für die Feststellung, ob ein Trend entsteht
  • In Verbindung mit dem RSI-Indikator, um zu beurteilen, ob Sie in einer überkauften oder überverkauften Zone sind, um einen Falschbruch zu vermeiden
  • Die ADX wird verwendet, um die Trendstärke zu bestimmen und nur dann zu signalisieren, wenn der Trend stark ist
  • Die MACD wird verwendet, um die Übereinstimmung von kurz- und langfristigen Trends zu ermitteln.
  • In-Tag-Zeit-Kombinationen, die nur zu bestimmten Zeiten gehandelt werden

Durch eine Kombination aus mehreren Indikatoren kann man die Preisentwicklung präzise identifizieren, sie zeitnah verfolgen und überschüssige Gewinne erzielen.

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, dass die Komplexität und Genauigkeit der Indikatoren die Preisentwicklung identifizieren und falsche Signale durch einen einzelnen Indikator vermeiden.

Die Vorzüge sind:

  1. Der Brin-Band kann die Bandbreite und die Schwäche von Preisschwankungen bestimmen.
  2. RSI vermeidet Überkauf und überverkauf
  3. Der ADX beurteilt die Stärke des Trends und folgt nur dem starken Trend
  4. Die MACD beurteilt die Konsistenz der kurzen und langen Linien
  5. Das Risiko von Übernachtungen wird dadurch vermieden.

Durch die Kombination von Indikatoren kann die Gefahr von Falschmeldungen minimiert und die Strategie stabilisiert werden.

Risikoanalyse

Die Hauptrisiken dieser Strategie sind:

  1. Ein Ereignis, das die Indikatoren außer Kraft setzt
  2. Der Erdbeben erzeugte zahlreiche Falschsignale.

Für Risiko 1 ist die Abhängigkeit von mehreren Indikatoren in der Lage, die Ausfallprobleme eines einzelnen Indikators zu einem gewissen Grad zu vermeiden, aber die Risikokontrollmechanismen müssen noch verbessert werden.

Die Parameter können entsprechend dem Risiko 2 angepasst werden, um den Handelsbereich zu verkleinern, die Handelsfrequenz zu verringern und das Risiko zu verringern.

Optimierungsrichtung

Die wichtigsten Optimierungsmöglichkeiten für diese Strategie sind:

  1. Erhöhung der Verlustmechanismen, wie beispielsweise Bewegungsschaden, Zeitschaden, Durchbruchsschaden, um zu verhindern, dass der Rückzug zu tief ist
  2. Optimierung der Parameter, Anpassung der Indexparameterkombination und Suche nach den optimalen Parametern
  3. Erhöhung der Filterbedingungen, z. B. durch die Filterung der Übergangsmenge, um kleine Falschbrüche zu vermeiden
  4. Verbesserte Signalgenauigkeit in Kombination mit weiteren Kennzahlen wie KDJ, OBV usw.
  5. Automatische Optimierung von Parametern mit Hilfe von Machine Learning

Durch die kontinuierliche Optimierung wird die Strategieparameter stetig verbessert und die Wahrscheinlichkeit von Falschsignalen verringert.

Zusammenfassen

Die Strategie ist insgesamt in der Lage, Trendsignale zu identifizieren und kann Preistrends durch eine Kombination von Indikatoren effektiv identifizieren.

Es besteht jedoch ein gewisses Risiko, dass ein ständiges Verbessern der Windkontrollmechanismen und eine kontinuierliche Optimierung der Parameter erforderlich sind, um eine langfristige stabile Funktionsweise zu gewährleisten. Wenn Methoden wie Maschinelles Lernen in der späteren Phase eingeführt werden können, um die automatische Optimierung der Parameter zu erreichen, wird die Robustheit und die Ertragsfähigkeit der Strategie erheblich verbessert.

Strategiequellcode
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)