Strategie zur Kombination von quantitativen Schwingungsindikatoren

Schriftsteller:ChaoZhang, Datum: 2024-02-27 16.46:42
Tags:

img

Übersicht

Diese Strategie kombiniert Ehlers Elegant Oscillator, Ehlers Decycler, Ehlers Instantaneous Trendline und Ehlers Spearman Rank Correlation Coefficient zu einer Strategie und bildet eine quantitative Handelsstrategie, die Trends, Schwingungen, Impulse und Preis- und Volumenmerkmale vollständig erfasst.

Strategieprinzipien

Diese Strategie verwendet vier Schlüsselindikatoren für die Beurteilung.

Erstens der Ehlers Elegant Oscillator, bei dem die Differenz zwischen der ursprünglichen Linie und der Signallinie, die durch einen exponentiellen gleitenden Durchschnitt glättet wird, die aktuelle Trendrichtung und -stärke bestimmen kann. Zweitens der Ehlers Decycler, der die Tiefpunkte des Zyklus effektiv identifizieren und bestimmen kann, ob sich der Haupttrend umkehrt. Als nächstes verfolgt die Ehlers Instantaneous Trendline schnelle gleitende Durchschnittswerte, um kurzfristige Trendrichtungen zu beurteilen. Schließlich beurteilt der Ehlers Spearman Rank Correlation Coefficient die Preis-Volumen-Beziehung, die falsche Ausbrüche effektiv filtern kann.

Insbesondere sind die vier Einstiegsbedingungen für die Strategie: die Elegant Oscillator Signallinie und die Decycler Signallinie brechen gleichzeitig über 0; die ursprüngliche Linie bricht über die Decycler-Linie; die ursprüngliche Linie ist höher als die steigende Instantaneous Trendline; und ein positiver Spearman Rank-Korrelationskoeffizient.

Die Ausstiegsbedingungen sind viel einfacher: Ausstieg, wenn die ursprüngliche Linie unter die Instantaneous Trendline fällt.

Die kurzen Bedingungen sind ähnlich wie die langen Bedingungen, nur umgekehrt.

Analyse der Vorteile

Der größte Vorteil dieser Strategie liegt in der geeigneten Kombination von Indikatoren, die die Stärken jedes Indikators effektiv nutzen, sich gegenseitig überprüfen, falsche Positive vermeiden, viel Lärm filtern und zuverlässigere Signale erzeugen können.

Insbesondere kann der Elegante Oszillator Trendrichtung und Stärke beurteilen, der Decycler kann Zykluswendepunkte beurteilen, die Instantaneous Trendline kann kurzfristige Trends beurteilen und der Spearman Rank beurteilt das Preis-Volumen-Verhältnis.

Darüber hinaus verhindert die Strategie, dass nur mittelfristige Preise als Referenz dienen, Störungen durch kurzfristige Marktlärm und reduziert unnötige Umkehrgeschäfte.

Risikoanalyse

Das größte Risiko dieser Strategie ist der Mangel an einem Stop-Loss-Mechanismus. Im Falle von gewaltsamen Marktbewegungen kann die Unfähigkeit, den Verlust rechtzeitig zu stoppen, zu größeren Verlusten führen. Es fehlt auch zusätzliche Filter wie Donchian-Kanäle und Energieindikatoren, die zu einem gewissen Grad zu falschen positiven Trades führen können.

Um diese Risiken zu mindern, kann ein Schutz-Stop-Loss eingestellt werden, um automatisch den Verlust zu stoppen, wenn Verluste bestimmte Werte übersteigen.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Es wird ein Stop-Loss-Mechanismus für das Risikomanagement hinzugefügt.

  2. Fügen Sie mehr Filter hinzu, Indikatoren wie MACD, Bollinger Bands für mehr Filterung, um falsche Signale weiter zu reduzieren.

  3. Mehr Zeitrahmen hinzufügen. Derzeit wird nur ein Satz von Parametern verwendet. Mehr Zeitrahmen können für mehrere Zeitrahmen-Verifizierung hinzugefügt werden, um die Stabilität zu verbessern.

  4. Dynamische Anpassung von Parametern. Hinzufügen von Parameteroptimierung, um Indikatorparameter dynamisch anhand veränderter Marktbedingungen anzupassen, um die Anpassungsfähigkeit zu verbessern.

  5. Cross-Asset-Arbitrage: Strategie auf verschiedene Vermögenswerte anwenden, um nach Arbitragemöglichkeiten zu suchen, um Risiken besser zu kontrollieren.

