Strategi Penyaringan Penunjuk Momentum Stochastic Berganda


Tarikh penciptaan: 2023-10-07 16:45:25 Akhirnya diubah suai: 2023-10-07 16:45:25
Salin: 0 Bilangan klik: 736
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan dua indikator dinamik rawak ((SMI dan RSI) untuk membuat penilaian kosong, ditambah dengan penyaringan Martingale dan badan untuk memfilter isyarat perdagangan, yang bertujuan untuk menangkap trend garis pendek dan mengesan pergerakan harga.

Prinsip Strategi

Strategi ini menggunakan kedua-dua penunjuk dinamik rawak SMI dan RSI untuk membuat penilaian overbought. SMI dikira melalui perbezaan harga entiti K-baris dan purata bergerak harga penutupan, yang dapat mengenal pasti titik balik dengan berkesan. RSI ditentukan oleh perbandingan overbought dan oversold melalui perbandingan kuantiti overbought.

Untuk menyaring penembusan palsu, strategi ini juga menggunakan 13 daripada garis rata-rata badan 10 kitaran sebagai syarat penyaringan penembusan. Apabila entiti menembusi garis rata-rata 13, penembusan dianggap berkesan.

Selain itu, strategi ini menggunakan pilihan strategi Martingale, iaitu meletakkan kedudukan yang berpatutan pada perdagangan yang rugi, dengan harapan untuk memulihkan kerugian awal.

Backtest berfungsi untuk mengkaji semula kesan strategi dengan memasukkan masa permulaan dan akhir.

Analisis kelebihan

Strategi ini menggunakan penunjuk dan penapis acak ganda yang berkesan untuk mengenal pasti titik-titik perubahan, menangkap trend garis pendek, dan mengesan pergerakan harga.

  • SMI mempunyai kebolehan untuk mengenal pasti titik perubahan, dan dapat menentukan pembelian dan penjualan berlebihan
  • RSI digunakan secara berlapis untuk mengelakkan liputan
  • Penapisan badan untuk menghapuskan gangguan palsu dan meningkatkan ketepatan isyarat
  • Pilihan strategi mengejar Martinegil untuk memulihkan sebahagian kerugian

Analisis risiko

  • SMI dan RSI sebagai penunjuk ketinggalan, tanda kelewatan ada risiko mengejar tinggi dan turun
  • Martingale berisiko mempercepat kerugian
  • Dalam pasaran yang bergolak, penapis akan menapis beberapa isyarat yang sah.

Dengan mengoptimumkan parameter SMI dan RSI, anda boleh mengurangkan kebarangkalian mengejar kenaikan dan penurunan. Menggunakan strategi Martingale yang munasabah, mengawal peratusan dan frekuensi kenaikan.

Arah pengoptimuman

  • Mengoptimumkan kombinasi parameter SMI dan RSI untuk mendapatkan keputusan terbaik
  • Sesuaikan parameter penapis untuk mengurangkan kebarangkalian penapis
  • Mengoptimumkan jumlah dan peratusan penambahan Martingale
  • Mengelakkan operasi terbalik dengan menggunakan indikator trend
  • Meningkatkan strategi penangguhan kerugian dan mengawal kerugian tunggal

ringkaskan

Strategi ini menggabungkan penggunaan indikator acak ganda untuk menangkap titik balik, membantu penapis dan Martingale untuk menyaring dan menjejaki isyarat perdagangan, dapat mengenal pasti trend garis pendek, menjejaki turun naik harga, sesuai untuk pelabur yang mengejar kemenangan tinggi. Apabila menggunakan indikator, perhatikan risiko pasaran yang terlewat dan bergolak, boleh mengawal risiko dengan mengoptimumkan parameter dan menghentikan kerugian.

Kod 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()