Diese Strategie basiert auf gleitenden Durchschnitten, kann die Parameter automatisch anpassen und eignet sich für Wellenmärkte in hohen Zeitrahmen.
Diese Strategie verwendet einen adaptiven gleitenden Durchschnitt als Handelssignal. Zuerst berechnet sie den einfachen gleitenden Durchschnitt (CMA) des angegebenen Zeitraums (Start). Dann testet sie die CMA-Parameter um den Zeitraum herum und beurteilt, welche Kombination den geringsten Schlag durch Kerzenkörper und Wickel hat. Schließlich verwendet sie den CMA mit den geringsten Schlägen als Signallinie.
Insbesondere wird die CMA mit Periode plus 1 (CMA_P1) und minus 1 (CMA_M1) getestet, die Anzahl der Berührungen nach Körper und Wick gezählt. Wenn CMA weniger Berührungen hat als CMA_P1 und CMA_M1, dann die aktuelle Periode behalten; wenn CMA_P1 weniger Berührungen hat, dann die Periode um 1 erhöhen; wenn CMA_M1 weniger Berührungen hat, dann die Periode um 1 verringern.
Wenn der Preis durch den CMA nach oben bricht, wird ein Kaufsignal generiert; wenn der Preis durch den CMA nach unten bricht, wird ein Verkaufssignal generiert.
Diese adaptive gleitende Durchschnittsstrategie hat folgende Vorteile:
Es ist nicht notwendig, die gleitende Durchschnittsperiode manuell auszuwählen, die Strategie wird verschiedene Perioden testen und das Optimum finden.
Verringern Sie falsche Signale: Im Vergleich zu einem festen Zeitraum kann der adaptive MA mehr Lärm filtern und viele falsche Signale reduzieren.
Wenn der Markt von Range-bound zu Trending wechselt, wird die MA-Periode automatisch erhöht, um Signale zu generieren; wenn der Markt von Trend zu Range-bound wechselt, wird die MA-Periode automatisch abnehmen.
Diese adaptive Methode kann das gesamte Handelssystem ohne manuelle Parameteroptimierung vereinfachen.
Das Konzept kann auf andere Indikatoren wie adaptive Bollinger Bands, adaptive KD usw. angewendet werden.
Für diese Strategie sind auch einige Risiken zu beachten:
Wenn der Markt ein Call-Option-Muster hat, kann es sein, dass der Kerzenkörper die MA-Linie nicht durchbricht, was zu falschen Signalen führt.
Ausfallrisiko. MA-Ausbruch kann nicht immer fortgesetzt werden, einige ausfallende Ausbrüche können auftreten. Ausbruchvalidierung ist erforderlich, um eine hohe Erfolgsrate zu gewährleisten.
Trendumkehrrisiko. Trendumkehr nach Eintritt in den Trend muss rechtzeitig umgestellt werden, sonst kann dies zu Verlusten führen. Stop-Loss sollte so eingestellt werden, dass der Verlust kontrolliert wird.
Das Risiko der Optimierung von Parametern. Adaptive angepasste Parameter können in die lokale Optimierung fallen, was zu überflüssigen MAs führt. Modellbewertungsmethoden müssen eingeführt werden, um dieses Problem zu vermeiden.
Überanpassung Risiko. Übermäßige Parameter-Tuning kann zu Überanpassung führen und die Modellverallgemeinerungsfähigkeit verlieren. Verlängerte Verifizierung in verschiedenen Marktumgebungen ist erforderlich, nicht nur auf Backtest-Ergebnisse angewiesen.
Einige Richtungen zur Verbesserung dieser adaptiven MA-Strategie:
Hinzufügen von Trend-Breakout-Validierung über aufeinanderfolgende Breakouts, um falsche Breakouts zu filtern.
Steigern Sie die Stop-Loss-Strategie, stoppen Sie den Stop-Loss, wenn sich der Preis wieder auf die andere Seite des MA bewegt.
Fügen Sie einen Optionsfilter hinzu, um falsche Signale zu vermeiden, wenn die Anrufoption angezeigt wird.
Einführung von Evaluierungsmetriken wie IC, LIC, SIC usw., um Parameter-Tuning zu begrenzen und Überanpassung zu verhindern.
Erweitern Sie Ihre Angabe auf andere Indikatoren wie Adaptive Golden Cross Strategie, Adaptive Bollinger Bands usw.
Optimieren Sie die MA-Berechnung, indem Sie gewichtete MA, exponentielle MA usw. verwenden, um eine glattere MA zu erhalten.
Diese Strategie erzeugt Handelssignale, indem sie die MA-Periode anpassungsfähig anpasst, um optimale Parameter zu finden. Im Vergleich zu festen Parametern kann sie viele falsche Signale reduzieren und sich an Marktveränderungen anpassen. Aber wir müssen auch auf potenzielle Risiken achten und Überprüfung und Vorwärtsoptimierung durchführen, bevor wir sie im Live-Handel für stetige Gewinne anwenden.
[/trans]
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-16 00:00:00 period: 1d basePeriod: 1h 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/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)