Strategi Momentum Stochastic adalah strategi perdagangan kuantitatif yang menggabungkan Indeks Momentum Stochastic (SMI) dan Indeks Kekuatan Relatif (RSI). Ia menggunakan SMI untuk mengenal pasti kawasan overbought dan oversold di pasaran, dengan RSI cepat bertindak sebagai penapis isyarat. Ia juga melaksanakan penapis badan untuk pemilihan isyarat yang lebih boleh dipercayai.
Indeks Momentum Stochastic (SMI) adalah penunjuk teknikal biasa yang digunakan dalam perdagangan kuantitatif yang menggabungkan kekuatan penunjuk momentum dan osilasi.
Khususnya, SMI dikira sebagai:
SMI = (dekat - (HH + LL) /2)/(0.5*(HH - LL)) * 100
di mana HH adalah harga tertinggi selama N hari yang lalu, dan LL adalah harga terendah.
Oleh itu, SMI menggabungkan kedua-dua penghakiman momentum trend dan penghakiman pembalikan osilasi. Nilai di atas 80 dianggap terlalu banyak dibeli, sementara nilai di bawah 20 dianggap terlalu banyak dijual. Strategi ini menghasilkan isyarat perdagangan apabila SMI mencapai tahap terlalu banyak dibeli atau terlalu banyak dijual ini.
Indeks Kekuatan Relatif (RSI) adalah penunjuk overbought/oversold standard. Strategi ini menggunakan RSI cepat dengan tempoh 7 untuk menilai keadaan overbought/oversold jangka pendek.
Bacaan di bawah 20 dianggap terlalu banyak dijual, sementara yang di atas 80 dianggap terlalu banyak dibeli mengikut RSI cepat. Isyarat dihasilkan apabila ambang ini dilanggar.
Strategi ini juga melaksanakan penapis badan dengan memeriksa saiz badan candlestick untuk menapis isyarat tertentu.
Ini menapis beberapa isyarat palsu dan meningkatkan kebolehpercayaan.
Pendekatan ini menggabungkan SMI, RSI pantas, dan penapis badan ke dalam sistem 3 bahagian yang kukuh.
Kedua-dua SMI dan RSI cepat sangat baik untuk mengesan trend yang habis. Dengan berdagang pembalikan purata dari kawasan yang terlalu meluas ini, strategi mematuhi membeli rendah dan menjual tinggi.
Keupayaan untuk membeli kedua-dua penurunan dan perhimpunan pendek memaksimumkan peluang di seluruh keadaan pasaran.
Penapis badan mengelakkan whipsaws dengan menolak isyarat keyakinan rendah dalam keadaan berbelit-belit.
Sering beralih panjang / pendek membawa risiko whipsaw. mengoptimumkan logik boleh mengurangkan ini.
Isyarat boleh mengelompokkan peserta pasaran dan memacu pembalikan cepat semasa masuk.
Kejadian melampau boleh mengubah semua model. Stop loss pintar diperlukan untuk mengawal risiko sistematik.
Ujian tempoh SMI/RSI yang berbeza dan ambang penapis badan boleh mendedahkan nilai optimum untuk pulangan yang lebih tinggi.
Memasukkan hentian berdasarkan turun naik atau ATR akan lebih baik mengandungi risiko kedudukan dan portfolio.
Model yang meramalkan tahap penunjuk masa depan boleh mengenal pasti titik perubahan lebih awal.
Ringkasnya, dengan mengintegrasikan SMI, RSI cepat, dan penapis badan, strategi ini telah mewujudkan sistem overbought / oversold yang cukup komprehensif. Pendekatan pelbagai isyarat meningkatkan ketepatan, sementara keupayaan perdagangan dua hala dan kawalan risiko menyumbang kepada keseimbangan. Dengan pengoptimuman parameter dan model yang berterusan, ia menunjukkan janji untuk menangkap keuntungan dalam jangka panjang.
/*backtest start: 2023-12-22 00:00:00 end: 2024-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", 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") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, 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), 7) fastdown = rma(-min(change(close), 0), 7) 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) 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(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMIsignal < -1 * limit and close < open and body and usesmi dn1 = SMIsignal > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //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] if up1 or up2 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))) if dn1 or dn2 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()