Strategi Indeks Kekuatan Relatif Purata Bergerak adalah strategi perdagangan kuantitatif yang menggunakan kedua-dua garis purata bergerak dan Indeks Kekuatan Relatif (RSI) sebagai isyarat perdagangan untuk menangkap peluang dalam trend pasaran.
Strategi ini terutamanya berdasarkan dua penunjuk:
Logik teras strategi adalah:
Apabila garisan penunjuk RSI lebih rendah daripada garis purata bergerak, ia berada di rantau oversold dan menunjukkan saham itu diremehkan, menghasilkan isyarat beli.
Dalam erti kata lain, garis purata bergerak mencerminkan nilai wajar saham hingga tahap tertentu, sementara penunjuk RSI mewakili kekuatan atau kelemahan harga semasa.
Secara khusus, strategi ini menjana isyarat perdagangan melalui langkah-langkah berikut:
Dengan menggabungkan penilaian trend purata bergerak dan petunjuk overbought / oversold RSI, strategi ini dapat menentukan titik perubahan di pasaran dengan berkesan dengan memanfaatkan kekuatan penunjuk yang berbeza.
Kelebihan utama ialah:
Terdapat juga beberapa risiko dengan strategi ini:
Untuk menguruskan risiko, pengoptimuman boleh dilakukan dengan cara berikut:
Arah pengoptimuman lanjut termasuk:
Melalui pengoptimuman parameter, pengoptimuman penunjuk, pengoptimuman pengurusan risiko dan lain-lain, kestabilan dan keuntungan strategi ini dapat terus ditingkatkan.
Strategi RSI Purata Bergerak menggunakan kedua-dua trend harga dan analisis overbought / oversold untuk mengenal pasti titik perubahan pasaran dengan berkesan dan menangkap peluang pembalikan. Strategi mudah dan praktikal ini mempunyai risiko yang boleh dikawal dan berguna untuk perdagangan kuantitatif. Pengoptimuman lanjut boleh membawa kepada hasil yang lebih baik.
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-24 06:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "RSI versus SMA", shorttitle = "RSI vs SMA", overlay = false, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, currency = currency.GBP) // Revision: 1 // Author: @JayRogers // // *** USE AT YOUR OWN RISK *** // - Nothing is perfect, and all decisions by you are on your own head. And stuff. // // Description: // - It's RSI versus a Simple Moving Average.. Not sure it really needs much more description. // - Should not repaint - Automatically offsets by 1 bar if anything other than "open" selected as RSI source. // === INPUTS === // rsi rsiSource = input(defval = open, title = "RSI Source") rsiLength = input(defval = 8, title = "RSI Length", minval = 1) // sma maLength = input(defval = 34, title = "MA Period", minval = 1) // invert trade direction tradeInvert = input(defval = false, title = "Invert Trade Direction?") // risk management useStop = input(defval = false, title = "Use Initial Stop Loss?") slPoints = input(defval = 25, title = "Initial Stop Loss Points", minval = 1) useTS = input(defval = true, title = "Use Trailing Stop?") tslPoints = input(defval = 120, title = "Trail Points", minval = 1) useTSO = input(defval = false, title = "Use Offset For Trailing Stop?") tslOffset = input(defval = 20, title = "Trail Offset Points", minval = 1) // === /INPUTS === // === BASE FUNCTIONS === // delay for direction change actions switchDelay(exp, len) => average = len >= 2 ? sum(exp, len) / len : exp[1] up = exp > average down = exp < average state = up ? true : down ? false : up[1] // === /BASE FUNCTIONS === // === SERIES and VAR === // rsi shunt = rsiSource == open ? 0 : 1 rsiUp = rma(max(change(rsiSource[shunt]), 0), rsiLength) rsiDown = rma(-min(change(rsiSource[shunt]), 0), rsiLength) rsi = (rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))) - 50 // shifted 50 points to make 0 median // sma of rsi rsiMa = sma(rsi, maLength) // self explanatory.. tradeDirection = tradeInvert ? 0 <= rsiMa ? true : false : 0 >= rsiMa ? true : false // === /SERIES === // === PLOTTING === barcolor(color = tradeDirection ? green : red, title = "Bar Colours") // hlines medianLine = hline(0, title = 'Median', color = #996600, linewidth = 1) limitUp = hline(25, title = 'Limit Up', color = silver, linewidth = 1) limitDown = hline(-25, title = 'Limit Down', color = silver, linewidth = 1) // rsi and ma rsiLine = plot(rsi, title = 'RSI', color = purple, linewidth = 2, style = line, transp = 50) areaLine = plot(rsiMa, title = 'Area MA', color = silver, linewidth = 1, style = area, transp = 70) // === /PLOTTING === goLong() => not tradeDirection[1] and tradeDirection killLong() => tradeDirection[1] and not tradeDirection strategy.entry(id = "Buy", long = true, when = goLong()) strategy.close(id = "Buy", when = killLong()) goShort() => tradeDirection[1] and not tradeDirection killShort() => not tradeDirection[1] and tradeDirection strategy.entry(id = "Sell", long = false, when = goShort()) strategy.close(id = "Sell", when = killShort()) if (useStop) strategy.exit("XSL", from_entry = "Buy", loss = slPoints) strategy.exit("XSS", from_entry = "Sell", loss = slPoints) // if we're using the trailing stop if (useTS and useTSO) // with offset strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints, trail_offset = tslOffset) strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints, trail_offset = tslOffset) if (useTS and not useTSO) // without offset strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints) strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints)