Mean Reversion ATR Trendstrategie


Erstellungsdatum: 2023-09-21 11:42:06 zuletzt geändert: 2023-09-21 11:42:06
Kopie: 1 Klicks: 704
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie nutzt die hohen und niedrigen Preisschwankungen, um zu beurteilen, wann ein oder aus einer Position zu gehen ist. Das Ziel ist es, mehrere Positionen zu erstellen, wenn die Preisschwankungen hoch sind, und die Position zu beenden, wenn die Preisentwicklung sich in eine günstige Richtung dreht.

Strategieprinzip

  1. Der ATR-Indikator wird verwendet, um die Preisschwankungen zu messen. Der ATR-Wert wird für die letzten 20 Perioden berechnet und dessen Moving Average und Standard Differenz berechnet. Wenn der aktuelle ATR-Wert über dem Durchschnitt liegt, wird eine Standarddifferenz hinzugefügt.

  2. Der Kursverlauf wird anhand der Kursveränderungsrate der ersten Stufe ermittelt. Die Kursveränderungsrate der letzten 20 Perioden wird berechnet, der Moving Average wird berechnet. Wenn die aktuelle Kursveränderungsrate 3 Tage in Folge größer als der Durchschnitt ist und positiv ist, wird der Preis als aufwärtstrend angesehen.

  3. Wenn die Preisschwankungen hoch sind und die Preise aufwärts treten, wird eine Überposition eröffnet. Wenn die Preise zurückgehen und der Stop-Loss-Preis ausgelöst wird, wird die Position platziert. Die Stop-Loss-Preise werden dynamisch angepasst und bleiben immer zwischen dem Minimum und dem 2-fachen des ATR.

Analyse der Stärken

  1. Vermeiden Sie häufige Geschäfte in den unsicheren Märkten, indem Sie die hohen und niedrigen Preisschwankungen und Trendschätzungen nutzen.

  2. Der Stop-Loss-Preis wird dynamisch angepasst, um zu vermeiden, dass ein zu lockerer Stop-Loss zu großen Verlusten führt.

  3. Die Rückmeldung zeigt, dass die Strategie zwischen 2015 und 2021 eine jährliche Rendite von 159% erzielte, was weit über der von 120% der Buy and Hold-Strategie liegt.

Risikoanalyse

  1. Eine zu radikale Einstellung der ATR-Parameter kann zu geringen Zugriffschancen führen. Die Parameter können entsprechend erweitert werden, um die Zugriffsfrequenz zu erhöhen.

  2. Trendschätzungsindikatoren können Fehleinschätzungen verursachen, die nicht mit den tatsächlichen Trends übereinstimmen, und es sollten Bestätigungsfaktoren hinzugefügt werden, um potenzielle Verluste zu vermeiden.

  3. Die Rücklaufzeit beträgt nur 6 Jahre. Die Probenräume müssen erweitert und Stabilitätstests durchgeführt werden, um eine Überpassung zu vermeiden.

  4. Es ist nicht möglich, die Leistung in extremen Situationen zu beurteilen, wie z. B. schnelle Monopoly-Situationen, die eine manuelle Intervention oder eine programmierte Stilllegung erfordern.

Optimierungsrichtung

  1. Hinzu kommen Trendbestätigungsindikatoren wie MACD, KDJ und andere, um die Richtung des Trends genauer zu bestimmen.

  2. Die ATR-Parameter können je nach Sorte und Marktlage angepasst werden, um die Volatilität zu optimieren.

  3. Erhöhung der Positionen bei einem Durchbruch durch die Einführung eines Moduls zur Bewertung von Durchbrüchen, der Konfiguration von Trendbeschleunigungsfaktoren und der Erhöhung der Positionen bei einem Durchbruch.

  4. Verschiedene Methoden zur Verlustbewältigung, wie zum Beispiel Prozentsatzverlust, Schwankungsverlust usw., werden getestet.

  5. Die Anzahl der Transaktionen, die Stabilität der Gewinnkurve, die maximale Rücknahme usw. werden bewertet, um sicherzustellen, dass die Strategie solide ist.

Zusammenfassen

Die Strategie integriert die Vorteile der Preisvolatilität und Trendbeurteilung, zeitliche Eintritt, wenn die Preise in den Fall der Verschärfung der Volatilität zu beurteilen, Setzen von dynamischen Stop-Losses, um das Risiko zu kontrollieren, aus der Rückmessung gute Überschuss erzielt. Aber die Stichprobenzeit von nur 6 Jahren, die Einstellung der Schlüsselparameter müssen für verschiedene Märkte angepasst werden, und müssen mehr Bestätigungsfaktoren eingeführt werden, um die Wahrscheinlichkeit von Fehlentscheidungen zu reduzieren.

Strategiequellcode
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 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/
// © DojiEmoji (kevinhhl)

//@version=4
strategy("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_X2_TSL 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
    TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }

// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)

_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0

entry_signal_all = signal_diverted_ATR and signal_uptrend
// }

alert_per_bar(msg)=>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + tostring(close) + "; atr=" + tostring(_ATR_volat) + ")"
    alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)

// MAIN {
if within_timeframe

    if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
        alert_per_bar("TSL raised to " + tostring(stop_loss_price))

    // EXIT:
	if strategy.position_size > 0 and TSL_source <= stop_loss_price
	    exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
        strategy.close(ENUM_LONG, comment=exit_msg)
    // ENTRY:
    else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
		entry_msg = strategy.position_size > 0 ? "adding" : "initial"
		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

if strategy.position_size == 0
    stop_loss_price := float(0)
// }