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.
Berechnen Sie den 10-Perioden exponentiellen gleitenden Durchschnitt der Heikin-Ashi-Candlestick-Schlusskurs.
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.
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.
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.
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.
Verwenden Sie die Gaussian-Verteilungsidee durch den Z-Score, um die Normalität zu beurteilen und falsche Ausbrüche zu filtern.
Der doppelte exponentielle gleitende Durchschnitt hat eine Filterwirkung, um den langfristigen Trend zu bestimmen.
Eine angemessene Schwelle senkt die Wahrscheinlichkeit eines falschen Handels.
Die Einbeziehung von Höchst-/Tiefpunkten für 100 Perioden hilft, Umkehrmöglichkeiten zu erfassen.
Die Kombination von Z-Score und MAs ist empfindlich auf Parameter-Tuning.
Die richtigen Schwellenwerte hängen unmittelbar mit der Gültigkeit der Strategie zusammen.
100 Perioden Höchst-/Tiefpunkte können leicht falsche Signale erzeugen.
Heikin-Ashi selbst ist etwas zurückgeblieben.
Testen Sie verschiedene gleitende Durchschnittsperioden, Z-Score-Rückblickfenster.
Verwenden Sie die Analyse, um die Parameter automatisch zu optimieren.
Versuchen Sie verschiedene Methoden zur Festlegung von Schwellenwerten, z. B. STD-Multiplikatoren.
Verbessern Sie die Logik der höchsten/niedrigsten Punkte, um falsche Signale zu verhindern.
Testen Sie andere Kerzenarten oder typische Preise, um Heikin-Ashi zu ersetzen.
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")