Produsen Pertumbuhan - Tren RSI Dual Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-15 17:31:24
Tag:

img

Gambaran umum

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.

Analisis Prinsip

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.

Analisis Keuntungan

Strategi algoritma RSI ganda memiliki keuntungan berikut:

  1. 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.

  2. Sistem rata-rata bergerak membantu menentukan arah tren utama, menghindari perdagangan melawan tren, dan dapat menyaring sebagian besar perdagangan kebisingan, meningkatkan tingkat kemenangan.

  3. 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.

  4. Logika perdagangan sederhana dan jelas, mudah dimengerti dan dioptimalkan.

Analisis Risiko

Meskipun memiliki keuntungan, strategi RSI ganda juga memiliki risiko berikut:

  1. RSI sendiri memiliki efektivitas terbatas dalam pasar yang bervariasi dan pembalikan tren.

  2. Meskipun rata-rata bergerak menyaring kebisingan kecil, mereka kurang efektif dalam mendeteksi perubahan tren siklus menengah, dan mungkin melewatkan titik balik tren.

  3. Pengaturan stop loss dan take profit yang tidak tepat dapat mengakibatkan stop loss terlalu luas atau keuntungan terlalu kecil, memperburuk kinerja strategi.

  4. 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.

Arahan Optimasi

Strategi RSI ganda dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Uji kombinasi parameter yang berbeda untuk menemukan periode RSI panjang dan pendek yang optimal.

  2. Memperkenalkan indikator lain seperti MACD untuk analisis tren dan pembalikan yang lebih baik.

  3. Optimalkan strategi stop loss dan take profit, gunakan trailing stop atau pindah take profit untuk lebih fleksibilitas.

  4. Tambahkan modul kontrol ukuran posisi untuk menyesuaikan posisi panjang/pendek pada tahap siklus tren yang berbeda.

  5. Mengintegrasikan model pembelajaran mesin untuk meningkatkan akurasi masuk dan keluar.

  6. Backtest pada produk yang berbeda dan kerangka waktu untuk optimasi.

Kesimpulan

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 praktik membuat sempurna, hasil perdagangan yang stabil dapat dicapai.


/*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")

Lebih banyak