Tiga Eksponensial Moving Averages dan Stochastic Relative Strength Index Trading Strategy

Penulis:ChaoZhang, Tanggal: 2024-01-30 16:52:48
Tag:

img

Gambaran umum

Ini adalah strategi mengikuti tren yang menggabungkan rata-rata bergerak eksponensial tiga (EMA) dan Indeks Kekuatan Relatif Stochastic (Stoch RSI) untuk menghasilkan sinyal perdagangan. Ini panjang ketika EMA cepat melintasi di atas EMA menengah dan EMA menengah melintasi di atas EMA lambat. Ini pendek ketika sebaliknya terjadi. Strategi ini juga menggunakan Stoch RSI sebagai indikator tambahan.

Prinsip-prinsip

  1. Menggunakan 8, 14, 50 hari EMA. pergi panjang ketika 8 hari EMA > 14 hari EMA > 50 hari EMA. pergi pendek ketika sebaliknya.

  2. Gunakan RSI Stochastic sebagai indikator tambahan. Hitung RSI 14 hari pertama, kemudian hitung Stochastic pada RSI, akhirnya hitung SMA 3 hari sebagai garis K dan SMA 3 hari pada garis K sebagai garis D. K melintasi D memberikan sinyal panjang.

  3. Masukkan perdagangan panjang ketika close > 8 hari EMA pada sinyal panjang Masukkan perdagangan pendek ketika close < 8 hari EMA pada sinyal pendek

  4. Stop loss ditetapkan pada jarak 1 ATR di bawah/di atas harga masuk. Take profit ditetapkan pada jarak 4 ATR di atas/di bawah harga masuk.

Kekuatan

  1. EMA sebagai indikator dasar dapat melacak tren secara efektif.

  2. Menambahkan Stoch RSI dapat menyaring sinyal palsu dan meningkatkan akurasi entri.

  3. Stop loss dan take profit berbasis ATR dapat melacak volatilitas pasar secara dinamis, menghindari penempatan yang tidak tepat.

  4. Strategi ini memiliki parameter yang disesuaikan dengan baik dan berkinerja baik selama periode tren.

Risiko

  1. Kombinasi dari beberapa indikator meningkatkan risiko whipsaw. Sinyal yang bertentangan antara EMA dan Stoch RSI dapat menyebabkan masuk pada tingkat yang buruk. Tren harga itu sendiri perlu dipantau dalam kasus seperti itu.

  2. Pengaturan stop loss dan take profit yang konservatif dapat dilanggar oleh perubahan pasar yang besar, menyebabkan keluar prematur karena tidak ada tren lebih lanjut.

  3. Pengaturan EMA tiga kali memiliki keterlambatan tertentu ketika garis cepat dan menengah membalikkan.

  4. Strategi ini mendukung pasar tren. pasar samping tidak akan berkinerja baik. penyesuaian periode MA atau menambahkan indikator tambahan lainnya dapat membantu.

Peningkatan

  1. Tambahkan indikator seperti MACD untuk entri yang lebih baik.

  2. Mengoptimalkan parameter pengujian panjang/pendek pada ATR. Seperti menyesuaikan stop loss dari 1 ATR menjadi 1.5 ATR, mengambil keuntungan dari 4 ATR menjadi 3 ATR untuk hasil yang lebih baik.

  3. Menghilangkan Stoch RSI dan menjaga hanya MAs untuk menyaring kebisingan dan keuntungan yang lebih stabil.

  4. Menambahkan lebih banyak kriteria menilai tren, seperti volume perdagangan, untuk beroperasi di bawah tingkat yang signifikan.

Kesimpulan

Strategi ini menggabungkan tiga EMA dan Stoch RSI untuk menentukan tren. Sinyal masuk yang ketat mengurangi perdagangan yang tidak perlu. SL dan TP dinamis berdasarkan ATR membuat parameter adaptif. Backtest menunjukkan hasil yang baik selama periode tren dengan penurunan yang lebih kecil dan keuntungan yang konsisten. Optimasi lebih lanjut dapat menyebabkan hasil yang lebih baik.


/*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")



Lebih banyak