Drei exponentielle gleitende Durchschnitte und die Stochastische Relative Strength Index-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-30 16:52:48
Tags:

img

Übersicht

Dies ist eine Trendfolgestrategie, die den dreifachen exponentiellen gleitenden Durchschnitt (EMA) und den Stochastic Relative Strength Index (Stoch RSI) kombiniert, um Handelssignale zu generieren. Es geht lang, wenn die schnelle EMA über die mittlere EMA und die mittlere EMA über die langsame EMA geht. Es geht kurz, wenn das Gegenteil geschieht. Die Strategie verwendet auch den Stoch RSI als Hilfsindikator.

Grundsätze

  1. Verwenden Sie 8, 14, 50-Tage-EMA. Gehen Sie lang, wenn 8-Tage-EMA > 14-Tage-EMA > 50-Tage-EMA. Gehen Sie kurz, wenn es umgekehrt ist.

  2. Verwenden Sie den Stochastischen RSI als Hilfsindikator. Berechnen Sie zuerst den 14-Tage-RSI, berechnen Sie dann den Stochastischen RSI, berechnen Sie schließlich den 3-Tage-SMA als K-Linie und den 3-Tage-SMA auf der K-Linie als D-Linie.

  3. Eingabe von Long-Trades bei Schließen > 8-Tage-EMA bei langem Signal Eingabe von Short-Trades bei Schließen < 8-Tage-EMA bei kurzem Signal.

  4. Der Stop-Loss wird auf 1 ATR-Distanz unter/über dem Einstiegspreis gesetzt.

Stärken

  1. Der EMA als Basisindikator kann Trends effektiv verfolgen.

  2. Das Hinzufügen des Stoch RSI kann falsche Signale filtern und die Eingabegenauigkeit erhöhen.

  3. Die ATR-basierte Stop-Loss- und Take-Profit-Lösung kann die Marktvolatilität dynamisch verfolgen und eine unsachgemäße Platzierung vermeiden.

  4. Diese Strategie hat gut abgestimmte Parameter und ist in Trendperioden sehr gut geeignet.

Risiken

  1. Die Kombination von mehreren Indikatoren erhöht das Whipsaw-Risiko. Konfliktreiche Signale zwischen EMA und Stoch RSI können zu einem Eintritt auf schlechten Niveaus führen. Der Preistrend selbst muss in solchen Fällen überwacht werden.

  2. Die konservative Einstellung von Stop-Loss und Take-Profit könnte durch große Marktschwankungen verletzt werden, was zu vorzeitigen Ausstiegen führt, die weitere Trends verpassen.

  3. Bei der Einrichtung eines Triple EMA ist eine gewisse Verzögerung bei der Umkehrung der schnellen und mittleren Linien zu beobachten.

  4. Diese Strategie begünstigt den Trendmarkt. Seitwärtsmärkte würden nicht gut abschneiden.

Verbesserungen

  1. Fügen Sie Indikatoren wie MACD für bessere Einträge hinzu.

  2. Optimierung der langen/kurzen Testparameter auf ATR. Zum Beispiel Anpassung des Stop-Loss von 1 ATR auf 1,5 ATR, Gewinn von 4 ATR auf 3 ATR für bessere Ergebnisse.

  3. Stoch RSI entfernen und nur MAs für das Filtern von Lärm und stabilere Gewinne behalten.

  4. Hinzufügen weiterer Kriterien zur Beurteilung des Trends, wie zum Beispiel Handelsvolumen, um unter signifikanten Niveaus zu arbeiten.

Schlussfolgerung

Diese Strategie kombiniert dreifache EMA und Stoch RSI, um Trends zu bestimmen. Strenge Einstiegssignale reduzieren unnötige Trades. Dynamische SL und TP auf Basis von ATR machen die Parameter anpassungsfähig. Backtests zeigen große Ergebnisse während Trending-Perioden mit kleineren Drawdowns und konsistenten Gewinnen. Weitere Optimierungen könnten zu noch besseren Ergebnissen führen.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//              3ESRA
//              v0.2a

// Coded by Vaida Bogdan

// 3ESRA consists of a 3 EMA cross + a close above (for longs) the quickest EMA
// or below (for shorts). Note that I've deactivated the RSI Cross Over/Under
// (you can modify the code and activate it). The strategy also uses a stop loss
// that's at 1 ATR distance from the entry price and a take profit that's at
// 4 times the ATR distance from the entry price.

// Feedback:
// Tested BTCUSDT Daily
// 1. Stoch-RSI makes you miss opportunities.
// 2. Changing RR to 4:1 times ATR works better.

