Strategi Indikator Dual Momentum Stochastic

Penulis:ChaoZhang, Tanggal: 2023-10-07 16:45:25
Tag:

Gambaran umum

Strategi ini menggunakan indikator momentum stokastik ganda (SMI dan RSI) untuk sinyal panjang dan pendek, bersama dengan martingale dan filter tubuh untuk pemilihan sinyal perdagangan, yang bertujuan untuk menangkap tren jangka menengah dan fluktuasi harga.

Logika Strategi

Strategi ini menilai panjang dan pendek menggunakan dua indikator stokastik SMI dan RSI. SMI dihitung berdasarkan rata-rata bergerak dari kisaran bar dan harga dekat, baik untuk mengidentifikasi titik pembalikan. RSI membandingkan kekuatan bull dan bear untuk menentukan status overbought dan oversold. Strategi pergi panjang ketika SMI di bawah -50 dan RSI di bawah 20; pergi pendek ketika SMI di atas 50 dan RSI di atas 80.

Untuk menyaring breakout palsu, strategi juga menggunakan 1/3 dari SMA tubuh 10-periode sebagai kondisi filter terobosan.

Selain itu, strategi ini mengadopsi martingale opsional, yang adalah untuk meningkatkan banyak pada kehilangan perdagangan, mencoba untuk memulihkan kerugian sebelumnya.

Fungsi backtest backtest strategi dengan memasukkan rentang tanggal.

Analisis Keuntungan

Strategi ini menggabungkan indikator dan filter stokastik ganda, mampu secara efektif mengidentifikasi titik pembalikan, menangkap tren jangka menengah, dan melacak fluktuasi harga.

  • SMI memiliki kemampuan pengenalan titik pembalikan yang kuat dan dapat menentukan kondisi overbought dan oversold secara efektif.
  • Menambahkan RSI menghindari kehilangan perdagangan.
  • Filter tubuh menghilangkan gangguan palsu dan meningkatkan akurasi sinyal.
  • Strategi martingale opsional memungkinkan untuk memulihkan sebagian dari kerugian.

Analisis Risiko

  • Sebagai indikator yang tertinggal, SMI dan RSI memiliki risiko mengejar puncak dan membunuh terendah.
  • Martingale membawa risiko untuk mempercepat kerugian.
  • Filter dapat menyaring beberapa sinyal yang valid di berbagai pasar.

Risiko dapat dikurangi dengan mengoptimalkan parameter SMI dan RSI untuk menurunkan probabilitas mengejar/membunuh, menggunakan martingale secara strategis dengan mengontrol rasio skala dan waktu, dan memungkinkan filter berdasarkan kondisi pasar.

Arahan Optimasi

  • Mengoptimalkan parameter SMI dan RSI untuk penilaian yang efektif.
  • Sesuaikan parameter filter untuk menurunkan kemungkinan penyaringan sinyal yang valid.
  • Mengoptimalkan waktu dan rasio skala Martingale.
  • Masukkan indikator tren untuk menghindari perdagangan melawan tren.
  • Tambahkan stop loss untuk membatasi kerugian pada perdagangan tunggal.

Ringkasan

Strategi ini menggabungkan indikator stokastik ganda untuk menangkap titik pembalikan, dengan filter dan martingale untuk seleksi dan pengejaran sinyal perdagangan. Ini dapat secara efektif mengidentifikasi tren jangka menengah dan melacak fluktuasi harga, cocok untuk investor yang mengejar tingkat kemenangan yang tinggi. Perhatikan risiko pasar indikator yang tertinggal dan berkisar, mengelola risiko dengan optimasi parameter dan stop loss.


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

Lebih banyak