Schnelle QQE-Crossover-Handelsstrategie basierend auf dem Trendfilter

Schriftsteller:ChaoZhang, Datum: 2024-01-25 11:34:58
Tags:

img

Übersicht

Die schnelle QQE-Crossover-Handelsstrategie basierend auf dem Trendfilter ist eine Trendfolgestrategie, bei der schnelle QQE-Kreuzungen mit gleitenden Durchschnitten zur Trendrichtungfilterung verwendet werden.

  • RSI-Signalkreuzung NULL (XZERO)
  • RSI-Signal überquert Schnelle RSIatr-Linie (XQQE)
  • Das RSI-Signal, das den RSI-Schwellenkanal verlässt (KAUF/VERKAUF)

Die Warnmeldungen (KAUF/VERKAUF) können optional anhand der gleitenden Durchschnitte gefiltert werden:

  • Für den BUY-Alarm muss der Close über dem schnellen MA und dem schnellen MA (EMA8) > mittleren MA (EMA20) > langsamen MA (SMA50) liegen.
  • Für die SELL-Warnung muss der Schlusspunkt unterhalb der schnellen MA und der schnellen MA (EMA8) < mittlere MA (EMA20) < langsame MA (SMA50) liegen.

und/oder Richtungsfilter:

  • Für den BUY-Alarm muss der Schlusspunkt über dem langsamen MA (SMA50) und der richtungsweisende MA (EMA20) grün sein.
  • Für den SELL-Alarm muss der Schlusspunkt unterhalb des langsamen MA (SMA50) und der richtungsweisende MA (EMA20) rot sein.

Die XZERO und XQQE sind nicht im Filter enthalten, sie werden verwendet, um anhängige BUY/SELL-Warnungen, insbesondere die XZERO, anzuzeigen.

Diese Strategie sollte für jedes Währungspaar und die meisten Chartzeiträume funktionieren.

Strategieprinzip

Die Kernidee dieser Strategie besteht darin, den Richtungsübergang des schnellen QQE-Indikators als Handelssignale zu verwenden und laute Handelssignale durch die Kombination von gleitenden Durchschnitten auszufiltern, um die Trendrichtung zu erfassen.

Die Strategie verwendet insbesondere folgende Indikatoren und Signale:

Schneller QQE-Indikator: Dies ist ein RSI-basierter Indikator mit zusätzlicher Glättung, um ihn empfindlicher und schneller zu machen. Der Indikator besteht aus drei Linien: Die mittlere Linie ist der exponentielle gleitende Durchschnitt des RSI, die obere Linie ist die mittlere Linie + schnelle ATR * ein Faktor, und die untere Linie ist die mittlere Linie - schnelle ATR * ein Faktor. Wenn der RSI über die obere Linie geht, ist es ein Verkaufssignal. Wenn der RSI unter die untere Linie geht, ist es ein Kaufsignal.

Kreuzung der Nulllinie: Es erzeugt Signale, wenn die mittlere Linie des RSI die Nulllinie überschreitet. Aufwärts-Crossover ist ein Kaufsignal und nach unten-Crossover ist ein Verkaufssignal. Diese Signale zeigen den Auftakt von Trendänderungen an.

Kanalbruch: Es erzeugt Signale, wenn die mittlere Linie des RSI in den festgelegten Schwellenkanal eintritt. Das Durchbrechen des oberen Kanals ist das Verkaufssignal und das Durchbrechen des unteren Kanals ist das Kaufsignal.

Kombination von gleitenden Durchschnitten: Verwenden Sie eine Kombination aus schnellen (8 Perioden), mittleren (20 Perioden) und langsamen (50 Perioden) gleitenden Durchschnitten. Wenn die drei Linien so angeordnet sind: schnell > mittleres > langsam, ist es ein Aufwärtstrend. Wenn sie als schnell < mittleres < langsam angeordnet sind, ist es ein Abwärtstrend. Die Kombination wird verwendet, um die allgemeine Trendrichtung zu bestimmen.

Trendrichtung Filter: Ein Kaufsignal wird nur erzeugt, wenn der Schlusskurs über dem langsamen gleitenden Durchschnitt liegt und der mittlere gleitende Durchschnitt (20 Perioden) nach oben ist (höchster Preis der Periode > niedrigster Preis). Ein Verkaufssignal wird nur erzeugt, wenn der Schlusskurs unter dem langsamen gleitenden Durchschnitt liegt und der mittlere gleitende Durchschnitt (20 Perioden) nach unten ist. Dies kann einige umgekehrte falsche Signale herausfiltern.

