Strategi RSI Berkorelasi Momentum


Tarikh penciptaan: 2023-10-07 15:47:42 Akhirnya diubah suai: 2023-10-07 15:47:42
Salin: 0 Bilangan klik: 751
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Idea utama strategi ini adalah untuk menjadikan kitaran perapisan RSI menjadi dinamik, menyesuaikan diri secara automatik mengikut hubungan antara harga dan momentum, dan dengan itu meningkatkan kegunaan RSI.

Prinsip Strategi

Strategi ini pertama-tama mengira pergerakan harga, dan kemudian mengira faktor perkaitan antara harga dan pergerakan. Apabila faktor perkaitan mendekati 1, harga dan pergerakan sangat berkait positif; apabila faktor perkaitan mendekati -1, harga dan pergerakan sangat berkait negatif.

Panjang kitaran halus RSI boleh disesuaikan mengikut hubungan harga dan momentum. Apabila hubungan tinggi, gunakan kitaran RSI yang lebih pendek; Apabila hubungan rendah, gunakan kitaran RSI yang lebih lama.

Khususnya, strategi ini menetapkan panjang kitaran RSI sebagai julat, secara lalai 20-50. Setelah mengira faktor berkaitan harga dan momentum, pemetaan faktor berkaitan ke dalam julat 20-50 sebagai panjang kitaran penyelesaian akhir RSI melalui kaedah pemetaan linear.

Ini membolehkan parameter RSI disesuaikan secara automatik mengikut keadaan pasaran, menggunakan RSI yang lebih pendek apabila perubahan harga dan perubahan momentum sangat berkaitan, menjadikannya lebih sensitif; apabila korelasi tidak kuat, menggunakan RSI yang lebih lama untuk mengurangkan kesan bunyi pada isyarat.

Analisis kelebihan

  • Parameter penyesuaian dinamik untuk menyesuaikan diri dengan perubahan pasaran
  • Mengelakkan keterbatasan penggunaan penunjuk kitaran tetap
  • Pengoptimuman automatik kitaran pelurus, tanpa perlu memilih parameter terbaik secara manual
  • Julat kitaran RSI yang boleh dikonfigurasi untuk pelbagai jenis

Analisis risiko

  • Perhitungan hubungan itu sendiri membawa kepada ketinggalan dan mungkin kehilangan titik perubahan harga.
  • Terlalu fokus pada harga dan momentum dan mengabaikan faktor lain
  • Julat kitaran RSI lalai mungkin tidak sesuai untuk semua jenis dan memerlukan pengoptimuman
  • Pertimbangan untuk menyesuaikan kitaran RSI dengan faktor lain seperti kadar turun naik

Arah pengoptimuman

  • Cuba kaedah pengiraan yang berbeza untuk mengurangkan ketinggalan
  • Pertimbangkan untuk memasukkan lebih banyak faktor untuk menentukan kitaran RSI daripada hanya bergantung pada hubungan
  • Melakukan pengesanan semula pada pelbagai jenis untuk mencari julat kitaran RSI lalai yang terbaik
  • Anda boleh menetapkan berat faktor relevansi dan tidak bergantung sepenuhnya pada pemetaan linear
  • Penambahan syarat penapis untuk mengelakkan penggunaan kitaran RSI yang tidak sesuai dalam keadaan pasaran tertentu

ringkaskan

Strategi ini adalah idea yang patut dipelajari dengan menyesuaikan secara dinamik kitaran kelancaran RSI, tetapi terdapat banyak ruang untuk penambahbaikan. Kuncinya adalah untuk mencari faktor penentu yang mempengaruhi pilihan parameter RSI dan menterjemahkannya menjadi penunjuk yang boleh diukur.

Kod sumber strategi
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")