Strategi VRSI dan MARSI menggunakan purata bergerak untuk meluruskan penunjuk RSI dan melaksanakan strategi penunjuk berganda. Ia menggunakan kedua-dua penunjuk RSI harga dan jumlah, digabungkan dengan purata bergerak mereka, untuk menjana isyarat perdagangan. Ia pergi lama apabila harga RSI naik dan pergi pendek apabila harga RSI jatuh. Sementara itu, ia memerhatikan perubahan dalam RSI jumlah untuk menilai kekuatan pasaran dan kemungkinan perubahan trend.
Strategi ini mula-mula mengira penunjuk harga RSI 9 tempoh (RSI) dan penunjuk jumlah RSI 9 tempoh (VRSI). Kemudian ia mengira purata bergerak mudah 5 tempoh (MARSI dan MAVRSI) dari kedua-dua penunjuk RSI ini.
Isyarat perdagangan dihasilkan berdasarkan penunjuk MARSI. Ia pergi lama apabila MARSI naik dan pergi pendek apabila MARSI jatuh. Di samping itu, penunjuk MAVRSI digunakan untuk menilai kekuatan pasaran dan kemungkinan perubahan trend.
Sebagai contoh, semasa trend menaik, jika harga terus naik tetapi jumlah mula berkurangan, ini menandakan bahawa kekuatan menaik mungkin melemah dan seseorang harus bersedia untuk menutup kedudukan panjang. Sebaliknya, semasa trend menurun, jika harga terus jatuh tetapi jumlah meningkat, ini menandakan penguatan kekuatan penurunan dan kedudukan pendek boleh dipegang lebih lanjut.
Dengan menggabungkan purata bergerak penunjuk RSI berganda, strategi ini dapat menangkap trend dengan berkesan, sambil menggunakan perubahan jumlah untuk menilai kekuatan pasaran dan mengelakkan terperangkap.
Penggunaan purata bergerak juga menapis beberapa bunyi bising untuk menjadikan isyarat lebih boleh dipercayai.
Risiko utama strategi ini terletak pada perbezaan yang mungkin berlaku antara penunjuk dua. Apabila terdapat perbezaan antara harga dan jumlah, isyarat perdagangan boleh menjadi kurang boleh dipercayai. Penghakiman manual mengenai hubungan antara penunjuk diperlukan kemudian.
Risiko lain adalah terperangkap dalam pasaran yang terikat julat. Apabila harga bergerak dalam julat, penunjuk RSI cenderung berayun ke atas dan ke bawah, mencetuskan perdagangan yang tidak perlu. Penyesuaian parameter atau menilai tahap mutlak penunjuk diperlukan kemudian.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Sesuaikan parameter RSI dan purata bergerak untuk mencari kombinasi yang optimum
Tambah keadaan lain apabila menghasilkan isyarat, contohnya isyarat pembalikan yang dicetuskan di kawasan overbought / oversold cenderung lebih dipercayai
Tambah strategi stop loss seperti pergerakan stop loss atau penunjuk stop loss
Masukkan penunjuk lain seperti corak candlestick, penunjuk turun naik dan lain-lain untuk mengelakkan perangkap
Strategi VRSI dan MARSI berjaya menggabungkan penunjuk RSI harga dan jumlah. Perbandingan dan penghakiman antara penunjuk dua boleh meningkatkan ketepatan isyarat dan keuntungan. Optimum parameter dan strategi stop loss juga membolehkan berjalan stabil. Ringkasnya, dengan menggabungkan penunjuk, strategi ini mencapai prestasi yang lebih baik berbanding satu penunjuk RSI.
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("VRSI-MARSI Strategy", shorttitle="(V/MA)RSI Str.", overlay=false, default_qty_type=strategy.percent_of_equity, calc_on_order_fills=true, calc_on_every_tick=true, pyramiding=0, default_qty_value=5, initial_capital=100) // RSI(close, ="RSI") and RSI(Volume, ="VRSI") src = close, len = input(9, minval=1, title="Length RSI") src2 = volume, len2 = input(9, minval=1, title="Length VRSI)") up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) up2 = rma(max(change(src2), 0), len2) down2 = rma(-min(change(src2), 0), len2) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2)) // MA(=Moving Average) of RSI(close, ="MARSI") and RSI(Volume, ="MAVRSI") len3 = input(5, minval=1, title="Length MARSI") marsi = sma(rsi, len3) len4 = input(5, minval=1, title="Length MAVRSI") marsi2 = sma(rsi2, len4) // Plot: // Default plot of RSI and VRSI: not visible but can be made visible // Default plot MARSI and MAVRSI: visible p1 = plot(rsi, linewidth=2, transp=100, color=color.yellow, title="RSI") p2 = plot(rsi2, linewidth=2, transp=100, color=color.orange, title="VRSI") m1 = plot(marsi, color=(marsi>=0 ? (marsi[1] < marsi ? color.yellow : color.blue) : (marsi[1] < marsi ? color.yellow : color.blue) ), linewidth = 2, transp = 0, title="MARSI") m2 = plot(marsi2, color=color.orange, linewidth = 2, transp = 0, title="MAVRSI") // Color fill: // Default color fill "RSI - VRSI": not visible but can be made visible // Default color fill "MARSI - MAVRSI": visible fill(p1,p2, color = rsi>rsi2 ? color.green : color.red, transp=100, title="BG RSI-VRSI") fill(m1,m2, color = marsi>marsi2 ? color.green : color.red, transp=75, title="BG MARSI-MAVRSI") // Lines: h2=hline(20, color=color.green, linestyle=hline.style_dotted, title="Extreme Oversold Rsi") h3=hline(30, color=color.black, linestyle=hline.style_dotted, title="Oversold Rsi") h5=hline(50, color=color.yellow, linestyle=hline.style_dashed, title="Middle line") h7=hline(70, color=color.black, linestyle=hline.style_dotted, title="Overbought Rsi") h8=hline(80, color=color.red, linestyle=hline.style_dotted, title="Extreme Overbought Rsi") // Color fill between Lines "20-30" and "70-80" represents the crossing of "MARSI" and "MAVRSI": fill(h2, h3, color=(marsi2 > marsi ? color.red : color.green), transp=80, title="20-30 BG color X MARSI/MAVRSI") fill(h7, h8, color=(marsi2 > marsi ? color.red : color.green), transp=80, title="70-80 BG color X MARSI/MAVRSI") ///Long Entry/// longCondition = marsi > marsi[1] if (longCondition) strategy.entry("Long", strategy.long) ///Long exit/// Xlong =input(true) closeConditionLong = marsi < marsi[1] and Xlong if (closeConditionLong) strategy.close("Long") ///Short Entry/// shortCondition = marsi < marsi[1] if (shortCondition) strategy.entry("Short", strategy.short) ///Short exit/// Xshort =input(true) closeConditionShort = marsi > marsi[1] and Xshort if (closeConditionShort) strategy.close("Short")