Durch die Kombination der Verwendung von Crossover-Signalen aus dem schnellen QQE-Indikator und der Trendfilterung aus gleitenden Durchschnitten erfasst es kurzfristige Umkehrpunkte bei wichtigen Zeitrahmentrends, um ein relativ vollständiges Handelssystem zu bilden. Gleichzeitig sind die Indikatorparameter relativ empfindlich eingestellt, um den Wendepunkt der Trends so früh wie möglich zu erfassen.

Zusammenfassend ist dies eine Strategie, die mittelfristige und langfristige Trends verfolgt, schnelle Indikatoren verwendet, um den Zeitpunkt von kurzfristigen Umkehrungen für den Einstieg/Ausgang zu erfassen, und bewegliche Durchschnittsfilterung verwendet, um das Risiko des Handels gegen die Richtung zu reduzieren und somit die Rendite zu maximieren.

Vorteile der Strategie

  • Benutzt einen schnellen und sensiblen QQE-Indikator, um umkehrende Signale schnell zu erfassen
  • Anwendung mehrerer gleitender Durchschnitte zur Bestimmung der großen Zyklusrichtung und Vermeidung von Trends
  • Einbezogen sind mehrere Kreuzsignale, die in Kombination zur Erhöhung der Gewinnchancen verwendet werden können
  • Einstellbare Parameter, die für verschiedene Produkte und Zeitrahmen optimiert werden können
  • Benutzt die Indikatoreigenen Kanal-Break-out-Signale anstelle von getrennten Kanälen, um Parameterabhängigkeit zu vermeiden
  • Kann kurzfristige Umkehrbewegungen sehr gut unter großen Trendzyklen erfassen
  • Einfache und klare Konzepte, leicht zu verstehen und umzusetzen

Risiken der Strategie

Diese Strategie birgt auch einige potenzielle Risiken:

  • Schnelle Indikatoren neigen dazu, falsche Signale zu erzeugen, die durch gleitende Durchschnitte nicht vollständig herausgefiltert werden können.
  • Wenn eine große Trendwende des Zyklus eintritt, bilden sich in der Regel umgekehrte Handelssignale, die Risiken darstellen.
  • Keine Berücksichtigung von Geldmanagementfaktoren, Risiken eines übermäßigen Handels und Verlusten
  • Keine Stop-Loss-Regelung, die Gefahr einer Ausweitung der Verluste ist groß
  • Risiko für die Anpassung an die Daten aus den Backtests, die tatsächliche Leistung muss noch überprüft werden

Gegenmaßnahmen und Lösungen umfassen:

  • Anpassung der gleitenden Durchschnittsparameter, Verwendung von mehr Zykluslängen zur Bestimmung von Trends
  • Hinzufügen anderer Indikatoren wie MACD, Verzerrung usw. für das Filtern von Kombinationen
  • Hinzufügen von Stop-Loss-Strategien zur Kontrolle der Größe eines einzelnen Verlustes
  • Testen mit echtem Geld, Optimierung von Parametern

Optimierungsrichtlinien

Diese Strategie kann weiter optimiert werden:

  1. Optimieren Sie schnelle und langsame Linienparameter des QQE-Indikators, um eine optimale Parameterkombination zu finden
  2. Test mehr gleitende Durchschnittskombinationen, um optimale Filterleistung zu finden
  3. Hinzufügen anderer Indikatoren wie MACD für die Hilfssignalfilterung
  4. Anwendung von Geldmanagementstrategien zur Optimierung der Positionsgröße
  5. Einrichtung einer Stop-Loss-Strategie zur Kontrolle des Abwärtsrisikos pro Handel
  6. Optimierung von Parametern auf der Grundlage verschiedener Produkte
  7. Bestimmung des Trends in noch längeren Zeitrahmen, um nicht durch kurzfristige Umkehrungen irregeführt zu werden

Durch die Optimierung der Parameter, die Kombination mehrerer Indikatoren und die Unterstützung durch praktikable Geld- und Risikomanagementpraktiken kann die Leistung dieser Strategie für den realen Handel verbessert werden.

Schlussfolgerung

Insgesamt ist die schnelle QQE-Crossover-Handelsstrategie, die auf dem Trendfilter basiert, eine sehr beträchtliche Wahl. Ihre Stärke liegt darin, umgekehrte Handelschancen schnell zu erfassen und gleichzeitig mehrere gleitende Durchschnitte zu verwenden, um wichtige Trends zu bestimmen und so weit wie möglich gegen sie zu handeln. Mit der Optimierung der Indikatorparameter und Filterkriterien, gepaart mit einem strengen Geldmanagement, kann diese Strategie relativ stabile Anlagerenditen generieren.

