Strategi Penyaringan Indikator Momentum Stokastik Ganda


Tanggal Pembuatan: 2023-10-07 16:45:25 Akhirnya memodifikasi: 2023-10-07 16:45:25
menyalin: 0 Jumlah klik: 736
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini menggunakan dua indikator dinamika acak (SMI dan RSI) untuk penilaian overhead, ditambah dengan filter Martingale dan fisik untuk memfilter sinyal perdagangan, yang bertujuan untuk menangkap tren garis pendek dan melacak pergerakan harga.

Prinsip Strategi

Strategi ini menggunakan indikator dinamis acak ganda SMI dan RSI untuk menilai overbought. SMI dapat dihitung melalui perbedaan harga entitas K-line dan rata-rata bergerak dari harga closeout, yang dapat secara efektif mengidentifikasi titik balik. RSI dapat ditentukan melalui overbought dan oversold melalui perbandingan volume overbought. Strategi ini melakukan overbought ketika SMI di bawah 50 dan RSI di bawah 20; melakukan overbought ketika SMI di atas 50 dan RSI di atas 80.

Untuk menyaring terobosan palsu, strategi ini juga menggunakan 13 dari garis rata-rata tubuh 10 siklus sebagai kondisi penyaringan terobosan. Ketika entitas menembus 13 dari garis rata-rata, dianggap terobosan efektif.

Selain itu, strategi ini menggunakan strategi Martingale opsional, yaitu menaikkan posisi secara proporsional pada perdagangan yang merugikan, dengan harapan untuk memulihkan kerugian sebelumnya.

Backtest berfungsi untuk mengukur efektivitas strategi dengan memasukkan waktu start dan stop.

Analisis Keunggulan

Strategi ini menggunakan indikator ganda acak dan filter untuk secara efektif mengidentifikasi titik balik, menangkap tren garis pendek, dan melacak pergerakan harga.

  • SMI memiliki kemampuan untuk mengidentifikasi titik balik, yang dapat secara efektif menilai overbought dan oversold
  • RSI ditumpuk untuk menghindari bocor
  • Filter tubuh menghilangkan penembusan palsu, meningkatkan akurasi sinyal
  • Opsional Martingale mengejar strategi, dapat memulihkan sebagian dari kerugian

Analisis risiko

  • SMI dan RSI sebagai indikator yang tertinggal, sinyal yang terlambat ada risiko mengejar naik dan turun
  • Martingale berisiko mempercepat kerugian
  • Dalam pasar yang sangat bergolak, filter akan memfilter beberapa sinyal valid.

Dengan mengoptimalkan parameter SMI dan RSI, Anda dapat mengurangi probabilitas mengejar tinggi dan turun. Menggunakan strategi Martingale yang masuk akal, mengontrol rasio dan frekuensi kenaikan posisi.

Arah optimasi

  • Mengoptimalkan kombinasi parameter SMI dan RSI untuk mendapatkan hasil penentuan terbaik
  • Menyesuaikan parameter filter untuk mengurangi probabilitas sinyal valid filter
  • Optimalkan jumlah dan proporsi penambahan Martingale
  • Menggunakan indikator tren untuk menghindari operasi terbalik
  • Meningkatkan strategi stop loss dan mengendalikan kerugian tunggal

Meringkaskan

Strategi ini menggunakan indikator ganda acak untuk menangkap titik balik, membantu filter dan Martingale untuk memfilter dan menelusuri sinyal perdagangan, dapat secara efektif mengidentifikasi tren garis pendek, melacak pergerakan harga, cocok untuk investor yang mencari keuntungan tinggi.

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