Quantitative Trendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-01 11:42:22
Tags:

img

Übersicht

Diese Strategie verwendet mehrere Indikatoren wie Bollinger Bands, RSI, ADX, MACD, um Markttrends zu beurteilen und verfügt über eine starke Trendidentifikationsfähigkeit. Sie folgt der Trendstrategie, wenn die Indikatorsignale gleichzeitig bullisch sind. Sie schließt Positionen, um Verluste zu stoppen, wenn die Indikatorsignale gleichzeitig bärisch sind.

Strategieprinzip

  • Verwenden Sie Bollinger-Bänder zu beurteilen, ob der Preis in der Nähe der oberen oder unteren Schiene ist, um festzustellen, ob ein Trend gebildet wird
  • Kombination mit dem RSI-Indikator, um Überkauf- und Überverkaufszonen zu vermeiden und falsche Ausbrüche zu vermeiden
  • Verwenden Sie ADX zur Bestimmung der Trendstärke und signalisieren Sie nur, wenn die Trendstärke stark ist
  • Einführung des MACD zur Beurteilung der Kohärenz von kurz- und langfristigen Trends
  • Begrenzung der Handelssitzungen zur Vermeidung von Overnight-Risiken

Durch das kombinierte Urteilen mehrerer Indikatoren kann es Preistrends genau identifizieren und sie rechtzeitig verfolgen, wenn ein Trend auftritt, um überschüssige Renditen zu erzielen.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass die Bewertung der Indikatorenkombination umfassender und genauer ist, wodurch die Preisentwicklung effektiv erkannt und falsche Signale, die durch einzelne Indikatoren verursacht werden, vermieden werden können.

Die Vorteile sind insbesondere:

  1. Bollinger-Bänder können Preisschwankungsbereich und -stärke bestimmen
  2. RSI vermeidet den Kauf in überkauften Bereichen und den Verkauf in überverkauften Bereichen
  3. ADX bestimmt die Trendstärke, folgt nur starken Trends
  4. Der MACD beurteilt die Kohärenz der kurz- und langfristigen
  5. Grenzwerte für Handelssitzungen zur Vermeidung von Overnight-Risiken

Durch die Bewertung der Indikatorenkombination kann sie die falschen Signale maximieren, reduzieren und die Stabilität der Strategie verbessern.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind folgende:

  1. Marktereignisse, die zu einem Ausfall der Indikatoren führen
  2. Häufige falsche Signale in Bereichsgebundenen Märkten

Für Risiko 1 kann die Abhängigkeit von mehreren Indikatoren das Problem des Ausfalls eines einzelnen Indikators in gewissem Maße lindern, aber die Risikomanagementmechanismen müssen noch verbessert werden.

Bei Risiko 2 können die Parameter entsprechend an einen engen Handelsbereich angepasst und die Handelshäufigkeit verringert werden, um Risiken zu mindern.

Optimierungsrichtlinien

Zu den wichtigsten optimierbaren Aspekten dieser Strategie gehören:

  1. Hinzufügen von Stop-Loss-Mechanismen wie Trailing-Stop-Loss, Time-Stop-Loss, Breakout-Stop-Loss usw., um zu vermeiden, dass zu tief zurückgezogen wird
  2. Optimieren Sie die Parameter, passen Sie die Indikatorparameter Kombination, um optimale
  3. Fügen Sie Filter wie Volumenfilter hinzu, um falsche Ausbrüche in niedrigem Volumen zu vermeiden
  4. Mehr Indikatoren wie KDJ, OBV hinzufügen, um die Genauigkeit des Signals zu verbessern
  5. Einführung von Methoden des maschinellen Lernens zur automatischen Optimierung von Parametern

Durch kontinuierliche Optimierung wird die Parameterrobustheit kontinuierlich verbessert und die Wahrscheinlichkeit falscher Signale verringert.

Zusammenfassung

Insgesamt hat diese Strategie eine relativ starke Fähigkeit, Trendsignale durch Indikatorenkombinationsbeurteilungen zu identifizieren, die Preistrends effektiv identifizieren können.

Es gibt jedoch auch gewisse Risiken, Risikomanagement und Parameteroptimierung müssen kontinuierlich verbessert werden, um langfristige Operationen zu stabilisieren.


/*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)


Mehr