Strategi kuantitatif gabungan dinamik sokongan dan rintangan RSI dan Bollinger Bands


Tarikh penciptaan: 2024-01-24 15:19:22 Akhirnya diubah suai: 2024-01-24 15:19:22
Salin: 1 Bilangan klik: 709
1
fokus pada
1617
Pengikut

Strategi kuantitatif gabungan dinamik sokongan dan rintangan RSI dan Bollinger Bands

Gambaran keseluruhan

Strategi ini menggunakan indikator RSI untuk menentukan pasaran overbought dan oversold, digabungkan dengan Bollinger Bands untuk menentukan ruang pergerakan harga. Di samping itu, berdasarkan pada titik rendah yang tinggi, ia menghasilkan rintangan sokongan dinamik, dan hanya melakukan pembelian dan penjualan apabila harga mendekati rintangan sokongan. Pengguna boleh menetapkan sendiri syarat penapis trend, seperti garis lurus bergerak sederhana untuk menentukan harga dan arah trend.

Prinsip Strategi

Strategi ini terdiri daripada 3 bahagian utama iaitu RSI, Boll band, dan rintangan sokongan dinamik.

Bahagian RSI digunakan untuk menilai overbought oversold. Apabila RSI di bawah 30 adalah kawasan oversold, maka isyarat beli akan dikeluarkan. Apabila RSI di atas 70 adalah kawasan oversold, maka isyarat jual akan dikeluarkan.

Beringkas adalah naik turun harga berdasarkan garis purata harga dan perbezaan piawai yang digunakan untuk menentukan sama ada harga keluar dari rantaian goyah normal. Harga dijual apabila mendekati naik turun, dan dibeli apabila mendekati turun.

Bahagian rintangan sokongan menggunakan kaedah pengiraan dinamik, dengan harga terendah tertinggi dalam tempoh tertentu (atau harga penutupan pembukaan) sebagai asas, membatasi julat dalam peratusan tertentu, dan merekodkan titik perubahan sejarah harga sebagai titik rintangan sokongan utama. Apabila harga naik ke titik rintangan utama, isyarat jual dikeluarkan; Apabila harga jatuh ke titik sokongan utama, isyarat beli dikeluarkan.

Secara keseluruhannya, strategi ini akan melaksanakan operasi beli-belah apabila RSI memenuhi tiga syarat sekaligus: membeli-belah, menjual-belah, harga keluar dari julat normal, dan berhampiran dengan rintangan sokongan dinamik.

Kelebihan Strategik

  1. Penunjuk asas digabungkan dengan penunjuk teknikal. Apabila RSI menilai asas overbought dan oversold, menggunakan Brinband untuk menentukan bentuk teknikal harga.

  2. Pengiraan rintangan sokongan dinamik, lebih dekat dengan rintangan sokongan sebenar pergerakan harga.

  3. Pengguna boleh menambah penapis trend, bekerjasama dengan RSI dan Brinband, meningkatkan kefahaman, dan menyaring sebahagian besar isyarat bising.

Risiko Strategik

  1. Penetapan parameter RSI yang tidak betul boleh menyebabkan kesalahan penghakiman. Panjang RSI yang terlalu pendek akan menambah kebisingan; RSI melebihi nilai terhad yang lebih tinggi daripada nilai terhad yang lebih rendah.

  2. Parameter Brin seperti panjang, StdDev, dan perkalian StdDev yang tidak betul juga boleh menjejaskan ketepatan penilaian.

  3. Dinamika sokongan dan rintangan yang terlewat disebabkan oleh pengiraan tahap tinggi dan rendah sejarah. Pengguna harus mengoptimumkan parameter sokongan dan rintangan dengan sewajarnya agar tahap sokongan dan rintangan lebih dekat dengan harga semasa.

  4. Strategi ini lebih rumit, kombinasi pelbagai penunjuk boleh menyebabkan gangguan antara satu sama lain. Pengguna harus menguji parameter penunjuk, mengurangkan konflik penunjuk. Selain itu, syarat kombinasi dapat disederhanakan dengan sewajarnya, mengurangkan kemungkinan kesalahan penilaian.

Arah pengoptimuman strategi

  1. Uji tetapan parameter RSI, optimumkan panjang RSI, dan lebih beli daripada lebihan jual.

  2. Uji tetapan parameter pita Brin, optimumkan panjang pita Brin, kali StdDev.

  3. Mengoptimumkan parameter sokongan dan rintangan dinamik, menjadikan tahap sokongan dan rintangan lebih dekat dengan harga. Anda boleh mencuba lebih pendek, lebih sedikit masa tinggi dan rendah.

  4. Menambah atau menguji penunjuk lain seperti KDJ, MACD dan lain-lain dalam kombinasi dengan RSI untuk meningkatkan ketepatan penilaian.

  5. Uji parameter penapis trend, mengoptimumkan panjang penapis, meningkatkan masa pegangan, mengurangkan operasi pembalikan yang tidak perlu.

ringkaskan

