Erweiterte quantitative Trenderfassungsstrategie kombiniert mit dynamischem Bereichsfilter

EMA MA RF VOL SMA HA
Erstellungsdatum: 2024-12-17 14:31:11 zuletzt geändert: 2024-12-17 14:31:11
Kopie: 4 Klicks: 420
1
konzentrieren Sie sich auf
1617
Anhänger

Erweiterte quantitative Trenderfassungsstrategie kombiniert mit dynamischem Bereichsfilter

Überblick

Die Strategie ist ein fortgeschrittenes quantitatives Handelssystem, das eine Kombination von Moving Averages und Dynamic Range Filter enthält. Es identifiziert Markttrends hauptsächlich durch die Analyse der Beziehung zwischen Preisänderungen und Handelsvolumen, während ein Range-Filter verwendet wird, um falsche Signale zu filtern und die Genauigkeit des Handels zu verbessern. Die Strategie verwendet adaptive Berechnungsmethoden, um die Liquiditätsgrenzen des Marktes zu bestimmen, und kombiniert schnelle und langsame Moving Averages, um die Trendrichtung zu bestätigen.

Strategieprinzip

Die Kernlogik der Strategie basiert auf folgenden Schlüsselberechnungen:

  1. Liquiditätsanalyse: Beurteilung der Marktliquidität durch Berechnung des Verhältnisses von Umsatz zu Preisveränderungen und Festlegung dynamischer Liquiditätsgrenzen.
  2. Trendbestätigung: Die Richtung des Trends wird durch einen Index-Moving Average (EMA) mit 50 und 100 Perioden bestätigt.
  3. Umfangsfilterung: Um einen dynamischen Handelsplatz zu erstellen, wird ein 50er-Zyklus-Sampling und ein Dreifaches des Umfangs multipliziert.
  4. Signalgenerierung: Erzeugt ein Handelssignal, wenn der Preis den Bereichfilter durchbricht und die EMA-Anzeige einen Trend zeigt.

Strategische Vorteile

  1. Anpassungsfähigkeit: Die Strategie kann die Parameter dynamisch an die Marktbedingungen anpassen und sich an unterschiedliche Marktumgebungen anpassen.
  2. Signalsicherheit: Durch die Kombination mehrerer technischer Indikatoren und Filter wird ein falsches Signal wirksam reduziert.
  3. Gute Risikomanagement: Die automatische Berechnung der Stop-Loss-Position ist integriert und ermöglicht eine effektive Risikokontrolle.
  4. Komplett mit Rückmeldung: Detaillierte Rückmeldungseinstellungen zur Optimierung der Strategie enthalten.

Strategisches Risiko

  1. Parameter-Sensitivität: Mehrere Parameter der Strategie erfordern eine genaue Anpassung und sind leicht zu optimieren.
  2. Einfluss von Ausrutschen: In einem stark bewegten Markt kann ein größeres Ausrutschrisiko auftreten.
  3. Marktadaptivität: Häufige Falschsignale können auf Querbörsen erzeugt werden.
  4. Vermögensverwaltung: Die Verteilung von Fixkapital ist möglicherweise nicht für alle Marktbedingungen geeignet.

Richtung der Strategieoptimierung

  1. Anpassungsfähigkeit der Parameter: Ein Anpassungsfähigkeit der Parameter kann eingeführt werden, so dass die Parameter automatisch an die Marktlage angepasst werden können.
  2. Marktsituationserkennung: Hinzufügen eines Moduls zur Marktsituationsbeurteilung, um verschiedene Handelsstrategien unter verschiedenen Marktbedingungen zu verwenden.
  3. Optimierung des Kapitalmanagements: Einführung eines dynamischen Positionsmanagements, um die Größe des Handels an die Volatilität des Marktes anzupassen.
  4. Signalfilterung verbessert: Mehr technische Kennzahlen können hinzugefügt werden, um falsche Signale zu filtern.

Zusammenfassen

Die Strategie baut ein vollständiges quantitatives Handelssystem auf, das durch die Kombination von Liquiditätsanalyse, Trendverfolgung und Spannungsfilter erstellt wird. Ihr Vorteil liegt in der Fähigkeit, sich an Marktveränderungen anzupassen und zuverlässige Handelssignale zu liefern, aber auch auf Parameteroptimierung und Risikomanagement zu achten. Durch kontinuierliche Optimierung und Verbesserung wird die Strategie in der Lage sein, in verschiedenen Marktumgebungen eine stabile Leistung zu erzielen.

Strategiequellcode
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")