RSIとボリンジャー帯とダイナミックサポート/レジスタンス量的な戦略を組み合わせた

作者: リン・ハーンチャオチャン,日付: 2024-01-24 15:19:22
タグ:

img

概要

この戦略は,RSIインジケーターを使用して,市場のオーバーバイト/オーバーセールレベルを判断し,ボリンジャーバンドと組み合わせて価格変動範囲を決定する.また,価格がサポート/レジスタンスレベルに近い場合にのみ購入/販売オーダーを誘発するために高値/低価格に基づいて動的なサポート/レジスタンスが生成される.ユーザーは,価格傾向が取引方向に一致することを確保するために,単純な移動平均などのトレンドフィルター条件を設定することができます.この戦略は,強力な信号精度のために複数の技術指標を統合し,効果的に市場機会を把握します.

戦略の論理

この戦略には3つの主要要素が含まれる. RSI,ボリンジャー帯とダイナミックS/R.

RSIの構成要素は,過剰購入/過剰販売レベルを判断する.RSIが30を下回ると過剰販売状態を示し,購入信号を誘発する.RSIが70を超えると過剰購入状態を示し,販売信号を誘発する.

ボリンジャー帯は,価格移動平均値と標準偏差値から計算された上下帯で,価格が通常の変動範囲を突破したかどうかを判断する. 上部帯に近づく価格は販売を示唆し,下部帯は購入を示唆する.

S/Rコンポーネントは,S/Rレベルは,S/R値が過去の高低値 (または閉/開値) に基づいて,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. 精度を向上させるために,KDJ,MACDなど,RSIと組み合わせた追加の補助指標をテストする.

  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)

もっと