Strategi ini menggunakan pelbagai indikator seperti RSI, Brinband, dan Resistance Support, untuk memanfaatkan kelebihan masing-masing, saling mengesahkan, dan mempunyai penilaian yang kuat. Anda juga boleh menambahkan penapis trend untuk mengurangkan kebisingan lebih lanjut.

Kod sumber strategi
/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("RSI + BB + S/R Strategy with Trend Filter", shorttitle="RSI + BB + S/R + Trend Filter", overlay=true)

// RSI Settings
rsi_length = input.int(14, title="RSI Length")
overbought = input.int(70, title="Overbought Level")
oversold = input.int(30, title="Oversold Level")

// Bollinger Bands Settings
bb_length = input.int(20, title="BB Length")
bb_deviation = input.float(2.0, title="BB Deviation")

// Dynamic Support/Resistance Settings
pivot_period = input.int(10, title="Pivot Period")
pivot_source = input.string("High/Low", title="Pivot Source", options=["High/Low", "Close/Open"])
max_pivots = input.int(20, title="Maximum Number of Pivot", minval=5, maxval=100)
channel_width = input.int(10, title="Maximum Channel Width %", minval=1)
max_sr_levels = input.int(5, title="Maximum Number of S/R Levels", minval=1, maxval=10)
min_strength = input.int(2, title="Minimum Strength", minval=1, maxval=10)

// Trend Filter Settings
use_trend_filter = input.bool(false, title="Use Trend Filter")
trend_filter_length = input.int(50, title="Trend Filter Length")

// Calculate RSI and Bollinger Bands
rsi = ta.rsi(close, rsi_length)
basis = ta.sma(close, bb_length)
deviation = ta.stdev(close, bb_length)
upper_band = basis + bb_deviation * deviation
lower_band = basis - bb_deviation * deviation

// Plot Bollinger Bands on the chart
plot(upper_band, color=color.blue, title="Upper Bollinger Band")
plot(lower_band, color=color.red, title="Lower Bollinger Band")

// Dynamic Support/Resistance Calculation
float src1 = pivot_source == "High/Low" ? high : math.max(close, open)
float src2 = pivot_source == "High/Low" ? low : math.min(close, open)
float ph = ta.pivothigh(src1, pivot_period, pivot_period)
float pl = ta.pivotlow(src2, pivot_period, pivot_period)


// Calculate maximum S/R channel zone width
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * channel_width / 100

var pivotvals = array.new_float(0)

if ph or pl
    array.unshift(pivotvals, ph ? ph : pl)
    if array.size(pivotvals) > max_pivots
        array.pop(pivotvals)

get_sr_vals(ind) =>
    float lo = array.get(pivotvals, ind)
    float hi = lo
    int numpp = 0
    for y = 0 to array.size(pivotvals) - 1 by 1
        float cpp = array.get(pivotvals, y)
        float wdth = cpp <= lo ? hi - cpp : cpp - lo
        if wdth <= cwidth
            if cpp <= hi
                lo := math.min(lo, cpp)
            else
                hi := math.max(hi, cpp)
            numpp += 1
    [hi, lo, numpp]

var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)

find_loc(strength) =>
    ret = array.size(sr_strength)
    for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
        if strength <= array.get(sr_strength, i)
            break
        ret := i
    ret

check_sr(hi, lo, strength) =>
    ret = true
    for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
            if strength >= array.get(sr_strength, i)
                array.remove(sr_strength, i)
                array.remove(sr_up_level, i)
                array.remove(sr_dn_level, i)
            else
                ret := false
            break
    ret

if ph or pl
    array.clear(sr_up_level)
    array.clear(sr_dn_level)
    array.clear(sr_strength)
    for x = 0 to array.size(pivotvals) - 1 by 1
        [hi, lo, strength] = get_sr_vals(x)
        if check_sr(hi, lo, strength)
            loc = find_loc(strength)
            if loc < max_sr_levels and strength >= min_strength
                array.insert(sr_strength, loc, strength)
                array.insert(sr_up_level, loc, hi)
                array.insert(sr_dn_level, loc, lo)
                if array.size(sr_strength) > max_sr_levels
                    array.pop(sr_strength)
                    array.pop(sr_up_level)
                    array.pop(sr_dn_level)

// Calculate the Trend Filter
trend_filter = use_trend_filter ? ta.sma(close, trend_filter_length) : close

// Buy Condition (RSI + Proximity to Support + Trend Filter)
buy_condition = ta.crossover(rsi, oversold) and close <= ta.highest(high, max_sr_levels) and close >= ta.lowest(low, max_sr_levels) and (not use_trend_filter or close > trend_filter)

// Sell Condition (RSI + Proximity to Resistance + Trend Filter)
sell_condition = ta.crossunder(rsi, overbought) and close >= ta.lowest(low, max_sr_levels) and close <= ta.highest(high, max_sr_levels) and (not use_trend_filter or close < trend_filter)

// Strategy Orders
strategy.entry("Buy", strategy.long, when = buy_condition)
strategy.entry("Sell", strategy.short, when = sell_condition)