Natürlich können die Risiken nicht ignoriert werden. Echtgeld-Tests und kontinuierliche Optimierungsanpassungen sind notwendig, um die Praktikabilität und Zuverlässigkeit der Strategie zu gewährleisten. Abschließend ist es für Anleger lohnend, langfristige Praktiken zu studieren und zu verfolgen. Es wird angenommen, dass mit dem Fortschritt der algorithmischen Handelstechnologien diese Art von Strategien, die auf schnellen Indikatoren und Trendfilterung basieren, weitere Verbesserungen und Verbreitung erleben werden.


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//
// Title:   [STRATEGY][UL]QQE Cross v1.1
// Author:  JustUncleL
// Date:    22-Oct-2016
// Version: v1.1
//
// Description:
//  A trend following trading Strategy that uses fast QQE crosses with Moving Averages
//  for trend direction filtering. QQE or Qualitative Quantitative Estimation is based 
//  on the relative strength index, but uses a smoothing technique as an additional 
//  transformation. Three crosses can be selected (all selected by default): 
//    - RSI signal crossing ZERO (XZERO)
//    - RSI signal crossing Fast RSIatr line (XQQE)
//    - RSI signal exiting the RSI Threshhold Channel (BUY/SELL)
//  The (BUY/SELL) alerts can be optionally filtered by the Moving averages:
//    - For BUY alert the Close must be above the fast MA and 
//        fast MA (EMA8) > medium MA (EMA20) > slow MA (SMA50).
//    - For SELL alert the Close must be below the fast MA and
//        fast MA (EMA8) < medium MA (EMA20) < slow MA (SMA50).
//  and/or directional filter:
//    - For BUY alert the Close must be above the slow MA (SMA50) and the
//      directional MA (EMA20) must be green.
//    - For SELL alert the Close must be below the slow MA (SMA50) and the
//      directional MA (EMA20) must be red.
//. The XZERO and XQQE are not included in the filtering, they are used to indicate
//  pending BUY/SELL alerts, particularly the XZERO. 
//
//  This Strategy should work on any currency pair and most chart timeframes.
//  *** USE AT YOUR OWN RISK ***
//  
// 
//
// Mofidifications:
//  1.1 - Added Target Profit option, cleaned up the risk management code.
//        Changed Trade Close to EMA20 direction change instead of opposite BUY/SELL
//        signal, which will be earlier, this means stop loss setting should not be
//        required when an AutoTrader is available.
//        Modified code to prevent potential repaint issues.
//  1.0 - original
//
// References:
//  Some Code borrowed from:
//  - "Scalp Jockey - MTF MA Cross Visual Strategizer by JayRogers"
//  - "QQE MT4 by glaz"
//  - "Strategy Code Example by JayRogers"  
//  Inspiration from:
//  - http://www.forexstrategiesresources.com/binary-options-strategies-ii/189-aurora-binary-trading/
//  - http://www.forexstrategiesresources.com/metatrader-4-trading-systems-v/652-qqe-smoothed-trading/
//  - http://dewinforex.com/forex-indicators/qqe-indicator-not-quite-grail-but-accurately-defines-trend-and-flat.html
//

strategy(title='[STRATEGY][UL]QQE Cross v1.1', pyramiding=0, overlay=true )


