Die Handelsstrategie des gleitenden Durchschnitts von Gauss

Schriftsteller:ChaoZhang, Datum: 2024-01-03 16:06:45
Tags:

img

Übersicht

Diese Strategie wendet die Idee der Gauss-Verteilung an und berechnet den Z-Score auf der Grundlage des 10-Perioden-exponentiellen gleitenden Durchschnitts der Heikin-Ashi-Candlestick-Schlusskurs. Die Schwellenwerte werden dann auf der Grundlage des 20-Perioden-exponentiellen gleitenden Durchschnitts des Z-Score für Ein- und Ausstiegssignale festgelegt, wenn die Kurve sie überschreitet.

Strategie Logik

  1. Berechnen Sie den 10-Perioden exponentiellen gleitenden Durchschnitt der Heikin-Ashi-Candlestick-Schlusskurs.

  2. Auf der Grundlage der oben genannten gleitenden Durchschnittsdaten berechnen Sie den Z-Score über ein 25-Perioden-Lookback-Fenster. Der Z-Score spiegelt wider, wie viele Standardabweichungen ein Datenpunkt vom Mittelwert hat, was beurteilen kann, ob die Daten normal oder abnormal sind.

  3. Nehmen Sie den 20-Perioden-Exponential Moving Average auf dem Z-Score, um eine Kurve namens emaScore zu erhalten. Diese Kurve spiegelt den langfristigen Trend des Z-Score wider.

  4. Auf der Grundlage der Verteilung der emaScore-Daten werden obere und untere Schwellenwerte festgelegt, wobei aufgrund einiger Schwankungen der Kurve die Schwellenwerte von 90% und 10% gewählt werden.

  5. Lange, wenn emaScore die mittlere Linie oder die untere Schwelle nach oben überschreitet. Kurze, wenn emaScore die obere Schwelle, die untere Schwelle oder den 100-Perioden-Höchstwert nach unten überschreitet.

Analyse der Vorteile

  1. Verwenden Sie die Gaussian-Verteilungsidee durch den Z-Score, um die Normalität zu beurteilen und falsche Ausbrüche zu filtern.

  2. Der doppelte exponentielle gleitende Durchschnitt hat eine Filterwirkung, um den langfristigen Trend zu bestimmen.

  3. Eine angemessene Schwelle senkt die Wahrscheinlichkeit eines falschen Handels.

  4. Die Einbeziehung von Höchst-/Tiefpunkten für 100 Perioden hilft, Umkehrmöglichkeiten zu erfassen.

Risikoanalyse

  1. Die Kombination von Z-Score und MAs ist empfindlich auf Parameter-Tuning.

  2. Die richtigen Schwellenwerte hängen unmittelbar mit der Gültigkeit der Strategie zusammen.

  3. 100 Perioden Höchst-/Tiefpunkte können leicht falsche Signale erzeugen.

  4. Heikin-Ashi selbst ist etwas zurückgeblieben.

Optimierungsrichtlinien

  1. Testen Sie verschiedene gleitende Durchschnittsperioden, Z-Score-Rückblickfenster.

  2. Verwenden Sie die Analyse, um die Parameter automatisch zu optimieren.

  3. Versuchen Sie verschiedene Methoden zur Festlegung von Schwellenwerten, z. B. STD-Multiplikatoren.

  4. Verbessern Sie die Logik der höchsten/niedrigsten Punkte, um falsche Signale zu verhindern.

  5. Testen Sie andere Kerzenarten oder typische Preise, um Heikin-Ashi zu ersetzen.

Zusammenfassung

Diese Strategie beurteilt Preisanomalien und erzeugt Handelssignale auf der Grundlage der Idee der Gauss-Verteilung, doppelter exponentieller gleitender Durchschnitte und dynamischer Schwellenwerte. Die Hauptvorteile sind das Filtern falscher Ausbrüche und das Auffangen von Umkehrungen. Es besteht jedoch eine große Wirkung in Bezug auf Parameterwahl und Kombination. Weitere Tests und Optimierungen sind erforderlich, um die besten Parameter und Kombinationen zu finden.


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



// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm

// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section. 

//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)

// User can set the start date for the strategy
startDate = timestamp("2023 06 01")

// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)

// Function to calculate the Z-Score
z_score(_series, _length) =>
    _mean = ta.sma(_series, _length)
    _stddev = ta.stdev(_series, _length)
    (_series - _mean) / _stddev

// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)

// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)

// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50) 

// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)

// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)

// Plot highest and lowest EMA score lines 
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)

// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)

// Execute trading logic based on conditions and after the start date
if (time >= startDate)
    if longCon
        strategy.entry("Long", strategy.long)
        if shortCon
            strategy.close("Long")
    if addOn
        strategy.entry("LongNR2", strategy.long)
        if shortCon
            strategy.close("LongNR2")
    
    if shortCon
        strategy.entry("Short", strategy.short)
        if longCon
            strategy.close("Short")


Mehr