Die Ressourcen sind geladen. Beförderung...

Erweiterte Strategie zur Erfassung quantitativer Trends mit Dynamic Range Filter

Schriftsteller:ChaoZhang, Datum: 2024-12-17 14:31:11
Tags:EMA- Nein.RFVOLSMAHA

img

Übersicht

Diese Strategie ist ein fortschrittliches quantitatives Handelssystem, das gleitende Durchschnitte mit einem dynamischen Bereichsfilter kombiniert. Es identifiziert Markttrends, indem es die Beziehung zwischen Preisbewegungen und Handelsvolumen analysiert, während ein Bereichsfilter verwendet wird, um falsche Signale zu eliminieren und die Genauigkeit des Handels zu verbessern. Die Strategie verwendet adaptive Berechnungsmethoden, um die Marktliquiditätsgrenzen zu bestimmen, und kombiniert schnelle und langsame gleitende Durchschnitte, um die Trendrichtung zu bestätigen.

Strategieprinzipien

Die Kernlogik der Strategie beruht auf folgenden Schlüsselberechnungen:

  1. Liquiditätsanalyse: Bewertet die Liquidität des Marktes durch Berechnung des Verhältnisses zwischen Volumen und Preisbewegung und legt dynamische Liquiditätsgrenzen fest.
  2. Trendbestätigung: Verwendet 50- und 100-Perioden-Exponential Moving Averages (EMA), um die Trendrichtung zu bestätigen.
  3. Range Filtering: Verwendet eine 50-Perioden-Stichprobenperiode und einen 3-fachen Range-Multiplikator, um dynamische Handelsbereiche zu konstruieren.
  4. Signalgeneration: Erzeugt Handelssignale, wenn der Preis den Bereichsfilter durchbricht und die EMA-Indikatoren konsistente Trends zeigen.

Strategische Vorteile

  1. Starke Anpassungsfähigkeit: Die Strategie kann die Parameter dynamisch anhand der Marktbedingungen anpassen und sich an verschiedene Marktumgebungen anpassen.
  2. Zuverlässige Signale: Verringert durch die Kombination mehrerer technischer Indikatoren und Filter die Anzahl der falschen Signale.
  3. Umfassendes Risikomanagement: Integriert die automatische Berechnung von Stop-Loss-Positionen für eine effektive Risikokontrolle.
  4. Vollständige Backtesting-Funktionalität: beinhaltet detaillierte Einstellungen für die Optimierung der Strategie.

Strategische Risiken

  1. Parameterempfindlichkeit: Mehrere Parameter erfordern eine Feinabstimmung und sind anfällig für eine Überoptimierung.
  2. Schwankungswirkung: Es besteht ein erhebliches Schwankungsrisiko auf stark volatilen Märkten.
  3. Marktanpassungsfähigkeit: Kann häufige falsche Signale in unterschiedlichen Märkten erzeugen.
  4. Kapitalverwaltung: Die Festkapitalzuweisungsmethode kann nicht allen Marktbedingungen entsprechen.

Strategieoptimierungsrichtlinien

  1. Anpassung der Parameter: Einführung von anpassungsfähigen Mechanismen zur automatischen Anpassung der Parameter an die Marktbedingungen.
  2. Marktzustandserkennung: Hinzufügen von Marktzustandserkennungsmodulen zur Anwendung verschiedener Handelsstrategien unter unterschiedlichen Marktbedingungen.
  3. Optimierung des Kapitalmanagements: Implementierung einer dynamischen Positionsgröße auf der Grundlage der Marktvolatilität.
  4. Erweiterung des Signalfilters: Hinzufügen von technischen Indikatoren, um falsche Signale zu filtern.

Zusammenfassung

Die Strategie baut ein vollständiges quantitatives Handelssystem auf, indem sie Liquiditätsanalyse, Trendverfolgung und Bereichsfilterung kombiniert. Ihre Stärken liegen in ihrer Fähigkeit, sich an Marktveränderungen anzupassen und zuverlässige Handelssignale bereitzustellen, während sie Aufmerksamkeit für Parameteroptimierung und Risikomanagement erfordert. Durch kontinuierliche Optimierung und Verbesserung verspricht die Strategie eine stabile Performance in verschiedenen Marktumgebungen.


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

Verwandt

Mehr