//@version=4
strategy(title="3 EMA + Stochastic RSI + ATR", shorttitle="3ESRA", overlay=true, pyramiding=1,
     process_orders_on_close=true, calc_on_every_tick=true,
     initial_capital=1000, currency = currency.USD, default_qty_value=10, 
     default_qty_type=strategy.percent_of_equity,
     commission_type=strategy.commission.percent, commission_value=0.1, slippage=2)

startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="Backtesting range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="Backtesting range")
startYear = input(title="Start Year", type=input.integer,
     defval=1900, minval=1800, maxval=2100, group="Backtesting range")
endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="Backtesting range")
endMonth = input(title="End Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="Backtesting range")
endYear = input(title="End Year", type=input.integer,
     defval=2040, minval=1800, maxval=2100, group="Backtesting range")

// Date range filtering
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and
     (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 23, 59))
     
fast = input(8, minval=8, title="Fast EMA", group="EMAs")
medium = input(14, minval=8, title="Medium EMA", group="EMAs")
slow = input(50, minval=8, title="Slow EMA", group="EMAs")
src = input(close, title="Source")

smoothK = input(3, "K", minval=1, group="Stoch-RSI", inline="K&D")
smoothD = input(3, "D", minval=1, group="Stoch-RSI", inline="K&D")
lengthRSI = input(14, "RSI Length", minval=1, group="Stoch-RSI", inline="length")
lengthStoch = input(14, "Stochastic Length", minval=1, group="Stoch-RSI", inline="length")
rsiSrc = input(close, title="RSI Source", group="Stoch-RSI")

length = input(title="Length", defval=14, minval=1, group="ATR")
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR")

// EMAs
fastema = ema(src, fast)
mediumema = ema(src, medium)
slowema = ema(src, slow)

// S-RSI
rsi1 = rsi(rsiSrc, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
sRsiCrossOver = k[1] < d[1] and k > d
sRsiCrossUnder = k[1] > d[1] and k < d

// ATR
ma_function(source, length) =>
	if smoothing == "RMA"
		rma(source, length)
	else
		if smoothing == "SMA"
			sma(source, length)
		else
			if smoothing == "EMA"
				ema(source, length)
			else
				wma(source, length)
atr = ma_function(tr(true), length)

// Trading Logic
longCond1 = (fastema > mediumema) and (mediumema > slowema)
longCond2 = true
// longCond2 = sRsiCrossOver
longCond3 = close > fastema
longCond4 = strategy.position_size <= 0
longCond = longCond1 and longCond2 and longCond3 and longCond4 and inDateRange

shortCond1 = (fastema < mediumema) and (mediumema < slowema)
shortCond2 = true 
// shortCond2 = sRsiCrossUnder
shortCond3 = close < fastema
shortCond4 = strategy.position_size >= 0
shortCond = shortCond1 and shortCond2 and shortCond3 and shortCond4 and inDateRange

var takeProfit = float(na), var stopLoss = float(na)
if longCond and strategy.position_size <= 0
    takeProfit := close + 4*atr
    stopLoss := close - 1*atr
    // takeProfit := close + 2*atr
    // stopLoss := close - 3*atr

else if shortCond and strategy.position_size >= 0
    takeProfit := close - 4*atr
    stopLoss := close + 1*atr
    // takeProfit := close - 2*atr
    // stopLoss := close + 3*atr
    
// Strategy calls
strategy.entry("3ESRA", strategy.long, comment="Long", when=longCond and strategy.position_size <= 0)
strategy.entry("3ESRA", strategy.short, comment="Short", when=shortCond and strategy.position_size >= 0)
strategy.exit(id="TP-SL", from_entry="3ESRA", limit=takeProfit, stop=stopLoss)
if (not inDateRange)
    strategy.close_all()
    
// Plot EMAs
plot(fastema, color=color.purple, linewidth=2, title="Fast EMA")
plot(mediumema, color=color.teal, linewidth=2, title="Medium EMA")
plot(slowema, color=color.yellow, linewidth=2, title="Slow EMA")
// Plot S-RSI
// plotshape((strategy.position_size > 0) ? na : sRsiCrossOver, title="StochRSI Cross Over", style=shape.triangleup, location=location.belowbar, color=color.teal, text="SRSI", size=size.small)
// Plot trade
bgcolor(strategy.position_size > 0 ? color.new(color.green, 75) : strategy.position_size < 0 ? color.new(color.red,75) : color(na))
// Plot Strategy
plot((strategy.position_size != 0) ? takeProfit : na, style=plot.style_linebr, color=color.green, title="TP")
plot((strategy.position_size != 0) ? stopLoss : na, style=plot.style_linebr, color=color.red, title="SL")



Mehr