Strategi Momentum Stokastik Tiga Kali Lipat


Tanggal Pembuatan: 2024-01-26 12:15:20 Akhirnya memodifikasi: 2024-01-26 12:15:20
menyalin: 2 Jumlah klik: 768
1
fokus pada
1617
Pengikut

Strategi Momentum Stokastik Tiga Kali Lipat

Ringkasan

Triple overlapping random momentum strategi adalah strategi perdagangan garis pendek yang khas. Dengan menghitung tiga indikator random momentum dari tiga pengaturan parameter yang berbeda, dan melakukan beberapa overlapping, sinyal perdagangan dibentuk. Ketika tiga indikator random momentum menunjukkan sinyal overbought atau oversold pada saat yang sama, pembelian atau penjualan dilakukan.

Prinsip Strategi

Indikator inti dari strategi ini adalah Indikator Dynamic Randomization (SMI). Rumus perhitungan indikator SMI adalah sebagai berikut:

SMI = 100 * EMA(EMA(收盘价-最高价和最低价的中点,N1),N2) / 0.5 * EMA(EMA(最高价-最低价,N1),N2)

Di antaranya, N1 dan N2 adalah panjang parameter. Indikator SMI memiliki kisaran nilai antara -100 dan 100. Jika SMI lebih tinggi dari 0 berarti harga tutup berada di bagian atas kisaran harga hari itu, dan jika lebih rendah dari 0 berarti harga tutup berada di bagian bawah kisaran harga.

Sama seperti indikator stok tradisional, indikator SMI dapat menghasilkan sinyal beli ketika melewati garis overbought (seperti 40) dan garis oversold (seperti 40), yang menunjukkan kemungkinan pembentukan sinyal berbalik. Ketika indikator SMI melintasi rata-rata bergerak di atasnya, menghasilkan sinyal beli; Ketika indikator SMI melintasi rata-rata bergerak di bawahnya, menghasilkan sinyal jual.

Strategi ini menggunakan tiga set indikator SMI dengan pengaturan parameter yang berbeda untuk ditumpuk, masing-masing diatur sebagai:

  • SMI1:% K panjang 10 siklus,% K siklus halus 3 siklus
  • SMI2:% K panjang 20 siklus,% K siklus halus 3 siklus
  • SMI3:% K panjang 5 siklus,% K siklus halus 3 siklus

Ketika tiga indikator SMI secara bersamaan menunjukkan overbought atau oversold, sinyal perdagangan dikirim. Ini dapat secara efektif memfilter sinyal palsu dan meningkatkan kualitas sinyal.

Keunggulan Strategis

  • Analisis multi-siklus waktu, penilaian menyeluruh, dan penyaringan kebisingan yang efektif
  • Indikator SMI meningkatkan kemudahan penggunaan Indikator Stoch
  • Menggunakan tiga tumpang tindih, reliabilitas lebih tinggi dari satu indikator
  • Pengaturan parameter fleksibel dan dapat disesuaikan
  • Berlaku untuk transaksi frekuensi rendah

Risiko Strategis

  • Beberapa indikator tumpang tindih, ada keterlambatan tertentu
  • Operasi singkat sering terjadi, biaya transaksi tinggi
  • Risiko pencocokan data
  • Risiko kegagalan parameter setelah perubahan struktur pasar

Langkah-langkah untuk mengurangi risiko:

  • Optimalkan parameter, mengurangi keterlambatan
  • Adaptasi jangka waktu yang tepat untuk mengurangi biaya transaksi
  • Peningkatan tes statistik dan tes kesehatan
  • Parameter penyesuaian dinamis

Optimasi Strategi

  • Uji kombinasi parameter SMI yang berbeda
  • Meningkatkan indikator statistik untuk menilai stabilitas parameter
  • Tergabung dengan indikator tambahan lainnya seperti volume transaksi, BRI dan lain-lain.
  • Parameter switching berdasarkan kondisi pasar yang dinamis
  • Optimalkan strategi stop loss

Meringkaskan

Triple overlay strategi dinamika acak dengan menggunakan tiga set parameter yang berbeda dari indikator SMI, melakukan penilaian yang komprehensif pada beberapa periode waktu, membentuk kualitas tinggi overbought oversold sinyal perdagangan. Dibandingkan dengan indikator tunggal, strategi ini dapat menyaring lebih banyak kebisingan, meningkatkan stabilitas. Langkah selanjutnya dapat dilakukan dengan metode optimasi parameter, pemeriksaan statistik, dan indikator tambahan, dan lain-lain, untuk membuat strategi lebih robust.

Kode Sumber Strategi
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')