Triple Exponential Moving Average Profit Taking und Stop Loss Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-04 10:38:42
Tags:

img

Übersicht

Die Triple Exponential Moving Average Profit Taking and Stop Loss Strategy ist eine Trend-folgende Strategie, die auf drei exponentiellen gleitenden Durchschnitten mit verschiedenen Perioden für den Marktein- und -ausgang basiert.

Strategie Logik

Die Strategie verwendet drei exponentielle gleitende Durchschnitte: schnelle Linie, mittlere Linie und langsame Linie. Es geht lang, wenn die mittlere Linie über die langsame Linie kreuzt, und schließt die Position, wenn die schnelle Linie unter die mittlere Linie kreuzt. Dies ist eine typische Trend-Nachfolge-Strategie, die die Trendrichtung durch die Kreuzung der drei gleitenden Durchschnitte bestimmt.

Gleichzeitig nutzt die Strategie den Indikator Average True Range, um Profit-taking und Stop-Loss-Level zu berechnen. Insbesondere ist der Take-Profit für Long-Positionen Eingangspreis + Average True Range * Profit-Faktor und für Short-Positionen Eingangspreis - Average True Range * Profit-Faktor. Die Stop-Loss-Logik ist ähnlich. Dies begrenzt effektiv das Risiko großer Verluste.

Analyse der Vorteile

  1. Entscheidungsindikatoren sind intuitiv und leicht verständlich.
  2. Systematisch und leicht zu automatisieren.
  3. Gleichgewicht zwischen Trendverfolgung und Risikokontrolle.

Risikoanalyse

  1. Es gibt eine gewisse Verzögerung und die Unfähigkeit, die Umkehrungen rechtzeitig zu erfassen.
  2. Anfällig für Verlustrest in unterschiedlichen Märkten.
  3. Das Parameter-Tuning muss optimiert werden, sonst kann es schlechte Ergebnisse geben.

Zu den Maßnahmen zur Risikominderung gehören: Verkürzung der gleitenden Durchschnittsperioden, Optimierung des Gewinn/Stopp-Faktors und Hinzufügung von Hilfsindikatoren.

Optimierungsrichtlinien

  1. Versuche Kombinationen von gleitenden Durchschnitten, um optimale Parameter zu finden.
  2. Hinzu kommen weitere technische Indikatoren wie MACD, RSI usw.
  3. Verwenden Sie maschinelles Lernen, um Parameter automatisch zu optimieren.
  4. Dynamische Anpassung des Gewinn-/Stoppniveaus basierend auf dem tatsächlichen Bereich.
  5. Fügen Sie Gefühle ein, um Überfüllung zu vermeiden.

Schlussfolgerung

Insgesamt ist dies eine effektive Trend-Folge-Strategie mit stabiler Leistung und einfacher Implementierung über einfache Parameter. Die dynamische Gewinnnahme und Stop-Loss basierend auf der Durchschnittlichen Wahren Reichweite begrenzt das Risiko pro Seite. Aber Parameteroptimierung und Indikatorkombinationen müssen sorgfältig durchgeführt werden, um Überanpassung oder Entscheidungsverzögerung zu vermeiden. Im Gleichgewicht hat diese Strategie ein gutes Risiko-Belohnungsprofil und ist es wert, berücksichtigt zu werden.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//© Densz
strategy("3EMA with TP & SL (ATR)", overlay=true )

// INPUTS
startTime           =       input(title="Start Time", type = input.time, defval = timestamp("01 Jan 2017 00:00 +0000"))
endTime             =       input(title="End Time", type = input.time, defval = timestamp("01 Jan 2022 00:00 +0000"))

slowEMALength       =       input(title="Slow EMA Length", type = input.integer, defval = 55)
middleEMALength     =       input(title="Middle EMA Length", type = input.integer, defval = 21)
fastEMALength       =       input(title="Fast EMA Length", type = input.integer, defval = 9)

trendMALength       =       input(title="Trend indicator MA Length", type = input.integer, defval = 200)

atrLength           =       input(title="ATR Length", type = input.integer, defval = 14)
tpATRMult           =       input(title="Take profit ATR multiplier", type = input.integer, defval = 3)
slATRMult           =       input(title="Stop loss ATR multiplier", type = input.integer, defval = 2)

rsiLength           =       input(title="RSI Length", type = input.integer, defval = 14)

// Indicators
slowEMA             =       ema(close, slowEMALength)
middEMA             =       ema(close, middleEMALength)
fastEMA             =       ema(close, fastEMALength)
atr                 =       atr(atrLength)

rsiValue            =       rsi(close, rsiLength)
isRsiOB             =       rsiValue >= 80
isRsiOS             =       rsiValue <= 20

sma200              =       sma(close, trendMALength)

inDateRange         =       true

// Plotting
plot(slowEMA, title="Slow EMA", color=color.red, linewidth=2, transp=50)
plot(middEMA, title="Middle EMA", color=color.orange, linewidth=2, transp=50)
plot(fastEMA, title="Fast EMA", color=color.green, linewidth=2, transp=50)

plot(sma200, title="SMA Trend indicator", color=color.purple, linewidth=3, transp=10)
plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, text="OB")
plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangledown, text="OS")

float takeprofit    =       na
float stoploss      =       na

var line tpline     =       na
var line slline     =       na

if strategy.position_size != 0
    takeprofit := takeprofit[1]
    stoploss := stoploss[1]
    line.set_x2(tpline, bar_index)
    line.set_x2(slline, bar_index)
    line.set_extend(tpline, extend.none)
    line.set_extend(slline, extend.none)
    
// STRATEGY
goLong  = crossover(middEMA, slowEMA) and inDateRange
closeLong = crossunder(fastEMA, middEMA) and inDateRange


if goLong
    takeprofit := close + atr * tpATRMult
    stoploss := close - atr * slATRMult
    // tpline := line.new(bar_index, takeprofit, bar_index, takeprofit, color=color.green, width=2, extend=extend.right, style=line.style_dotted)
    // slline := line.new(bar_index, stoploss, bar_index, stoploss, color=color.red, width=2, extend=extend.right, style=line.style_dotted)
    // label.new(bar_index, takeprofit, "TP", style=label.style_labeldown)
    // label.new(bar_index, stoploss, "SL", style=label.style_labelup)
    strategy.entry("Long", strategy.long, when = goLong)
    strategy.exit("TP/SL", "Long", stop=stoploss, limit=takeprofit)
if closeLong
    takeprofit := na
    stoploss := na
    strategy.close(id = "Long", when = closeLong)

if (not inDateRange)
    strategy.close_all()


Mehr