
Die Strategie ist eine Trend-Tracking-Strategie, die ein Handelssignal aus einer Kombination aus einem Triple-Index-Moving-Average-Indikator und einem Random-Index-Flat-Moving-Average-Indikator erzeugt. Wenn ein schneller Moving-Average über einen schnelleren Moving-Average geht, wird ein schnellerer Moving-Average über einen langsameren Moving-Average gesehen.
Bei der Verwendung von dreifachen Index-Moving-Averages an den Tagen 8, 14 und 50 wird ein Mehrblick-Signal erzeugt, wenn der 14-Tage-Moving-Average über den 8-Tage-Moving-Average überschritten wird, während der 14-Tage-Moving-Average über den 50-Tage-Moving-Average überschritten wird; umgekehrt erzeugt es ein Überblick-Signal.
Der Stochastic RSI wird als Hilfsindikator verwendet. Zuerst wird der 14-Tage-RSI berechnet, dann der Stochastic auf der Grundlage des RSI und schließlich der K-Linie und der D-Linie für die Berechnung des 3-Tage-Simple Moving Average.
Bei der Erzeugung eines Handelssignals wird ein Plus eingegeben, wenn der Preis über dem 8-Tage-Indikator-Moving-Average liegt, und ein Minus, wenn der Preis unter dem 8-Tage-Indikator-Moving-Average liegt.
Der Stop-Loss befindet sich unterhalb des Einstiegspreises / oberhalb des ATR-Abstands von 1x. Der Stop-Loss befindet sich über dem Einstiegspreis / unterhalb des ATR-Abstands von 4x.
Der Moving Average dient als Basisindikator, um Markttrends effektiv zu verfolgen. Der Triple-Index-Moving-Average verwendet mehrere Perioden in Kombination, um gleichzeitig eine Sensibilität für kurz- und mittelfristige Trends zu gewährleisten.
Das Hinzufügen des stochastischen RSI als Hilfsindikator zur Beurteilung kann falsche Signale filtern und die Genauigkeit der Eintrittsprüfung verbessern.
Die Einstellung der Stop-Loss-Stop-Position basierend auf der ATR ermöglicht es, die Schwankungen des Marktes dynamisch zu verfolgen und zu vermeiden, dass die Stop-Loss-Stop-Position zu groß oder zu klein ist.
Die Strategie hat eine vernünftige Parameter-Einstellung und funktioniert sehr gut bei großen Trends. Die Rückgänge sind gering, die Erträge relativ stabil und eignen sich für langfristige Operationen.
Eine Mehrindikator-Paar-Strategie erhöht das Risiko einer Umkehrung. Es kann zu Handelssignalfehlern kommen, wenn der Moving Average und der Stochastic RSI gegensätzliche Signale senden. Es ist wichtig, auf die Tendenz der Preise selbst zu achten.
Die Einstellungen für Stop-Loss und Stop-Out sind eher konservativ und können bei starken Marktschwankungen durchbrochen werden, so dass sie gestoppt werden und eine Trendchance verpasst wird. In diesem Fall können die ATR-Parameter entsprechend angepasst oder die Multiplikatoren der Stop-Loss-Stop-Operation erhöht werden.
Aufgrund der Verwendung von dreifachen Moving Averages gibt es eine gewisse Verzögerung, wenn sich die Schnell- und die Mittelgeschwindigkeitslinien umkehren. Es muss darauf geachtet werden, ob sich der Preis selbst umkehrt, um zu entscheiden, ob er aufgenommen wird.
Diese Strategie ist hauptsächlich für Trendbewegungen geeignet, die bei der Konsolidierung nicht gut abschneiden. In diesem Fall kann die Optimierung der Periodenparameter des Moving Averages oder die Verwendung anderer beurteilender Indikatoren in Betracht gezogen werden.
Weitere Indikatoren wie MACD können in Betracht gezogen werden, um die Eintrittszeit weiter zu optimieren. Es kann auch eine Kombination von Moving Averages mit verschiedenen Parametern getestet werden.
Die Parameter für die ATR-Freiheitskontrolle können optimiert werden. Zum Beispiel kann der Stop-Loss von 1 ATR auf 1.5 ATR und der Stop-Off von 4 ATR auf 3 ATR angepasst werden, um zu sehen, ob ein besserer Gewinn erzielt werden kann.
Es ist möglich, nur mit einem Moving Average zu testen und den Stochastic RSI zu entfernen, um zu sehen, ob man mehr Lärm filtern kann, um einen stabileren Gewinn zu erzielen.
Es kann in Erwägung gezogen werden, weitere Bedingungen für Trends zu verwenden, z. B. die Erhöhung der Handelsvolumen-Indikatoren, um sicherzustellen, dass die Trends auf der großen Ebene gehandelt werden.
Die Strategie nutzt eine Kombination aus Triple-Index-Moving Averages und Stochastic RSI-Indikatoren, um die Richtung des Trends zu bestimmen. Die Einstiegssignale sind strenger und können einen sinnlosen Handel wirksam reduzieren. Die Stop-Loss-Einstellung folgt dynamisch der ATR, wodurch die Strategieparameter anpassungsfähig sind.
/*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")