Strategi kuantitatif berdasarkan Indeks Momentum Stokastik dan RSI


Tanggal Pembuatan: 2023-12-12 15:20:29 Akhirnya memodifikasi: 2023-12-12 15:20:29
menyalin: 0 Jumlah klik: 1174
1
fokus pada
1621
Pengikut

Strategi kuantitatif berdasarkan Indeks Momentum Stokastik dan RSI

Ringkasan

Strategi ini didasarkan pada Stochastic Momentum Index (SMI) dan Relative Strength Index (RSI). Selain itu, filter warna dan filter entitas K-line ditambahkan sebagai kriteria penilaian tambahan.

Prinsip Strategi

Inti dari strategi ini adalah dua indikator SMI dan RSI untuk menilai. Di mana SMI terutama menilai apakah saham telah terbeli atau terjual, dan RSI menilai kekuatan relatif saham.

  1. SMI oversold (di bawah batas bawah), dianggap sebagai sinyal beli
  2. RSI di bawah titik terendah adalah sinyal untuk membeli
  3. SMI memberi sinyal beli ketika oversold dan RSI pada saat yang sama berada di bawah titik terendah yang sesuai
  4. Logika penghakiman sinyal kosong mirip

Selain itu, strategi ini juga mengatur mode sinyal ganda. Mode ini mengharuskan SMI dan RSI untuk mengirim sinyal pada saat yang sama untuk berdagang. Ini dapat secara efektif mengurangi sinyal palsu.

Selain itu, strategi ini juga menambahkan filter warna dan filter entitas K-line. Kedua filter ini memerlukan entitas K-line yang lebih besar, dan harga penutupan K-line terakhir lebih tinggi dari harga bukaan. Ini dapat lebih menghindari perdagangan palsu.

Keunggulan Strategis

  1. Dengan menggunakan SMI untuk menilai apakah ada overbought atau oversold, penilaian RSI relatif kuat, double confirmation dapat mengurangi sinyal palsu
  2. Mengatur mode sinyal ganda, dapat mengurangi perdagangan yang tidak valid secara signifikan
  3. Filter warna dan filter entitas K-line dapat secara efektif menyaring penembusan palsu
  4. Strategi berjalan dengan logika yang jelas dan sederhana
  5. Sebagian besar parameter dapat disesuaikan

Risiko dan Optimalisasi Strategi

  1. SMI dan RSI dapat menghasilkan lebih banyak sinyal palsu ketika digunakan sebagai indikator terpisah, dan harus diperhatikan dengan hati-hati.
  2. Dalam mode sinyal ganda, peluang perdagangan yang lebih baik dapat dilewatkan jika parameter tidak disetel dengan benar
  3. Dapat menguji hasil strategi di bawah parameter siklus yang berbeda untuk menemukan kombinasi parameter terbaik
  4. Pengaturan untuk parameter threshold tertentu yang dapat dievaluasi melalui simulasi atau retrospeksi
  5. Strategi pengoptimalan filter yang dapat dipertimbangkan

Meringkaskan

Strategi ini mengintegrasikan sinyal dari kedua indikator SMI dan RSI, dan mengeluarkan instruksi perdagangan melalui konfirmasi ganda. Filter warna dan filter entitas K-line dapat disaring untuk memfilter terobosan palsu. Strategi ini berjalan dengan logika yang sederhana dan jelas, dan sebagian besar parameter dapat disesuaikan.

Kode Sumber Strategi
/*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()