Indeks Momentum Stochastic dan Strategi Dagangan Kuantum Berasaskan RSI

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

img

Ringkasan

Strategi ini terutamanya berdasarkan dua penunjuk - Indeks Momentum Stochastic (SMI) dan Indeks Kekuatan Relatif (RSI). Ia juga menggabungkan penapis warna dan penapis badan lilin sebagai keadaan penilaian tambahan. Isyarat perdagangan dihasilkan berdasarkan isyarat beli dan jual dari SMI dan RSI, digabungkan dengan keadaan penapis. Strategi ini dapat dengan berkesan menemui peluang perdagangan jangka pendek di pasaran.

Logika Strategi

Strategi ini bergantung kepada penunjuk SMI dan RSI untuk penghakiman. SMI terutamanya menilai sama ada saham terlalu banyak dibeli atau terlalu banyak dijual, sementara RSI menentukan kekuatan relatif saham. Apabila kedua-dua penunjuk memberikan isyarat beli pada masa yang sama, tindakan beli akan dicetuskan. Logik khusus adalah sebagai berikut:

  1. Apabila SMI terlalu dijual (di bawah had bawah), ia dianggap sebagai isyarat beli
  2. Apabila RSI di bawah ambang, ia dianggap sebagai isyarat beli
  3. Apabila kedua-dua SMI oversold dan RSI di bawah ambang yang sepadan berlaku, isyarat beli dicetuskan
  4. Logik isyarat jual adalah sama

Di samping itu, strategi ini mempunyai mod isyarat berganda. mod ini memerlukan kedua-dua isyarat SMI dan RSI untuk mencetuskan sebarang perdagangan. ini dapat mengurangkan isyarat palsu dengan berkesan.

Di samping itu, penapis warna dan penapis badan lilin dimasukkan. Penapis ini memerlukan badan lilin yang agak besar dan lilin terakhir ditutup lebih tinggi daripada terbuka. Ini dapat mengelakkan perdagangan pecah palsu.

Kelebihan

  1. Menggunakan SMI untuk overbought / oversold dan RSI untuk kekuatan relatif, pengesahan berganda boleh mengurangkan isyarat palsu
  2. Mod isyarat berganda boleh mengurangkan perdagangan yang tidak berkesan
  3. Warna dan penapis badan boleh menyaring breakouts palsu dengan berkesan
  4. Logik strategi adalah mudah dan bersih
  5. Kebanyakan parameter boleh disesuaikan

Risiko dan Pengoptimuman

  1. SMI dan RSI boleh menghasilkan lebih banyak isyarat palsu apabila digunakan bersendirian, memerlukan pemeriksaan yang teliti
  2. Dalam mod isyarat berganda, peluang perdagangan yang baik boleh terlepas jika parameter tidak ditetapkan dengan betul
  3. Boleh menguji keuntungan strategi di bawah parameter berkala yang berbeza untuk mencari kombinasi parameter yang optimum
  4. Boleh menilai parameter ambang melalui simulasi atau backtesting
  5. Boleh mempertimbangkan untuk menggabungkan lebih banyak penapis untuk mengoptimumkan strategi

Ringkasan

Strategi ini mengintegrasikan isyarat dari kedua-dua penunjuk SMI dan RSI dan menjana pesanan dagangan melalui pengesahan berganda. Penapis warna dan penapis badan lilin juga dilaksanakan untuk menyaring pecah palsu. Strategi ini mempunyai aliran logik yang mudah dan bersih, dan kebanyakan parameter dapat disesuaikan. Pengembalian yang lebih baik dapat dicapai dengan menyesuaikan parameter dengan sewajarnya.


/*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 lanjut