RSI와 볼린저 밴드 지원 및 저항 동적 조합 정량 전략


생성 날짜: 2024-01-24 15:19:22 마지막으로 수정됨: 2024-01-24 15:19:22
복사: 1 클릭수: 377
1
집중하다
1166
수행원

RSI와 볼린저 밴드 지원 및 저항 동적 조합 정량 전략

개요

이 전략은 RSI 지표를 사용하여 시장의 과매매 과매매를 판단하는 동시에, 부린 띠의 하차와 결합하여 가격 변동 범위를 판단한다. 또한, 높은 낮은 시점에 기반하여 동적 지원 저항을 생성하고, 가격이 지원 저항에 가까워질 때 구매 및 판매 작업을 실행한다. 사용자는 스스로 트렌드 필터 조건을 설정할 수 있다. 예를 들어 간단한 이동 평행 선은 가격과 트렌드 방향이 일치할 때 거래한다. 이 전략은 여러 가지 기술 지표를 통합적으로 사용하며, 판단력이 강하여 시장 기회를 효과적으로 잡을 수 있다.

전략 원칙

이 전략은 주로 RSI, 브린 밴드, 동적 지원 저항의 3 부분으로 구성됩니다.

RSI 부분은 과매매를 판단하기 위해 사용된다. RSI가 30보다 낮으면 과매 지역이며, 이 때 구매 신호가 발송된다. RSI가 70보다 높으면 과매 지역이며, 이 때 판매 신호가 발송된다.

브린 벨트는 가격의 평균선과 표준차를 기반으로 가격의 정상적인 흔들림 영역에서 벗어났는지 판단하기 위해 사용된다. 가격이 상반도에 가까워지면 팔리고, 하반도에 가까워지면 구매한다.

지원 저항 부분은 동적 계산 방법을 사용하여 일정 주기 동안의 최고 최저 가격 (또는 개장 가격) 을 기준으로, 특정 퍼센트 내의 범위를 제한하고, 가격 역사 전환점을 핵심 지원 저항 지점으로 기록한다. 가격이 핵심 지원 저항 지점 근처에 올라갈 때 판매 신호를 발송하고, 가격이 핵심 지원 지점 근처에 떨어질 때 구매 신호를 발송한다.

종합적으로, 이 전략은 동시에 RSI가 오버 바이 오버 셀, 가격이 정상 범주에서 벗어나고, 동적 지원 저항에 근접하는 3가지 조건을 충족시키면 구매/판매를 실행한다.

전략적 이점

  1. 기본적 지표와 기술 지표가 결합 RSI 판단 기본적 과매매 과매매하는 동시에, 브린 띠를 사용하여 가격 기술 형태를 판단

  2. 동적 지원 저항 계산, 가격 운동의 실제 지원 저항에 더 가깝다.

  3. 사용자가 트렌드 필터를 추가하여 RSI 및 브린 밴드와 함께 판단력을 크게 향상시키고 대부분의 노이즈 신호를 필터링 할 수 있습니다.

전략적 위험

  1. RSI 매개 변수를 잘못 설정하면 잘못된 판단이 발생할 수 있다. RSI 길이가 너무 짧으면 소음이 증가한다. RSI 오버 바이 오버 소매 경계를 잘못 설정하면 오류가 발생할 수 있다.

  2. 브린 대역의 길이나 StdDev 배수의 설정이 잘못되면 판단 정확도에도 영향을 미칩니다.

  3. 동적 지지 저항은 역사적으로 높고 낮은 지점을 계산하여 지연된다. 사용자는 지지 저항 파라미터를 적절히 최적화하여 지지 저항 수준을 현재 가격에 더 가깝게 만든다.

  4. 이 전략은 복잡하고, 다중 지표 조합은 상호 간섭을 일으킬 수 있다. 사용자는 지표 매개 변수를 테스트하여 지표 충돌을 줄여야 한다. 또한 조합 조건을 적절히 단순화하여 잘못된 판단의 가능성을 줄일 수 있다.

전략 최적화 방향

  1. RSI 변수 설정을 테스트하고, RSI 길이를 최적화하고, 초과 판매 경계를 초과합니다.

  2. 브린 밴드 파라미터 설정을 테스트하고, 브린 밴드 길이를 최적화하고, StdDev 배수를 니다.

  3. 동적 지원 저항 변수를 최적화하여 지원 저항 수준을 가격에 더 가깝게 만든다. 더 짧은 주기, 더 적은 역사 높은 낮은 점 등의 설정을 시도할 수 있다.

  4. KDJ, MACD 등과 RSI 형성 조합을 추가하거나 테스트하여 판단의 정확도를 향상시킵니다.

  5. 트렌드 필터 파라미터를 테스트하고 필터 길이를 최적화하여 보유 시간을 늘리고 불필요한 역 동작을 줄입니다.

요약하다

이 전략은 RSI, 브린 밴드, 동적 지원 저항과 같은 여러 지표를 통합하여 각 지표의 장점을 최대한 활용하고, 상호 검증하고, 판단력이 강합니다. 또한 추세 필터를 추가하여 소음을 더 줄일 수 있습니다. 이 전략의 매개 변수는 유연하게 설정되어 사용자가 자신의 필요에 따라 매개 변수 조합을 조정할 수 있습니다. 매개 변수 최적화 테스트를 수행 한 후 효과가 더 분명합니다.

전략 소스 코드
/*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)