
Strategi goyah dinamik adalah strategi perdagangan kuantitatif yang menggabungkan penunjuk pergerakan rawak dan penunjuk yang agak kuat. Strategi ini menggunakan penunjuk pergerakan rawak untuk menentukan kawasan pasaran yang terlalu banyak dibeli dan dijual, dengan penapis isyarat RSI yang cepat, dan pilihan isyarat perdagangan yang lebih dipercayai melalui penapis entiti.
Indeks dinamik rawak (SMI) adalah petunjuk teknikal yang biasa digunakan dalam perdagangan kuantitatif, yang menggabungkan kelebihan indikator dinamik dan indikator getaran.
Secara khusus, formula untuk mengira SMI ialah:
SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100
Di antaranya, HH adalah harga tertinggi dalam tempoh N hari dan LL adalah harga terendah dalam tempoh N hari.
Dengan cara ini, SMI menggabungkan penghakiman trend momentum dan penghakiman pembalikan gegaran. Apabila SMI lebih tinggi daripada 80, ia adalah overbought, dan jika ia lebih rendah daripada 20, ia adalah oversold. Strategi ini akan menghantar isyarat perdagangan di kawasan overbought dan oversold.
RSI adalah salah satu indikator yang biasa digunakan. Strategi ini menggunakan RSI yang cepat dengan kitaran 7, untuk menilai keadaan jual beli dalam jangka pendek.
Apabila RSI cepat di bawah 20 adalah oversold, di atas 80 adalah overbought. Strategi ini akan menghantar isyarat perdagangan di kawasan overbought dan oversold.
Strategi ini juga menambah penapis entiti, yang menapis sebahagian isyarat dengan mengira saiz entiti K-line. Isyarat perdagangan dikeluarkan hanya apabila entiti K-line melebihi had tertentu.
Ini boleh menyaring beberapa isyarat palsu dan meningkatkan kebolehpercayaan isyarat.
Strategi ini menggabungkan tiga bahagian: indikator dinamik rawak, indikator RSI cepat dan penapis entiti. Dengan gabungan pelbagai indikator, anda dapat meningkatkan ketepatan isyarat dan meningkatkan kestabilan strategi.
Penunjuk pergerakan rawak dan penunjuk RSI cepat dapat menentukan dengan tepat keadaan pasaran yang terlalu banyak dan terlalu banyak, strategi untuk membuka kedudukan di kawasan yang terlalu banyak dan terlalu banyak, mengikuti prinsip perdagangan membeli rendah dan menjual tinggi.
Strategi boleh melakukan perdagangan dua arah, berganda dan kosong, untuk menangkap peluang perdagangan maksimum di pasaran.
Penambahan penapis fizikal, yang boleh menapis sebahagian besar bunyi, mengelakkan kesesakan dalam keadaan gegaran.
Strategi untuk berdagang dua hala, bertukar-tukar dengan banyak kepala kosong adalah risiko yang berpotensi. Logik pembukaan kedudukan yang dioptimumkan dengan betul dapat mengurangkan risiko ini.
Apabila penunjuk memberi isyarat, mungkin akan mengumpulkan sejumlah besar peniaga yang mengikuti dalam masa yang singkat, menyebabkan risiko berbalik pasaran. Risiko ini dapat dikurangkan dengan mengoptimumkan parameter penunjuk.
Dalam keadaan yang melampau, semua model mungkin gagal. Ini memerlukan kawalan risiko sedemikian dengan menetapkan hentian kerugian yang munasabah.
Anda boleh menguji kombinasi parameter yang berbeza, seperti kitaran SMI, kitaran RSI, dan paras penapis entiti, untuk mencari parameter terbaik untuk meningkatkan kadar pulangan strategi.
Membina mekanisme hentian dinamik berdasarkan ATR atau kadar turun naik dapat mengawal risiko individu dan keseluruhan dengan lebih baik.
Memperkenalkan algoritma pembelajaran mesin untuk meramalkan pergerakan masa depan nilai penunjuk melalui model. Ini dapat menentukan titik perubahan penunjuk lebih awal, meningkatkan kebolehpercayaan strategi.
Secara keseluruhannya, strategi ini mengintegrasikan penunjuk pergerakan rawak, penunjuk RSI cepat dan penapis entiti, untuk mencapai satu sistem penilaian yang lebih lengkap. Kombinasi pelbagai penunjuk meningkatkan ketepatan isyarat, perdagangan dua hala dan mekanisme kawalan risiko juga menjadikan strategi lebih seimbang. Dengan terus mengoptimumkan parameter dan model, strategi ini dijangka memperoleh kadar pulangan yang lebih baik.
/*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()