Indikator RSI Strategi Dual

Penulis:ChaoZhang, Tanggal: 2023-09-19 19:43:19
Tag:

Gambaran umum

Strategi ini menggunakan indikator Relative Strength Index (RSI) untuk menentukan tingkat overbought dan oversold untuk short dan long. Ini adalah strategi perdagangan pembalikan RSI khas. Strategi ini juga menggabungkan optimasi parameter, stop loss dll untuk beradaptasi dengan kondisi pasar yang berbeda.

Logika Strategi

Logika inti meliputi:

  1. Perhitungan nilai RSI
  2. Menetapkan batas atas dan bawah RSI
  3. Berjalan pendek ketika RSI melintasi batas atas
  4. Berjalan panjang ketika RSI melintasi batas bawah
  5. Menetapkan tingkat mengambil keuntungan dan stop loss
  6. Posisi keluar ketika RSI berbalik atau mengambil keuntungan/stop loss dipukul

Indikator RSI menunjukkan overbought di atas 70 dan oversold di bawah 30 kondisi pasar. Strategi ini memanfaatkan logika klasik ini untuk menentukan entri panjang / pendek berdasarkan nilai RSI terhadap batas yang telah ditetapkan sebelumnya. Parameter yang dapat disesuaikan juga memungkinkan mengoptimalkan batas, stop loss dll untuk adaptasi pasar.

Keuntungan

  • RSI secara efektif mengidentifikasi kondisi pasar yang terlalu banyak dibeli/terlalu banyak dijual
  • RSI memiliki dasar teoritis yang kuat
  • Parameter yang dapat disesuaikan beradaptasi dengan instrumen dan kondisi
  • Keterlambatan pengurangan risiko

Risiko dan Pengurangan

  • Potensi sinyal RSI palsu yang mengarah pada kerugian
  • Membutuhkan optimasi tingkat RSI secara terus menerus
  • Stop dapat sering dipukul selama aksi harga bergolak

Pengurangan:

  1. Faktor tambahan untuk mengkonfirmasi sinyal dan menghindari yang salah
  2. Mengoptimalkan tingkat RSI berdasarkan karakteristik instrumen
  3. Sesuaikan penempatan stop loss untuk mengurangi risiko whipsaw

Peluang Peningkatan

Strategi ini dapat ditingkatkan melalui:

  1. Pembelajaran mesin untuk optimasi tingkat RSI otomatis

  2. Konfirmasi volume untuk menghindari gangguan palsu

  3. Faktor tambahan seperti rata-rata bergerak untuk konfirmasi multi-faktor

  4. Stop adaptatif berdasarkan volatilitas pasar

  5. Analisis volume untuk mengukur arus masuk/arus keluar dana

  6. Menggabungkan dengan strategi yang tidak berkorelasi untuk mengurangi penarikan portofolio

Kesimpulan

Ini adalah strategi reversi rata-rata yang sederhana dan praktis menggunakan RSI untuk deteksi overbought / oversold. Parameter yang dapat disesuaikan memungkinkan adaptasi dengan perubahan pasar. Peningkatan seperti adaptif berhenti, konfirmasi multi-faktor, dan optimasi parameter dapat membuat strategi lebih kuat.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, minval=1, title="Length")

up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Lebih banyak