Strategi Momentum Stochastic

Penulis:ChaoZhang, Tanggal: 2024-01-22 10:13:23
Tag:

img

Gambaran umum

Strategi Momentum Stochastic adalah strategi perdagangan kuantitatif yang menggabungkan Indeks Momentum Stochastic (SMI) dan Indeks Kekuatan Relatif (RSI).

Prinsip Strategi

Indeks Momentum Stochastic

Stochastic Momentum Index (SMI) adalah indikator teknis umum yang digunakan dalam perdagangan kuantitatif yang menggabungkan kekuatan indikator momentum dan osilasi.

Secara khusus, SMI dihitung sebagai:

SMI = (Dekat - (HH + LL) /2)/(0.5*(HH - LL)) * 100

dimana HH adalah harga tertinggi selama N hari terakhir, dan LL adalah harga terendah.

Jadi SMI menggabungkan kedua penilaian momentum tren-mengikuti dan penilaian pembalikan osilasi. Nilai di atas 80 dianggap overbought, sementara nilai di bawah 20 dianggap oversold. Strategi menghasilkan sinyal perdagangan ketika SMI mencapai tingkat overbought atau oversold ini.

RSI cepat

Indeks Kekuatan Relatif (RSI) adalah indikator standar overbought/oversold. Strategi ini menggunakan RSI cepat dengan periode 7 untuk menilai kondisi overbought/oversold jangka pendek.

Pembacaan di bawah 20 dianggap oversold, sementara yang di atas 80 dianggap overbought menurut RSI cepat. Sinyal dihasilkan ketika ambang batas ini dilanggar.

Filter tubuh

Strategi ini juga menerapkan filter tubuh dengan memeriksa ukuran tubuh candlestick untuk menyaring sinyal tertentu.

Hal ini menyaring beberapa sinyal palsu dan meningkatkan keandalan.

Keuntungan

Kombinasi Multi-Indikator

Pendekatan ini menggabungkan SMI, RSI cepat, dan filter tubuh menjadi sistem 3 bagian yang kuat.

Deteksi Overbought/Oversold

Kedua SMI dan RSI cepat sangat baik untuk mendeteksi tren habis. Dengan memperdagangkan pembalikan rata-rata dari area yang terlalu luas ini, strategi mematuhi membeli rendah dan menjual tinggi.

Perdagangan Dua Cara

Kemampuan untuk membeli penurunan dan kenaikan pendek memaksimalkan peluang di semua kondisi pasar.

Pengendalian Risiko

Filter tubuh menghindari whipsaws dengan menolak sinyal-konveksi rendah dalam kondisi bergoyang.

Risiko

Whipsaws

Sering beralih panjang / pendek membawa risiko whipsaw. mengoptimalkan logika bisa meminimalkan ini.

Perdagangan yang Banyak Orang

Sinyal dapat mengelompokkan peserta pasar dan mendorong pembalikan cepat setelah masuk.

Angsa Hitam

Kejadian ekstrem dapat mengubah semua model. Stop loss cerdas diperlukan untuk mengendalikan risiko sistematis.

Peningkatan

Optimasi Parameter

Pengujian periode SMI/RSI yang berbeda dan ambang batas filter tubuh dapat mengungkap nilai optimal untuk pengembalian yang lebih tinggi.

Perhentian Dinamis

Memasukkan volatilitas berbasis atau ATR berhenti akan lebih baik mengandung risiko posisi dan portofolio.

Pembelajaran Mesin

Model yang memprediksi tingkat indikator masa depan dapat mengidentifikasi titik balik lebih awal.

Kesimpulan

Singkatnya, dengan mengintegrasikan SMI, RSI cepat, dan filter tubuh, strategi ini telah menciptakan sistem overbought / oversold yang cukup komprehensif. Pendekatan multi-sinyal meningkatkan akurasi, sementara kemampuan perdagangan dua arah dan pengendalian risiko berkontribusi pada keseimbangan.


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

Lebih banyak