Kombinationsstrategie basierend auf quantitativen Oszillatorindikatoren


Erstellungsdatum: 2024-02-27 16:46:42 zuletzt geändert: 2024-02-27 16:46:42
Kopie: 3 Klicks: 653
1
konzentrieren Sie sich auf
1617
Anhänger

Kombinationsstrategie basierend auf quantitativen Oszillatorindikatoren

Überblick

Diese Strategie kombiniert die Elastic Vibration-Index-Strategie von Enel, die Elastic Cycle-Index-Strategie, die Elastic Momentum-Trendlinie-Strategie von Enel und die Elastic Spellman-Klasse-Relativkoeffizienten-Strategie von Enel zu einer vollständigen quantitativen Handelsstrategie, die Trends, Vibrationen, Dynamik und Preismerkmale erfasst. Die Strategie wird als “Quantitative Vibration-Index-Strategie” bezeichnet.

Strategieprinzip

Diese Strategie basiert auf vier Kriterien:

Erstens, der Ernst & Young Elegant Vibration Index, der eine Signallinie erhält, nachdem er durch den Index-Durchschnitt geglättet wurde, um die Richtung und Stärke des aktuellen Trends zu bestimmen. Zweitens, der Ernst & Young Cyclical Index, der effektiv die niedrigsten Punkte der Zykluszyklen identifiziert und beurteilt, ob sich der Haupttrend umgedreht hat. Wiederum verfolgt der Ernst & Young Momentum Trendline einen schnell beweglichen Durchschnitt, um die Richtung des kurzfristigen Trends zu bestimmen.

Die vier Einstiegsvoraussetzungen für die Strategie sind: Die Schwingungs- und die Kreislaufsignal-Linie bewegen sich gleichzeitig nach oben; Die ursprüngliche Linie durchbricht die Kreislauflinie nach oben; Die ursprüngliche Linie liegt über der aufsteigenden kurzzeitigen Trendlinie; Die Koeffizienten für die Spielman-Klasse sind positiv.

Die Ausstiegsbedingungen sind viel einfacher, nur wenn die ursprüngliche Linie unter der momentanen Trendlinie platziert wird.

Die Bedingungen für das Fehlen sind ähnlich wie die Bedingungen für die Mehrzahl, nur dass die Beurteilung der Bedingungen umgekehrt ist.

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, dass die richtige Kombination von Indikatoren die Vorteile der einzelnen Indikatoren wirksam nutzen kann, gegenseitig verifiziert und falsche Positiven vermieden werden, wodurch eine große Menge von Geräuschen herausgefiltert wird und das Signal zuverlässiger wird.

Konkret kann der Elegante Schwingungsindikator die Richtung und Stärke des Trends bestimmen, der Kreislaufindikator kann den Kreislaufwendepunkt bestimmen, die momentane Trendlinie kann den kurzfristigen Trend bestimmen, die relevanten Faktoren der Spielman-Klasse bestimmen die Quantitätsbeziehung. Die Kombination der vier kann die Merkmale des Marktes in Bezug auf Trend, Kreislauf, Dynamik und Quantität bestimmen, was zu einem zuverlässigen Handelssignal führt.

Darüber hinaus vermeidet die Strategie die Störung durch kurzfristigen Marktlärm und reduziert unnötige Umkehrungen. Die Strategie ist auch sehr selten und die Ausstiegsregeln sind einfach, was die Handelsfrequenz erheblich reduziert und das Problem des Überhandels verhindert.

Risikoanalyse

Das größte Risiko dieser Strategie besteht darin, dass es keine Stop-Loss-Mechanismen gibt. Wenn der Markt stark wechselt, kann der Stop-Loss nicht rechtzeitig erfolgen, was zu einer Vergrößerung der Verluste führen kann. Darüber hinaus kann der Mangel an zusätzlichen Filtern wie Marginal-System-Filterung und Energieindikatoren zu einem gewissen Grad an falsch positiven Transaktionen führen.

Um diese Risiken zu verringern, können Sie einen Schutzstop einrichten, der automatisch verkauft wird, wenn der Verlust einen bestimmten Prozentsatz überschreitet. Darüber hinaus können Sie auch Dynamikindikatoren wie den MACD für eine Zweitprüfung verwenden, um das Risiko eines falschen Durchbruchs zu vermeiden.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Einschließung eines Sicherheitsausfallmechanismus. Berechnen Sie die maximale Rücknahme anhand der historischen Rücklaufdaten und setzen Sie den entsprechenden Ausfallpunkt ein.

  2. Mehrfach-Filterung von Indikatoren wie MACD, Brin-Band und anderen, um Falschsignale weiter zu reduzieren.

  3. In Verbindung mit mehr Zeitzyklen. Es gibt nur eine Gruppe von Parametern, die zur Zeit verwendet werden, um mehr Zeitzyklusparameter einzuführen und die Stabilität zu verbessern.

  4. Dynamische Anpassung der Parameter. Hinzu kommt ein Parameter-Optimierungsmodul, das die Parameter der Indikatoren dynamisch an die verschiedenen Marktbedingungen anpasst, um die Strategie anpassungsfähiger zu machen.

  5. Arbitrage mit mehreren Sorten. Die Strategie wird auf verschiedene Sorten angewendet, um Arbitragechancen zu finden und Risiken weiter zu kontrollieren.

Zusammenfassen

Diese Strategie bildet durch die geschickte Kombination der vier großen Enlerss-Indikatoren eine Handelsstrategie, die die gesamte Bandbreite von Trends, Zyklen, Dynamik und Quantifizierung beurteilt. Ihre Fähigkeit, Geräusche zu filtern, ist hervorragend und kann ein hochwertiges Signal erzeugen. Das Fehlen von Stop-Loss- und Hilfsindikatorfiltern macht sie jedoch zu einem gewissen Risiko. Durch die Hinzufügung von Stop-Loss-Filtern, mehr Zeitzyklen usw. kann die Strategie effektiv optimiert werden, um sie stabiler und zuverlässiger zu machen.

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