Chiến lược định lượng kết hợp động lực hỗ trợ và kháng cự của RSI và Bollinger Bands


Ngày tạo: 2024-01-24 15:19:22 sửa đổi lần cuối: 2024-01-24 15:19:22
sao chép: 1 Số nhấp chuột: 377
1
tập trung vào
1166
Người theo dõi

Chiến lược định lượng kết hợp động lực hỗ trợ và kháng cự của RSI và Bollinger Bands

Tổng quan

Chiến lược này sử dụng chỉ số RSI để đánh giá thị trường quá mua quá bán đồng thời kết hợp với Bollinger Bands xuống đường để đánh giá phạm vi biến động giá. Ngoài ra, dựa trên các điểm thấp cao tạo ra động hỗ trợ kháng cự, phát hiện giá gần hỗ trợ kháng cự khi thực hiện mua bán. Người dùng có thể tự thiết lập các điều kiện lọc xu hướng, chẳng hạn như đơn giản di chuyển đường trung bình đánh giá giá cả và xu hướng phù hợp với xu hướng. Chiến lược này tích hợp sử dụng nhiều chỉ số kỹ thuật, có khả năng phán đoán mạnh mẽ, có thể nắm bắt cơ hội thị trường hiệu quả.

Nguyên tắc chiến lược

Chiến lược này bao gồm 3 phần: chỉ số RSI, Brinbands và Động lực hỗ trợ kháng cự.

Phần RSI được sử dụng để đánh giá quá mua quá bán. RSI thấp hơn 30 là khu vực quá bán, tại thời điểm này sẽ phát ra tín hiệu mua. RSI cao hơn 70 là khu vực quá bán, tại thời điểm này sẽ phát ra tín hiệu bán.

Băng Brin là đường lên xuống dựa trên đường trung bình và chênh lệch tiêu chuẩn của giá, được sử dụng để xác định liệu giá có rời khỏi vùng dao động bình thường hay không. Giá bán khi gần đường lên và mua khi gần đường xuống.

Phần hỗ trợ kháng cự sử dụng phương pháp tính toán động, lấy giá thấp nhất (hoặc giá mở cửa) trong một chu kỳ nhất định làm cơ sở, giới hạn phạm vi trong một tỷ lệ phần trăm nhất định, và ghi lại điểm đảo ngược lịch sử của giá như là ngưỡng hỗ trợ kháng cự quan trọng. Khi giá tăng gần ngưỡng hỗ trợ quan trọng, phát đi tín hiệu bán; Khi giá giảm xuống ngưỡng hỗ trợ quan trọng, phát đi tín hiệu mua.

Tóm lại, chiến lược này sẽ thực hiện giao dịch mua bán khi đồng thời đáp ứng 3 điều kiện RSI: mua quá mức, giá thoát khỏi phạm vi bình thường và gần mức kháng cự hỗ trợ động.

Lợi thế chiến lược

  1. Chỉ số cơ bản kết hợp với chỉ số kỹ thuật. RSI đánh giá cơ bản mua quá mức và bán quá mức, đồng thời sử dụng Brin để đánh giá hình thức kỹ thuật giá.

  2. Tính năng tính toán kháng cự hỗ trợ động, gần hơn với kháng cự hỗ trợ thực tế của chuyển động giá.

  3. Người dùng có thể thêm bộ lọc xu hướng, kết hợp với RSI và băng tần Brin, cải thiện khả năng phán đoán đáng kể, có thể lọc hầu hết các tín hiệu nhiễu.

Rủi ro chiến lược

  1. RSI được thiết lập không chính xác có thể gây ra sai lầm. RSI quá ngắn sẽ làm tăng tiếng ồn; RSI quá mua quá bán được thiết lập không chính xác có thể gây ra lỗi.

  2. Các tham số của Brin như chiều dài, StdDev nhân không được thiết lập đúng cũng ảnh hưởng đến độ chính xác của phán đoán.

  3. Động lực hỗ trợ và kháng cự bị trì trệ do tính toán các điểm cao và thấp lịch sử. Người dùng nên tối ưu hóa các tham số hỗ trợ và kháng cự một cách thích hợp để mức hỗ trợ và kháng cự gần hơn với giá hiện tại.

  4. Chiến lược này phức tạp hơn, nhiều kết hợp chỉ số có thể gây nhiễu lẫn nhau. Người dùng nên kiểm tra các tham số chỉ số, giảm xung đột chỉ số. Ngoài ra, điều kiện kết hợp có thể được đơn giản hóa thích hợp, giảm khả năng phán đoán sai.

Hướng tối ưu hóa chiến lược

  1. Kiểm tra các thiết lập tham số RSI, tối ưu hóa độ dài RSI, vượt quá ngưỡng mua và bán.

  2. Kiểm tra các thiết lập tham số của dải Brin, tối ưu hóa chiều dài dải Brin, StdDev nhân số.

  3. Tối ưu hóa các tham số kháng cự hỗ trợ động, làm cho mức kháng cự hỗ trợ gần với giá hơn. Có thể thử các thiết lập ngắn hơn, ít điểm cao và thấp hơn.

  4. Thêm hoặc thử nghiệm các chỉ số phụ trợ khác, chẳng hạn như KDJ, MACD và các chỉ số khác kết hợp với RSI để tăng độ chính xác phán đoán.

  5. Kiểm tra tham số bộ lọc xu hướng, tối ưu hóa độ dài bộ lọc, tăng thời gian giữ, giảm hoạt động đảo ngược không cần thiết.

Tóm tắt

Chiến lược này sử dụng nhiều chỉ số như RSI, bạch đàn, kháng cự hỗ trợ động, để tận dụng lợi thế của các chỉ số, xác minh lẫn nhau, có khả năng phán đoán mạnh mẽ. Ngoài ra, có thể thêm bộ lọc xu hướng để giảm tiếng ồn hơn nữa. Các tham số của chiến lược được thiết lập linh hoạt, người dùng có thể điều chỉnh các tham số tùy theo nhu cầu của họ.

Mã nguồn chiến lược
/*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)