RSI는 볼링거 밴드와 동적 지지/저항 양적 전략이 결합됩니다.

저자:차오장, 날짜: 2024-01-24 15:19:22
태그:

img

전반적인 설명

이 전략은 RSI 지표를 사용하여 시장의 과잉 구매/ 과잉 판매 수준을 판단하고, 볼링거 밴드와 결합하여 가격 변동 범위를 결정합니다. 또한, 높은/ 낮은 가격에 기반하여 동적 지원/ 저항이 생성되어 가격이 지원/ 저항 수준에 가까울 때만 구매/ 판매 주문을 유발합니다. 사용자는 단순한 이동 평균과 같은 트렌드 필터 조건을 설정하여 가격 트렌드가 거래 방향과 일치하는지 확인할 수 있습니다. 이 전략은 강력한 신호 정확성을 위해 여러 기술적 지표를 통합하고 효과적으로 시장 기회를 포착합니다.

전략 논리

이 전략은 3가지 주요 요소로 구성되어 있습니다. RSI, 볼링거 밴드 및 동적 S/R.

RSI 컴포넌트는 과반 구매/ 과반 판매 수준을 판단합니다. RSI가 30 이하로 떨어지면 과반 판매 상태가 나타나고 구매 신호가 발동됩니다. RSI가 70 이상으로 상승하면 과반 구매 상태가 나타나고 판매 신호가 발동됩니다.

볼링거 밴드 (Bollinger Band) 는 가격 이동 평균과 표준편차에서 계산된 상위/하위 밴드이며, 가격이 정상적인 변동 범위를 벗어났는지 여부를 결정합니다. 상위 밴드에 접근하는 가격은 판매를 제안하는 반면 하위 밴드는 구매를 제안합니다.

S/R 컴포넌트는 역동적인 계산 방법을 사용하여 특정 룩백 기간 및 비율 범위 내의 역사적 높은/저한 가격 (또는 폐쇄/ 오픈 가격) 과 역사적 가격 역전 지점에 기초한 주요 S/R 수준을 생성합니다. 가격이 주요 저항 수준으로 상승 할 때 판매 신호를 유발하고 가격이 지원 수준으로 떨어질 때 구매 신호를 유발합니다.

요약하자면 이 전략은 RSI가 과잉 구매/ 과잉 판매, 볼린거 밴드에서 가격의 돌파, 그리고 동적 S/R 수준에 가까운 경우에만 구매/판매 거래를 시작합니다.

장점

  1. 기본 지표 RSI는 기술 분석 지표 Bollinger Bands와 결합됩니다. RSI는 근본적으로 과반 구매/ 과반 판매 수준을 판단하고 Bollinger Bands는 기술적 가격 패턴을 결정합니다.

  2. 동적 S/R 계산은 가격 움직임을 지배하는 실제 S/R에 더 가깝습니다.

  3. 트렌드 필터를 추가하면 RSI와 볼링거 밴드와 결합할 때 소음을 필터링함으로써 신호 정확도를 더욱 향상시킵니다.

위험성

  1. 부적절한 RSI 매개 변수 설정은 잘못된 판단을 일으킬 수 있습니다. 너무 짧은 RSI 길이는 소음을 증가시킵니다. 잘못된 과잉 구매 / 과잉 판매 임계 설정 또한 오류로 이어집니다.

  2. 길이, StdDev 곱셈과 같은 잘못된 볼링거 밴드 매개 변수는 판단 정확성에 영향을 미칩니다.

  3. 동적 S/R는 역사적인 높은/저한 가격에 의존하므로 뒤떨어지는 경향이 있다. 사용자는 현재 가격에 더 큰 관련성을 위해 S/R 매개 변수를 최적화해야 한다.

  4. 이 전략은 간섭을 일으킬 수 있는 여러 지표와 비교적 복잡한 논리를 가지고 있다. 사용자는 갈등을 줄이기 위해 매개 변수를 테스트해야 한다. 입력 기준을 단순화하는 것도 오류를 최소화하는 데 도움이 된다.

최적화 방향

  1. 길이, 과잉 구매/ 과잉 판매 임계치를 포함한 RSI 매개 변수를 테스트하고 최적화합니다.

  2. 길이와 StdDev 곱셈을 포함한 볼링거 밴드 매개 변수를 테스트하고 최적화하십시오.

  3. 역동 S/R 매개 변수를 최적화하여 S/R 레벨을 가격에 더 가깝게 조정합니다. 예를 들어, 짧은 리크백 기간 또는 적은 역사적 높은/저한 가격을 사용하십시오.

  4. 정확성을 높이기 위해 RSI와 함께 KDJ, MACD 등 추가 보조 지표를 테스트합니다.

  5. 트렌드 필터 매개 변수, 특히 필터 길이를 테스트하고 최적화하여 유지 기간을 연장하고 불필요한 역 순서를 줄이십시오.

결론

이 전략은 강력한 신호 정확성을 위해 광범위한 크로스 검증을 통해 RSI, 볼링거 밴드 및 동적 S / R와 같은 여러 지표의 강점을 활용합니다. 트렌드 필터를 추가하면 소음을 더욱 감소시킵니다. 유연한 매개 변수 조정으로 사용자는이 전략을 최적화하여 자신의 필요에 가장 잘 맞게 할 수 있습니다. 적절한 매개 변수 테스트 및 최적화는 더 두드러진 성능을 가져올 것입니다. 이것은 매우 유망한 수치 전략입니다.


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

더 많은