// - INPUTS START
// Fast MA - type, source, length
type1   = input(defval="EMA", title="Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len1    = input(defval=8, title="Fast - Length", minval=1)
// Medium Fast MA - type, source, length
type2   = input(defval="EMA", title="Medium Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len2    = input(defval=20, title="Medium Fast - Length", minval=1)
// Slow MA - type, source, length
type3   = input(defval="SMA", title="Slow MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, LSMA, ZEMA ( case sensitive )")
len3    = input(defval=50, title="Slow Length", minval=1)
//
// QQE rsi Length, Smoothing, fast ATR factor, source
RSILen  = input(6,title='RSI Length')
SF      = input(3,title='RSI Smoothing Factor')
QQE     = input(2.618,title='Fast QQE Factor')
threshhold = input(10, title="RSI Threshhold")
//
sQQEx   = input(false,title="Show QQE Signal crosses")
sQQEz   = input(false,title="Show QQE Zero crosses")
//
filter  = input(false,title="Use Moving Average Filter")
dfilter = input(true, title="Use Trend Directional Filter" )
RSIsrc  = input(close,title="Source")
srcclose= RSIsrc

// - INPUTS END

// - FUNCTIONS

// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v10 = ema1+(ema1-ema2)                                              // Zero Lag Exponential
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="ZEMA"?v10 : v1

// - FUNCTIONS END

// - Fast ATR QQE
//
Wilders_Period = RSILen * 2 - 1
//
Rsi = rsi(RSIsrc,RSILen)
RSIndex = ema(Rsi, SF)
AtrRsi = abs(RSIndex[1] - RSIndex)
MaAtrRsi = ema(AtrRsi, Wilders_Period)
DeltaFastAtrRsi = ema(MaAtrRsi,Wilders_Period) * QQE
//
newshortband=  RSIndex + DeltaFastAtrRsi
newlongband= RSIndex - DeltaFastAtrRsi
longband=RSIndex[1] > longband[1] and RSIndex > longband[1] ? max(longband[1],newlongband) : newlongband
shortband=RSIndex[1] < shortband[1] and  RSIndex < shortband[1] ? min(shortband[1],newshortband) : newshortband
trend=cross(RSIndex, shortband[1])? 1 : cross(longband[1], RSIndex) ? -1 : nz(trend[1],1)
FastAtrRsiTL = trend==1 ? longband : shortband


// - SERIES VARIABLES
// MA's
ma_fast    = variant(type1, srcclose, len1)
ma_medium  = variant(type2, srcclose, len2)
ma_slow    = variant(type3, srcclose, len3)
// Get Direction From Medium Moving Average
direction = rising(ma_medium,3) ? 1 : falling(ma_medium,3) ? -1 : 0
//
// Find all the QQE Crosses
QQExshort = sQQEx and crossover(FastAtrRsiTL, RSIndex)
QQExlong  = sQQEx and crossunder(FastAtrRsiTL, RSIndex)
// Zero cross
QQEzlong = sQQEz and crossover(RSIndex,50)
QQEzshort  = sQQEz and crossunder(RSIndex,50)
//  
// Thresh Hold channel Crosses give the BUY/SELL alerts.
QQEclong = RSIndex>(50+threshhold) ? na(QQEclong[1]) ? 1 : QQEclong[1]+1 : 0
QQEcshort = RSIndex<(50-threshhold) ? na(QQEcshort[1]) ? 1 : QQEcshort[1]+1 : 0

//
// Check Filtering.
QQEflong = (not filter or (srcclose>ma_fast and ma_medium>ma_slow and ma_fast>ma_medium)) and 
  (not dfilter or (direction>0 and srcclose>ma_slow))
QQEfshort = (not filter or (srcclose<ma_fast and ma_medium<ma_slow and ma_fast<ma_medium)) and
  (not dfilter or (direction<0 and srcclose<ma_slow))
//
// Get final BUY / SELL alert determination
buy = QQEclong>0 and QQEflong ? na(buy[1]) ? 1 : buy[1]+1 : 0
sell= QQEcshort>0 and QQEfshort ? na(sell[1]) ? 1 : sell[1]+1 : 0

// - SERIES VARIABLES END

// - PLOTTING
// Ma's
plot(ma_fast, title="MA Fast", color=olive, linewidth=2, transp=20)
plot(ma_medium, title="MA Medium Fast", color=direction<0?red:green, linewidth=3, transp=0)
plot(ma_slow, title="MA Slow", color=blue, linewidth=2, transp=20)
// QQE crosses
plotshape(QQExlong and buy!=1, title="QQE Cross Over", style=shape.triangleup, location=location.belowbar, text="XQQE", color=blue, transp=20, size=size.tiny)
plotshape(QQExshort and sell!=1, title="QQE Cross Under", style=shape.triangledown, location=location.abovebar, text="XQQE", color=black, transp=20, size=size.tiny)
// Signal crosses zero line
plotshape(QQEzlong and buy!=1 and not QQExlong, title="QQE Zero Cross Over", style=shape.triangleup, location=location.belowbar, text="XZERO", color=aqua, transp=20, size=size.tiny)
plotshape(QQEzshort and sell!=1 and not QQExshort, title="QQE Zero Cross Under", style=shape.triangledown, location=location.abovebar, text="XZERO", color=fuchsia, transp=20, size=size.tiny)

// - PLOTTING END

// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
shunt = 0
c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry(id = "Buy", long = true, when = buy[shunt]==1 )// use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = direction[shunt]!=direction[shunt+1])// ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry(id = "Sell", long = false, when = sell[shunt]==1)
strategy.close(id = "Sell", when = direction[shunt]!=direction[shunt+1])

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

//eof

Mehr