Tiga Exponential Moving Averages dan Strategi Dagangan Indeks Kekuatan Relatif Stochastic

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

img

Ringkasan

Ini adalah strategi trend yang menggabungkan purata bergerak eksponensial tiga (EMA) dan Indeks Kekuatan Relatif Stochastic (Stoch RSI) untuk menjana isyarat perdagangan. Ia menjadi panjang apabila EMA cepat melintasi di atas EMA sederhana dan EMA sederhana melintasi di atas EMA perlahan. Ia menjadi pendek apabila sebaliknya berlaku. Strategi ini juga menggunakan Stoch RSI sebagai penunjuk tambahan.

Prinsip-prinsip

  1. Gunakan 8, 14, 50 hari EMA. Pergi panjang apabila 8 hari EMA > 14 hari EMA > 50 hari EMA. Pergi pendek apabila ia adalah sebaliknya.

  2. Gunakan RSI Stochastic sebagai penunjuk tambahan. Hitung RSI 14 hari terlebih dahulu, kemudian hitung Stochastics pada RSI, akhirnya hitung 3 hari SMA sebagai garisan K dan 3 hari SMA pada garisan K sebagai garisan D. K melintasi D memberikan isyarat panjang.

  3. Masukkan dagangan panjang apabila penutupan > 8 hari EMA pada isyarat panjang Masukkan dagangan pendek apabila penutupan < 8 hari EMA pada isyarat pendek

  4. Set Stop Loss pada jarak 1 ATR di bawah/di atas harga masuk.

Kelebihan

  1. EMA sebagai penunjuk asas boleh mengesan trend dengan berkesan.

  2. Menambah Stoch RSI boleh menapis isyarat palsu dan meningkatkan ketepatan kemasukan.

  3. Stop loss dan mengambil keuntungan berasaskan ATR boleh menjejaki turun naik pasaran secara dinamik, mengelakkan penempatan yang tidak betul.

  4. Strategi ini mempunyai parameter yang disesuaikan dengan baik dan berfungsi dengan baik semasa tempoh trend. Pengeluaran lebih kecil dan keuntungan adalah konsisten untuk perdagangan jangka panjang.

Risiko

  1. Gabungan beberapa penunjuk meningkatkan risiko whipsaw. Isyarat yang bertentangan antara EMA dan Stoch RSI boleh menyebabkan masuk pada tahap yang buruk. Trend harga itu sendiri memerlukan pemantauan dalam kes sedemikian.

  2. Tetapan Stop Loss dan Take Profit yang konservatif boleh dilanggar oleh perubahan pasaran yang besar, menyebabkan keluar awal tanpa trend lanjut. Penyesuaian parameter ATR atau meningkatkan kelipatan SL / TP boleh membantu.

  3. Setup EMA bertiga mempunyai kelewatan tertentu apabila garis cepat dan sederhana membalikkan.

  4. Strategi ini memihak kepada pasaran trend. Pasaran sampingan tidak akan berfungsi dengan baik. Penyesuaian tempoh MA atau menambah penunjuk tambahan lain boleh membantu.

Peningkatan

  1. Tambah penunjuk seperti MACD untuk entri yang lebih baik.

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

  3. Menghapuskan Stoch RSI dan menyimpan hanya MAs untuk menapis bunyi bising dan keuntungan yang lebih stabil.

  4. Menambah lebih banyak kriteria menilai trend, seperti jumlah dagangan, untuk beroperasi di bawah tahap yang ketara.

Kesimpulan

Strategi ini menggabungkan tiga EMA dan Stoch RSI untuk menentukan trend. Isyarat kemasukan yang ketat mengurangkan perdagangan yang tidak perlu. SL dinamik dan TP berdasarkan ATR menjadikan parameter adaptif. Ujian belakang menunjukkan hasil yang baik semasa tempoh trend dengan penurunan yang lebih kecil dan keuntungan yang konsisten. Pengoptimuman lanjut boleh membawa kepada 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 lanjut