RSIとボリンジャーバンドのサポートとレジスタンスの動的組み合わせ定量戦略


作成日: 2024-01-24 15:19:22 最終変更日: 2024-01-24 15:19:22
コピー: 1 クリック数: 709
1
フォロー
1617
フォロワー

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)