
Strategi ini adalah strategi pengesanan trend yang menggabungkan indikator purata bergerak tiga indeks dan indikator purata bergerak rata-rata untuk menghasilkan isyarat perdagangan. Apabila rata-rata bergerak cepat melintasi rata-rata bergerak sederhana, rata-rata bergerak sederhana melintasi rata-rata bergerak perlahan melihat lebih banyak; apabila rata-rata bergerak cepat melintasi rata-rata bergerak sederhana, rata-rata bergerak perlahan melintasi rata-rata bergerak rendah melihat lebih rendah.
Menggunakan purata bergerak tiga kali ganda pada 8, 14 dan 50 hari. Apabila purata bergerak pada hari ke-8 diletakkan di atas purata bergerak pada hari ke-14, purata bergerak pada hari ke-14 diletakkan di atas purata bergerak pada hari ke-50 menghasilkan isyarat melihat lebih banyak; sebaliknya, isyarat melihat ke atas.
Menggunakan indeks rawak rata rata rata rata rata bergerak sebagai penunjuk penilaian tambahan. Khususnya: pertama mengira 14 hari RSI, kemudian mengira penunjuk Stochastic berdasarkan penunjuk RSI, dan akhirnya mengira penunjuk Stochastic 3 hari purata bergerak mudah untuk mendapatkan garis K dan 3 hari purata bergerak mudah untuk mendapatkan garis D. Apabila K melalui garis D, sebagai isyarat tambahan untuk melihat lebih banyak.
Apabila menghasilkan isyarat perdagangan, masuk lebih tinggi jika harga lebih tinggi daripada purata bergerak indeks 8 hari; masuk kosong jika harga lebih rendah daripada purata bergerak indeks 8 hari.
Hentian terletak di bawah / di atas 1 kali ATR. Hentian terletak di atas / di bawah 4 kali ATR.
Rata-rata bergerak sebagai petunjuk asas, dapat mengesan trend pasaran dengan berkesan. Rata-rata bergerak indeks tiga kali ganda menggunakan beberapa kitaran dengan kombinasi, dapat memastikan kepekaan terhadap trend jangka pendek dan jangka panjang.
Menambah Stochastic RSI sebagai penunjuk penilaian tambahan, boleh menyaring isyarat palsu, meningkatkan ketepatan kemasukan.
Berdasarkan ATR untuk menetapkan kedudukan stop loss, anda boleh secara dinamik mengesan tahap turun naik pasaran, dan mengelakkan stop loss terlalu besar atau terlalu kecil.
Tetapan parameter strategi ini adalah munasabah dan mempunyai prestasi yang baik di bawah trend besar. Pengunduran kecil, keuntungan yang lebih stabil, sesuai untuk operasi garis panjang.
Strategi gabungan pelbagai indikator meningkatkan risiko berbalik. Kesalahan isyarat perdagangan mungkin berlaku apabila purata bergerak dan RSI Stokastik memberi isyarat yang bertentangan.
Tetapan stop loss dan stop adalah lebih konservatif, dan mungkin akan dihentikan apabila pasaran bergelombang, kehilangan peluang trend. Pada masa ini, parameter ATR boleh disesuaikan atau meningkatkan kelipatan stop loss.
Oleh kerana menggunakan purata bergerak tiga kali ganda, terdapat sedikit kelewatan apabila garis pantas dan garis pantas berbalik. Pada masa ini, anda perlu melihat sama ada harga itu sendiri berbalik untuk menentukan sama ada masuk atau tidak.
Strategi ini terutamanya sesuai untuk trend trend, yang tidak berfungsi dengan baik dalam keadaan penumpuan. Dalam hal ini, anda boleh mempertimbangkan untuk mengoptimumkan parameter kitaran rata-rata bergerak atau menggunakan penunjuk penilaian lain.
Penambahan penunjuk lain seperti MACD boleh dipertimbangkan untuk mengoptimumkan masa kemasukan lebih jauh. Anda juga boleh menguji gabungan purata bergerak dengan parameter yang berbeza.
Parameter yang diperiksa ATR boleh dioptimumkan. Sebagai contoh, stop loss boleh disesuaikan dari 1 ATR ke 1.5 ATR, dan stop loss disesuaikan dari 4 ATR ke 3 ATR, untuk melihat apakah keuntungan yang lebih baik dapat diperoleh.
Ia boleh diuji dengan hanya menggunakan purata bergerak, dan menghilangkan indikator RSI Stokastis, untuk melihat sama ada ia boleh menyaring lebih banyak kebisingan dan mendapatkan keuntungan yang lebih stabil.
Anda boleh pertimbangkan untuk menambah lebih banyak syarat untuk menilai trend, seperti menambah petunjuk jumlah transaksi untuk memastikan anda beroperasi dalam trend peringkat besar.
Strategi ini menggabungkan penggunaan purata bergerak indeks tiga dan penunjuk RSI Stochastic untuk menentukan arah trend. Isyarat masuk lebih ketat, yang dapat mengurangkan perdagangan yang tidak penting. Tetapan stop loss secara dinamik mengikuti ATR, menjadikan parameter strategi beradaptasi. Dari hasil pengkajian semula, strategi ini menunjukkan prestasi yang baik dalam keadaan trend, pengunduran kecil, dan keuntungan yang lebih stabil.
/*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")