Strategi Indikator Dua Momentum Stochastic

Penulis:ChaoZhang, Tarikh: 2023-10-07 16:45:25
Tag:

Ringkasan

Strategi ini menggunakan penunjuk momentum stokastik berganda (SMI dan RSI) untuk isyarat panjang dan pendek, bersama dengan martingale dan penapis badan untuk pemilihan isyarat perdagangan, bertujuan untuk menangkap trend jangka menengah dan turun naik harga.

Logika Strategi

Strategi ini menilai panjang dan pendek menggunakan dua penunjuk stokastik SMI dan RSI. SMI dikira berdasarkan purata bergerak julat bar dan harga dekat, baik dalam mengenal pasti titik pembalikan. RSI membandingkan kekuatan bull dan bear untuk menentukan status overbought dan oversold. Strategi pergi panjang apabila SMI di bawah -50 dan RSI di bawah 20; pergi pendek apabila SMI di atas 50 dan RSI di atas 80.

Untuk menapis pecah palsu, strategi juga menggunakan 1/3 dari SMA badan 10 tempoh sebagai keadaan penapis terobosan.

Di samping itu, strategi ini menggunakan martingale pilihan, iaitu untuk meningkatkan banyak perdagangan yang rugi, cuba memulihkan kerugian sebelumnya.

Fungsi Backtest menguji semula strategi dengan memasukkan julat tarikh.

Analisis Kelebihan

Strategi ini menggabungkan penunjuk dan penapis stokastik berganda, yang dapat mengenal pasti titik pembalikan dengan berkesan, menangkap trend jangka menengah, dan mengesan turun naik harga.

  • SMI mempunyai keupayaan pengenalan titik pembalikan yang kuat dan dapat menentukan keadaan overbought dan oversold dengan berkesan.
  • Menambah RSI mengelakkan perdagangan yang hilang.
  • Penapis badan menghapuskan kebocoran palsu dan meningkatkan ketepatan isyarat.
  • Strategi martingale pilihan membolehkan pemulihan sebahagian daripada kerugian.

Analisis Risiko

  • Sebagai penunjuk yang tertinggal, SMI dan RSI mempunyai risiko mengejar tinggi dan membunuh rendah.
  • Martingale membawa risiko untuk mempercepatkan kerugian.
  • Penapis mungkin menapis beberapa isyarat yang sah di pasaran yang berbeza.

Risiko boleh dikurangkan dengan mengoptimumkan parameter SMI dan RSI untuk mengurangkan kebarangkalian mengejar / membunuh, menggunakan martingale secara strategik dengan mengawal nisbah skala dan masa, dan membolehkan penapis berdasarkan keadaan pasaran.

Arahan pengoptimuman

  • Mengoptimumkan parameter SMI dan RSI untuk penilaian yang paling berkesan.
  • Sesuaikan parameter penapis untuk mengurangkan kebarangkalian penapis isyarat yang sah.
  • Mengoptimumkan masa dan nisbah skala martingale.
  • Sertakan penunjuk trend untuk mengelakkan perdagangan terhadap trend.
  • Tambah stop loss untuk mengehadkan kerugian pada perdagangan tunggal.

Ringkasan

Strategi ini menggabungkan penunjuk stokastik berganda untuk menangkap titik pembalikan, dengan penapis dan martingale untuk pemilihan isyarat perdagangan dan mengejar. Ia dapat mengenal pasti dengan berkesan trend jangka menengah dan melacak turun naik harga, sesuai untuk pelabur yang mengejar kadar kemenangan yang tinggi. Perhatikan risiko pasaran penunjuk yang tertinggal dan berkisar, menguruskan risiko dengan pengoptimuman parameter dan stop loss.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title = "CS Basic Scripts - Stochastic Special (Strategy)", shorttitle = "Stochastic Special", 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")

//Backtesting Input Range
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 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > 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()

Lebih lanjut