Ini adalah strategi mengikuti trend RSI berganda yang menggunakan dua penunjuk RSI untuk isyarat perdagangan panjang dan pendek, digabungkan dengan sistem purata bergerak untuk menentukan arah trend. Ia tergolong dalam kategori strategi algoritma RSI berganda. Strategi ini mula-mula menggunakan penunjuk RSI untuk menentukan isyarat bullish dan bearish, kemudian menggunakan purata bergerak untuk mengesahkan arah trend untuk perdagangan panjang atau pendek.
Strategi RSI berganda terutamanya menggunakan dua penunjuk RSI dengan jangka masa yang berbeza untuk isyarat perdagangan. Ia mula-mula menetapkan dua parameter RSI, satu tempoh yang lebih lama RSI sebagai penunjuk utama, dan satu tempoh yang lebih pendek RSI sebagai penapis tambahan. Apabila tempoh yang lebih lama RSI memecahkan di bawah garis oversold, isyarat panjang dihasilkan. Apabila tempoh yang lebih pendek RSI memecahkan di atas garis overbought, isyarat pendek dihasilkan. Ini membentuk sistem silang RSI berganda untuk peluang perdagangan.
Untuk menapis isyarat palsu, strategi ini juga menggabungkan purata bergerak SMA dan EMA untuk pengesanan trend. Hanya apabila SMA tempoh pendek melintasi di atas EMA tempoh panjang, isyarat RSI panjang dianggap. Dan hanya apabila SMA pendek melintasi di bawah EMA panjang, isyarat RSI pendek dianggap. Ini memastikan isyarat RSI sejajar dengan arah trend dan mengelakkan perdagangan terhadap trend.
Di samping itu, strategi ini juga menetapkan logik stop loss dan mengambil keuntungan. Selepas membuka kedudukan, dua pesanan mengambil keuntungan dengan saiz yang berbeza diletakkan, bersama dengan tahap stop loss.
Strategi algoritma RSI berganda mempunyai kelebihan berikut:
Indikator RSI jangka masa berganda dapat menentukan isyarat kenaikan dan penurunan dengan lebih tepat. Gabungan RSI jangka panjang dan pendek dapat menapis beberapa isyarat palsu dan meningkatkan kualiti isyarat.
Sistem purata bergerak membantu menentukan arah trend utama, mengelakkan perdagangan terhadap trend, dan boleh menapis kebanyakan perdagangan bising, meningkatkan kadar kemenangan.
Mekanisme stop loss dan mengambil keuntungan yang fleksibel membolehkan pulangan yang lebih tinggi melalui tetapan mengambil keuntungan yang berbeza, dan menguruskan risiko melalui stop loss.
Logik perdagangan adalah mudah dan jelas, mudah difahami dan dioptimumkan. Ia sesuai untuk dipelajari oleh peniaga algoritma.
Walaupun terdapat kelebihan, strategi RSI berganda juga mempunyai risiko berikut:
RSI sendiri mempunyai keberkesanan yang terhad dalam pasaran yang berbeza dan pembalikan trend.
Walaupun purata bergerak menapis bunyi bising kecil, ia kurang berkesan dalam mengesan perubahan trend kitaran pertengahan, dan mungkin terlepas titik perubahan trend.
Tetapan stop loss dan take profit yang tidak betul boleh menyebabkan stop terlalu luas atau keuntungan terlalu kecil, merosot prestasi strategi.
Posisi panjang / pendek yang besar boleh membawa kepada kerugian yang diperbesar.
Untuk menangani risiko ini, parameter boleh diselaraskan, penunjuk trend dan pembalikan yang lebih maju boleh diperkenalkan, logik berhenti dan keuntungan dioptimumkan, dan saiz kedudukan dikawal untuk meminimumkan risiko.
Strategi RSI berganda boleh dioptimumkan lagi dalam aspek berikut:
Uji kombinasi parameter yang berbeza untuk mencari tempoh RSI panjang dan pendek yang optimum.
Memperkenalkan penunjuk lain seperti MACD untuk analisis trend dan pembalikan yang lebih baik.
Mengoptimumkan strategi stop loss dan mengambil keuntungan, menggunakan berhenti penghujung atau bergerak mengambil keuntungan untuk lebih banyak fleksibiliti.
Tambah modul kawalan saiz kedudukan untuk menyesuaikan kedudukan panjang / pendek dalam peringkat kitaran trend yang berbeza.
Menggabungkan model pembelajaran mesin untuk meningkatkan ketepatan masuk dan keluar.
Backtest pada produk yang berbeza dan jangka masa untuk pengoptimuman.
Ringkasnya, strategi RSI berganda adalah strategi trend berikut yang tipikal. Idea menggabungkan isyarat RSI berganda dan penapisan bunyi rata-rata bergerak adalah sangat klasik dan praktikal. Walaupun terdapat bidang untuk peningkatan, logik keseluruhan jelas dan mudah difahami dan dioptimumkan. Ini adalah strategi yang hebat untuk pemula perdagangan algoritma belajar dan berlatih. Melalui pengoptimuman dan pengulangan berterusan berdasarkan prinsip
/*backtest start: 2023-11-07 00:00:00 end: 2023-11-14 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Growth Producer", overlay=true, initial_capital = 1000, currency = "USD", pyramiding = 2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) //Functions Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) /// TREND ribbon_period = input(19, "Period", step=1) leadLine1 = ema(close, ribbon_period) leadLine2 = sma(close, ribbon_period) p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) // Relative volatility index length = input(120,"RVI period", minval=1), src = close len = 14 stddev = stdev(src, length) upper = ema(change(src) <= 0 ? 0 : stddev, len) lower = ema(change(src) > 0 ? 0 : stddev, len) rvi = upper / (upper + lower) * 100 benchmark = input(35, "RVI benchmark", minval=10, maxval=100, step=0.1) // Plot RVI // h0 = hline(80, "Upper Band", color=#C0C0C0) // h1 = hline(20, "Lower Band", color=#C0C0C0) // fill(h0, h1, color=#996A15, title="Background") // offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) // plot(rvi, title="RVI", color=#008000, offset = offset) /// MFI input mfi_source = hlc3 mfi_length = input(19, "MFI Length", minval=1) mfi_lower = input(15, "MFI Lower level", minval=0, maxval=50) mfi_upper = input(90, "MFI Higher level", minval=50, maxval=100) // MFI upper_s = sum(volume * (change(mfi_source) <= 0 ? 0 : mfi_source), mfi_length) lower_s = sum(volume * (change(mfi_source) >= 0 ? 0 : mfi_source), mfi_length) mf = rsi(upper_s, lower_s) // mfp = plot(mf, color=color.new(color.gray,0), linewidth=1) // top = hline(mfi_upper, color=color.new(color.gray, 100), linewidth=1, editable=false) // bottom = hline(mfi_lower, color=color.new(color.gray,100), linewidth=1, editable=false) // hline(0, color=color.new(color.black,100), editable=false) // hline(100, color=color.new(color.black,100), editable=false) // Breaches // b_color = (mf > mfi_upper) ? color.new(color.red,70) : (mf < mfi_lower) ? color.new(color.green,60) : na // bgcolor(HighlightBreaches ? b_color : na) // fill(top, bottom, color=color.gray, transp=75) // Initial inputs Act_RSI_VWAP_long = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE LONG") RSI_VWAP_length_long = input(16, "RSI-VWAP LENGTH LONG") RSI_VWAP_overSold_long = input(13, "RSI-VWAP OVERSOLD LONG", type=input.float) RSI_VWAP_overBought_long = input(68, "RSI-VWAP OVERBOUGHT LONG", type=input.float) Act_RSI_VWAP_short = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE SHORT") RSI_VWAP_length_short = input(14, "RSI-VWAP LENGTH SHORT") RSI_VWAP_overSold_short = input(7, "RSI-VWAP OVERSOLD SHORT", type=input.float) RSI_VWAP_overBought_short = input(68, "RSI-VWAP OVERBOUGHT SHORT", type=input.float) // RSI with VWAP as source RSI_VWAP_long = rsi(vwap(close), RSI_VWAP_length_long) RSI_VWAP_short = rsi(vwap(close), RSI_VWAP_length_short) // Plot Them Separately. // Plotting LONG, Put overlay=false // r=plot(RSI_VWAP_long, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : RSI_VWAP_lnog < RSI_VWAP_overSold_long ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line) // h1=plot(RSI_VWAP_overBought_long, color = color.gray, style=plot.style_stepline) // h2=plot(RSI_VWAP_overSold_long, color = color.gray, style=plot.style_stepline) // fill(r,h1, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : na, transp = 60) // fill(r,h2, color = RSI_VWAP_long < RSI_VWAP_overSold_long ? color.lime : na, transp = 60) // Plotting SHORT, Put overlay=false // r=plot(RSI_VWAP_short, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line) // h1=plot(RSI_VWAP_overBought_short, color = color.gray, style=plot.style_stepline) // h2=plot(RSI_VWAP_overSold_short, color = color.gray, style=plot.style_stepline) // fill(r,h1, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : na, transp = 60) // fill(r,h2, color = RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : na, transp = 60) /////// STRATEGY Take Profit / Stop Loss //////// ////// LONG ////// long_tp1_inp = input(3.3, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(12, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1) long_sl_inp = input(3.3, title='Long Stop Loss %', step=0.1)/100 long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) ////// SHORT ////// short_tp1_inp = input(3.2, title='Short Take Profit 1 %', step=0.1)/100 short_tp1_qty = input(20, title="Short Take Profit 1 Qty", step=1) short_tp2_inp = input(5.5, title='Short Take Profit 2%', step=0.1)/100 short_tp2_qty = input(100, title="Short Take Profit 2 Qty", step=1) short_sl_inp = input(3.2, title='Short Stop Loss %', step=0.1)/100 short_take_level_1 = strategy.position_avg_price * (1 - short_tp1_inp) short_take_level_2 = strategy.position_avg_price * (1 - short_tp2_inp) short_stop_level = strategy.position_avg_price * (1 + short_sl_inp) ///Strategy_Conditions /// LONG /// entry_long =(crossover(RSI_VWAP_long, RSI_VWAP_overSold_long) and leadLine2<leadLine1) or (crossunder(mf,mfi_lower) and leadLine2<leadLine1) entry_price_long=valuewhen(entry_long,close,0) exit_long =crossunder(RSI_VWAP_long, RSI_VWAP_overBought_long) /// SHORT /// entry_short =crossunder(RSI_VWAP_short, RSI_VWAP_overBought_short) and leadLine2>leadLine1 or (crossover(mf,mfi_upper) and leadLine2>leadLine1) entry_price_short=valuewhen(entry_short,close,0) exit_short =crossover(RSI_VWAP_short, RSI_VWAP_overSold_short) ////// BACKTEST PERIOD /////// testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => true if testPeriod() if strategy.position_size == 0 or strategy.position_size > 0 and rvi>benchmark strategy.entry("long", true, when = entry_long, comment="Insert Enter Long Comment") strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1, stop=long_stop_level) strategy.exit("TP2","long", qty_percent=long_tp2_qty, limit=long_take_level_2, stop=long_stop_level) strategy.close("long", when=exit_long, comment = "Insert Exit Long Comment") if strategy.position_size == 0 or strategy.position_size < 0 and rvi>benchmark strategy.entry("short", false, when = entry_short, comment="Insert Enter Short Comment") strategy.exit("TP1","short", qty_percent=short_tp1_qty, limit=short_take_level_1, stop=short_stop_level) strategy.exit("TP2","short", qty_percent=short_tp2_qty, limit=short_take_level_2, stop=short_stop_level) strategy.close("short", when=exit_short, comment = "Insert Exit Short Comment") // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss") // SHORT POSITION plot(strategy.position_size < 0 ? short_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Short Take Profit") plot(strategy.position_size < 0 ? short_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Short Take Profit") plot(strategy.position_size < 0 ? short_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")