ボリュームと価格の関係に基づくマルチインジケーターボラティリティブレイクアウト取引システム

ATR RSI VOLUME BANDS TP/SL BACKTEST FILTER
作成日: 2025-03-28 15:33:42 最終変更日: 2025-03-28 15:33:42
コピー: 0 クリック数: 31
2
フォロー
26
フォロワー

ボリュームと価格の関係に基づくマルチインジケーターボラティリティブレイクアウト取引システム ボリュームと価格の関係に基づくマルチインジケーターボラティリティブレイクアウト取引システム

概要

量関数に基づく多指標波動率突破取引システムは,取引量急増検出,ATR波動率チャネル,RSI動量フィルタを組み合わせた総合的な量化取引戦略である.この戦略の核心思想は,市場における取引量の突然の急増を捕捉し,それを潜在的取引機会として捉え,価格動態と技術指標を組み合わせて,取引決定の精度を高めるために多層のフィルタリングを行うことである.この戦略は,ATR波動率チャネルをストップ・ロスト・参照として設定し,RSI指標を利用して過度に買い入るか売り出したりを避けるため,完全な取引システム枠組みを実現する.

戦略原則

この戦略は以下の主要なモジュールに基づいています.

  1. 突発性検査戦略は,まず”VolSpike”という概念を定義し,現在の取引量と前NのKラインの合計取引量とを比較し,現在のKラインの取引量が前NのKラインの合計を上回ると,取引量急増信号として認識される.この異常な取引量は,通常,市場の方向性の変化が起こりうることを示唆する.

  2. ATR波動率チャネル策略は,平均実際の波幅を計算し,価格変動の参照範囲として上下波動帯を作成する.これらのチャネルは,市場の変動を視覚化するために使用されるだけでなく,ストップロズポジションを設定するために直接使用されます.ATRチャネルの計算は,ユーザが調整できる周期と倍数を採用し,戦略が異なる市場環境に適応できるようにします.

  3. RSI 運動量フィルター: 比較的強い指標 ((RSI) をフィルタリングする取引シグナルで,極端な超買いまたは超売り状態で取引を避ける. ユーザーは,RSIの上限と下限の値を設定することができ,RSI値がこれらの値の間にある場合にのみ,戦略はポジションを考慮する.

  4. K線形分析策略には,K線形状分析が加えられ,K線実体と上下影線の比率を測定することで,影線が長すぎているK線信号をフィルタリングし,これは,急速に反転する可能性がある市場への入場を回避するのに役立ちます.

  5. トランザクション実行論理

    • 取引量の急増が検出され,RSIフィルタリング条件とK線形状の要求が満たされると,戦略は,K線のクローズアップ価格とオープニング価格の位置に基づいて,ポジション開設方向を決定する.
    • 多頭条件:閉盘価格が開盘価格 (陽線) より大きく,上影線が設定された最大比率を超えない.
    • 空頭条件:閉盘価格が開盘価格より小さい (陰線) で,下影線が設定された最大比率を超えない.
    • 止損位置はATR通路の境界で設定され,止損位置は入場価格とATR通路の間の距離に基づいて,ユーザ定義の倍数で設定されます.

戦略的優位性

  1. 多次元信号確認: 取引量,価格形態,技術指標を組み合わせ,複数の条件のフィルタリングにより,取引信号の質を大幅に向上させ,偽信号を減らす.

  2. 適応力がある戦略のATR周期,RSI値,取引量比較基準などの重要なパラメータは,戦略が異なる市場環境と取引品種に適応できるように調整できます.

  3. リスク管理の改善: 取引ごとに明確なストップ・ロズとストップ・ストップの設定があり,市場の波動性 ((ATR) による動的調整が,固定ポイント数やパーセントのリスク管理よりも合理的です.

  4. ビジュアル取引シグナル: 戦略はATRチャネルと取引量急増信号をグラフに直視的に表示する (ロケットアイコン),トレーダーが市場状況と戦略の論理を直視的に理解できるようにする.

  5. 細かい入場フィルター:K線影線と実体比を分析することで,過度の波動性のあるK線にポジションを開くのを避け,この細部処理は取引の成功率を高めるのに役立ちます.

戦略リスク

  1. 逆転リスク策略は複数のフィルタリングメカニズムを使用しているにもかかわらず,特に重要なニュースや市場操作のイベントで,取引量の急増後に市場が急速に反転する可能性があります.このリスクを軽減するために,時間フィルタリングを増やすことを検討し,重要な経済データの発表前後に取引を避けることができます.

  2. パラメータ最適化トラップ: 戦略には複数の調整可能なパラメータが含まれ,過度な最適化は,戦略が実盤で不良なパフォーマンスをもたらす可能性がある. 前向きテストを使用するか,複数の取引品種でパラメータの安定性をテストすることをお勧めします.

  3. 流動性のリスク:取引量急増戦略は,流動性の低い市場で誤導的な信号を生じることがあります. 流動性の高い市場に適用されることを確認し,最小取引量値の追加を追加のフィルタリング条件として考慮してください.

  4. システム上のリスクの口: 市場が激しく波動したり,システムリスクが発生した場合,ATRのストップは,非常に滑りやすい. 最大損失の制限を設定するか,より保守的なポジション管理戦略を使用することを考慮して,このリスクを軽減することができます.

  5. 単一の時間枠の限界:現在の戦略は単一の時間枠でしか動作しないため,より大きな時間枠の重要なトレンド情報を逃す可能性があります.

戦略最適化の方向性

  1. 多時間枠分析統合より大きな時間枠のトレンド方向をフィルター条件として使用し,主要トレンド方向のみで取引することで,戦略の成功率を大幅に向上させることができます.これは,より大きな時間枠の移動平均またはトレンド指標を追加することで実現できます.

  2. VolSpikeのパラメータを動的に調整する:市場の波動率に基づいて取引量比較を自動的に調整する基準周期,低波動率市場の比較周期が長く,高波動率市場の比較周期が短く,異なる市場の状況に適応する.

  3. 機械学習が信号の質を最適化する: 機械学習アルゴリズムを使用して,過去の取引量急増パターンの関連と後続の価格動向を分析し,信号品質の評価をさらに細かくし,成功の可能性が高い信号のみを実行する.

  4. 市場感情指標を追加:VIXなどの波動性指数または市場幅の指標を統合し,極端な市場環境で戦略を調整または一時停止し,高い不確実性のある環境での取引を避ける.

  5. ダイナミック・ストップ・ストラテジーを実現する: 価格が有利な方向に動くと,利益の潜在性を最大化し,既得利益を保護するために,ストップ・ロスを追跡するか,分割して利益を得る戦略を導入することを検討することができます.

  6. 資金管理モジュールを最適化:現在の戦略は,固定比率を用いてポジション管理を行う.変動率またはケリー公式に基づくダイナミックなポジション管理を考慮し,異なる市場条件下でリスクを自動的に調整することができる.

要約する

量値関係に基づく多指標波動率突破取引システムは,取引量突破検出,ATR波動率チャネル,RSI動量フィルタリングを組み合わせて,多層の取引意思決定フレームワークを構成する構造化された量化取引戦略である.戦略の核心的な優位性は,その総合的な信号確認機構と,市場機会を捉えると同時にリスクを制御できるようにする完善したリスク管理システムにある.

しかし,いかなる取引戦略にも限界があり,この戦略の主なリスクには,市場逆転のリスク,パラメータ最適化トラップ,単一の時間枠の限界が含まれます.複数の時間枠分析を統合し,パラメータを動的に調整し,機械学習を導入し,資金管理を最適化することで,戦略に大きな改善の余地があります.

体系的な取引を追求する量化トレーダーにとって,この戦略は,個人の好みや市場の特徴に応じてさらにカスタマイズ・最適化できる堅固な基礎の枠組みを提供します.最終的に,戦略の成功は,トレーダーの市場の理解と戦略の論理の把握,そして厳格な規律的な実行と継続的な戦略の改善に依存します.

ストラテジーソースコード
/*backtest
start: 2024-03-28 00:00:00
end: 2024-12-31 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("VolSpike ATR RSI Strategy with ATR Bands", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

//────────────────────────────
// ① User Inputs
//────────────────────────────
// VolSpike reference candle count
barsBack = input.int(7, title="VolSpike - Reference Candle Count", minval=1)

// ATR Band related input values
atrPeriod     = input.int(title="ATR Period", defval=14, minval=1)
atrMultiplier = input.float(title="ATR Band Scale Factor", defval=2.5, step=0.1, minval=0.01)

// RSI related input values and thresholds
rsiPeriod = input.int(title="RSI Period", defval=14, minval=1)
rsiUpper  = input.int(title="RSI Upper Threshold", defval=80, minval=50, maxval=100)
rsiLower  = input.int(title="RSI Lower Threshold", defval=20, minval=0,  maxval=50)

// TP multiplier input: default 1 multiplier (TP = entry price + N times ATR band difference)
tpMultiplier = input.float(title="TP Multiplier", defval=1.0, step=0.1, minval=0.1, tooltip="Determines how many times the difference between the entry price and ATR band is used for TP.")

// Candle wick filter: Maximum allowed wick ratio (body to wick)
maxWickRatio = input.float(title="Max Allowed Wick Ratio", defval=2.0, minval=0.1, step=0.1, tooltip="If the wick length is greater than this ratio compared to the body, no entry will be made.")

//────────────────────────────
// ② VolSpike Calculation (Based on candle close)
//────────────────────────────
var float volSum = na
if bar_index > barsBack
    volSum := 0.0
    for i = 1 to barsBack
        volSum += volume[i]
else
    volSum := na
volSpike = not na(volSum) and (volume > volSum)

//────────────────────────────
// ③ RSI Calculation and Filter (Using user-set RSI thresholds)
//────────────────────────────
rsiVal    = ta.rsi(close, rsiPeriod)
rsiFilter = (rsiVal < rsiUpper) and (rsiVal > rsiLower)

//────────────────────────────
// ⑤ ATR Band Calculation
//────────────────────────────
getBandOffsetSource(srcIn, isUpperBand) =>
    ret = close
    switch srcIn
        "close" => ret := close
        "wicks" => ret := isUpperBand ? high : low
        => ret := close
    ret

// Offset reference is fixed to 'close'
atrSourceRef  = "close"
atrValue      = ta.atr(atrPeriod)
scaledATR     = atrValue * atrMultiplier
upperATRBand  = getBandOffsetSource(atrSourceRef, true)  + scaledATR
lowerATRBand  = getBandOffsetSource(atrSourceRef, false) - scaledATR

// Plot ATR bands on the chart
plot(upperATRBand, title="Upper ATR Band", color=color.rgb(0,255,0,50), linewidth=2)
plot(lowerATRBand, title="Lower ATR Band", color=color.rgb(255,0,0,50), linewidth=2)

//────────────────────────────
// ⑥ Rocket Signal (VolSpike) Display
//────────────────────────────
plotshape(volSpike, title="VolSpike Rocket", location=location.belowbar, style=shape.labelup, text="🚀", color=color.blue, size=size.tiny)

//────────────────────────────
// ⑦ Candle Wick Length Filter Calculation (Applied in reverse)
//────────────────────────────
// Body length (absolute value)
bodyLength = math.abs(close - open)
bodyLength := bodyLength == 0 ? 0.0001 : bodyLength  // Prevent doji
// Long position entry upper wick ratio: (high - close) / bodyLength
longWickRatio = (high - close) / bodyLength
// Short position entry lower wick ratio: (close - low) / bodyLength
shortWickRatio = (close - low) / bodyLength

longWickOK = longWickRatio <= maxWickRatio
shortWickOK = shortWickRatio <= maxWickRatio

//────────────────────────────
// ⑧ Position Entry and Exit Setup
//    - Long: Close of the entry candle > Open → SL = lowerATRBand, TP = entry price + tpMultiplier * (upperATRBand - entry price)
//    - Short: Close of the entry candle < Open → SL = upperATRBand, TP = entry price - tpMultiplier * (entry price - lowerATRBand)
//────────────────────────────
if volSpike and rsiFilter
    // Long position entry (bullish candle) && wick condition met (upper wick)
    if close > open and longWickOK
        longTP = close + tpMultiplier * (upperATRBand - close)
        strategy.entry("Long", strategy.long)
        strategy.exit("Exit Long", from_entry="Long", stop=lowerATRBand, limit=longTP)
    // Short position entry (bearish candle) && wick condition met (lower wick)
    else if close < open and shortWickOK
        shortTP = close - tpMultiplier * (close - lowerATRBand)
        strategy.entry("Short", strategy.short)
        strategy.exit("Exit Short", from_entry="Short", stop=upperATRBand, limit=shortTP)