Schlussfolgerung

Diese Strategie kombiniert klug 4 wichtige Ehlers-Indikatoren, um eine Strategie zu bilden, die Trends, Zyklen, Dynamik und Preisvolumen in allen Aspekten beurteilt. Sie hat hervorragende Geräuschfilterfähigkeiten und kann hochwertige Signale erzeugen.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai

//@version=5
strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100)

// -- Inputs --
inp = input(title='Source', defval=close)
res = input.timeframe(title='Resolution', defval='')
bar = input(title='Allow Bar Color Change?', defval=true)
src = inp
length = input.int(title='Length', defval=20, minval=2, maxval=300)
rmsLength = input.int(title='Rms Length', defval=50, minval=2)
decyclerLength = length

// -- Calculation --
// Ehlers Elegant Oscillator
a1 = math.exp(-1.414 * math.pi / length)
b1 = 2 * a1 * math.cos(1.414 * math.pi / length)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3

deriv = src - nz(src[2])
rms = math.avg(math.pow(deriv, 2), rmsLength)
rms := rms != 0 ? math.sqrt(rms) : 0
nDeriv = rms != 0 ? deriv / rms : 0
iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0

ss = 0.0
ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2]))
ssSig = ta.wma(ss, length)

slo = ss - ssSig
sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0
eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black

hline(0)
plot(ssSig, title='EO', color=eoColor, linewidth=2)

// Ehlers Decycler
pi = 2 * math.asin(1)
twoPiPrd = 2 * pi / decyclerLength
alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd)

dec = 0.0
dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1]))

decyclerSig = src > dec ? 1 : src < dec ? -1 : 0
decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black
plot(dec, title='Decycler', color=decColor, linewidth=2)

// Ehlers Instantaneous Trendline
getItrend(src, alpha) =>
    Price = src
    Smooth = 0.0
    ITrend = 0.0
    Trigger = 0.0
    
    ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha  * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2])
    if(bar_index < 7)
        ITrend := (Price + 2 * Price[1] + Price[2]) / 4
    Trigger := 2 * ITrend - ITrend[2]
    [ITrend, Trigger]

itrendAlpha = 2 / (length + 1) / 2
[iT, Tr] = getItrend(src, itrendAlpha)

iTColor = Tr > iT ? color.aqua : color.maroon
plot(iT, 'Instantaneous Trend', iTColor, 2)

// Ehlers Spearman Rank
priceArray = array.new_float(300, 0.0)
rank = array.new_float(300, 0.0)
for i = 1 to length
    array.set(priceArray, i, nz(src[i - 1]))
    array.set(rank, i, i)

for i = 1 to length
    count = length + 1 - i
    for j = 1 to length - count
        if array.get(priceArray, j + 1) < array.get(priceArray, j)
            tempPrice = array.get(priceArray, j)
            tempRank = array.get(rank, j)
            array.set(priceArray, j, array.get(priceArray, j + 1))
            array.set(rank, j, array.get(rank, j + 1))
            array.set(priceArray, j + 1, tempPrice)
            array.set(rank, j + 1, tempRank)
         
sum = 0.0   
for i = 1 to length
    sum := sum + math.pow(i - array.get(rank, i), 2)
signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1)))))
spearmanSlo = signal - nz(signal[1])
spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0

// -- Signals --
bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0
bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0
bool exitLong = ta.crossunder(src[100], iT) 
bool exitShort = ta.crossover(src[100], iT)

barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray)

// -- Long Exits --
strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG')

// -- Short Exits --
strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT')

bool isStrategyEntryEnabled = true
// -- Long Entries --
if (isStrategyEntryEnabled)
    strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG')
else
    strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG')

// -- Short Entries --
if (isStrategyEntryEnabled)
    strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT')
else
    strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')



Mehr