Indeks Momentum Stochastic dan Strategi Perdagangan Kuantitas Berbasis RSI

Penulis:ChaoZhang, Tanggal: 2023-12-12 15:20:29
Tag:

img

Gambaran umum

Strategi ini terutama didasarkan pada dua indikator - Stochastic Momentum Index (SMI) dan Relative Strength Index (RSI). Ini juga menggabungkan filter warna dan filter tubuh lilin sebagai kondisi penilaian tambahan. Sinyal perdagangan dihasilkan berdasarkan sinyal beli dan jual dari SMI dan RSI, dikombinasikan dengan kondisi filter. Strategi ini dapat secara efektif menemukan peluang perdagangan jangka pendek di pasar.

Logika Strategi

Strategi ini didasarkan pada indikator SMI dan RSI untuk penilaian. SMI terutama menilai apakah saham terlalu banyak dibeli atau terlalu banyak dijual, sementara RSI menentukan kekuatan relatif saham. Ketika kedua indikator memberikan sinyal beli pada saat yang sama, tindakan beli akan dipicu. Logika spesifiknya adalah sebagai berikut:

  1. Ketika SMI oversold (di bawah batas bawah), itu dianggap sebagai sinyal beli
  2. Ketika RSI berada di bawah ambang batas, itu dianggap sebagai sinyal beli
  3. Ketika kedua SMI oversold dan RSI di bawah ambang yang sesuai terjadi, sinyal beli dipicu
  4. Logika sinyal jual mirip

Selain itu, strategi ini memiliki mode sinyal ganda. Mode ini membutuhkan sinyal SMI dan RSI untuk memicu perdagangan. Ini dapat secara efektif mengurangi sinyal palsu.

Selain itu, filter warna dan filter tubuh lilin dimasukkan. Filter ini membutuhkan tubuh lilin yang relatif besar dan lilin terakhir ditutup lebih tinggi daripada terbuka.

Keuntungan

  1. Menggunakan SMI untuk overbought / oversold dan RSI untuk kekuatan relatif, konfirmasi ganda dapat mengurangi sinyal palsu
  2. Mode sinyal ganda dapat sangat mengurangi perdagangan yang tidak efektif
  3. Filter warna dan tubuh dapat menyaring kebocoran palsu secara efektif
  4. Logika strategi sederhana dan bersih
  5. Sebagian besar parameter dapat disesuaikan

Risiko dan Optimalisasi

  1. SMI dan RSI dapat menghasilkan lebih banyak sinyal palsu ketika digunakan sendiri, perlu pemeriksaan yang cermat
  2. Dalam mode sinyal ganda, peluang perdagangan yang baik dapat dilewatkan jika parameter tidak ditetapkan dengan benar
  3. Dapat menguji profitabilitas strategi di bawah parameter periodik yang berbeda untuk menemukan kombinasi parameter yang optimal
  4. Dapat mengevaluasi parameter ambang melalui simulasi atau backtesting
  5. Dapat mempertimbangkan untuk memasukkan lebih banyak filter untuk mengoptimalkan strategi

Ringkasan

Strategi ini mengintegrasikan sinyal dari kedua indikator SMI dan RSI dan menghasilkan pesanan perdagangan melalui konfirmasi ganda. Filter warna dan filter tubuh lilin juga diterapkan untuk menyaring kebocoran palsu. Strategi ini memiliki aliran logika yang sederhana dan bersih, dan sebagian besar parameter dapat disesuaikan. Pengembalian yang lebih baik dapat dicapai dengan menyesuaikan parameter sesuai.


/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
//avgrel = ema(ema(rdiff,b),b)
//avgdiff = ema(ema(diff,b),b)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Lebih banyak