Ini adalah strategi mengikuti tren RSI ganda yang menggunakan dua indikator RSI untuk sinyal perdagangan panjang dan pendek, dikombinasikan dengan sistem rata-rata bergerak untuk menentukan arah tren. Ini termasuk dalam kategori strategi algoritmik RSI ganda. Strategi ini pertama menggunakan indikator RSI untuk menentukan sinyal bullish dan bearish, kemudian menggunakan rata-rata bergerak untuk mengkonfirmasi arah tren untuk perdagangan panjang atau pendek. Ini adalah strategi mengikuti tren khas.
Strategi RSI ganda terutama menggunakan dua indikator RSI dengan kerangka waktu yang berbeda untuk sinyal perdagangan. Pertama-tama menetapkan dua parameter RSI, satu periode RSI yang lebih lama sebagai indikator utama, dan satu periode RSI yang lebih pendek sebagai filter tambahan. Ketika RSI periode yang lebih lama melanggar di bawah garis oversold, sinyal panjang dihasilkan. Ketika RSI periode yang lebih pendek melanggar di atas garis overbought, sinyal pendek dihasilkan. Ini membentuk sistem crossover RSI ganda untuk peluang perdagangan.
Untuk menyaring sinyal palsu, strategi ini juga menggabungkan SMA dan EMA moving average untuk deteksi tren. Hanya ketika SMA periode pendek melintasi di atas EMA periode panjang, sinyal RSI panjang dianggap. Dan hanya ketika SMA pendek melintasi di bawah EMA panjang, sinyal RSI pendek dianggap. Ini memastikan sinyal RSI sejajar dengan arah tren dan menghindari perdagangan melawan tren.
Selain itu, strategi ini juga mengatur stop loss dan take profit logic. Setelah membuka posisi, dua take profit order berukuran berbeda ditempatkan, bersama dengan level stop loss.
Strategi algoritma RSI ganda memiliki keuntungan berikut:
Indikator RSI jangka dua dapat lebih akurat menentukan sinyal bullish dan bearish. Kombinasi RSI jangka panjang dan pendek dapat menyaring beberapa sinyal palsu dan meningkatkan kualitas sinyal.
Sistem rata-rata bergerak membantu menentukan arah tren utama, menghindari perdagangan melawan tren, dan dapat menyaring sebagian besar perdagangan kebisingan, meningkatkan tingkat kemenangan.
Mekanisme stop loss dan take profit yang fleksibel memungkinkan pengembalian yang lebih tinggi melalui pengaturan take profit yang berbeda, dan mengelola risiko melalui stop loss.
Logika perdagangan sederhana dan jelas, mudah dimengerti dan dioptimalkan.
Meskipun memiliki keuntungan, strategi RSI ganda juga memiliki risiko berikut:
RSI sendiri memiliki efektivitas terbatas dalam pasar yang bervariasi dan pembalikan tren.
Meskipun rata-rata bergerak menyaring kebisingan kecil, mereka kurang efektif dalam mendeteksi perubahan tren siklus menengah, dan mungkin melewatkan titik balik tren.
Pengaturan stop loss dan take profit yang tidak tepat dapat mengakibatkan stop loss terlalu luas atau keuntungan terlalu kecil, memperburuk kinerja strategi.
Posisi panjang/pendek yang besar dapat menyebabkan kerugian yang diperbesar.
Untuk mengatasi risiko-risiko ini, parameter dapat disesuaikan, indikator tren dan pembalikan yang lebih maju dapat diperkenalkan, logika stop dan profit dioptimalkan, dan ukuran posisi dikendalikan untuk meminimalkan risiko.
Strategi RSI ganda dapat dioptimalkan lebih lanjut dalam aspek berikut:
Uji kombinasi parameter yang berbeda untuk menemukan periode RSI panjang dan pendek yang optimal.
Memperkenalkan indikator lain seperti MACD untuk analisis tren dan pembalikan yang lebih baik.
Optimalkan strategi stop loss dan take profit, gunakan trailing stop atau pindah take profit untuk lebih fleksibilitas.
Tambahkan modul kontrol ukuran posisi untuk menyesuaikan posisi panjang/pendek pada tahap siklus tren yang berbeda.
Mengintegrasikan model pembelajaran mesin untuk meningkatkan akurasi masuk dan keluar.
Backtest pada produk yang berbeda dan kerangka waktu untuk optimasi.
Secara singkat, strategi dual RSI adalah strategi yang mengikuti tren yang khas. Ide menggabungkan sinyal dual RSI dan penyaringan kebisingan rata-rata bergerak sangat klasik dan praktis. Meskipun ada bidang untuk perbaikan, logika keseluruhan jelas dan mudah dipahami dan dioptimalkan. Ini adalah strategi yang bagus untuk pemula perdagangan algoritmik untuk dipelajari dan dipraktekkan. Melalui pengoptimalan dan iterasi berkelanjutan 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")