ボリンジャーバンドとローソク足パターンに基づく動的ボラティリティ取引戦略

BB SMA ATR RSI ROC MTF
作成日: 2024-11-29 16:29:01 最終変更日: 2024-11-29 16:29:01
コピー: 0 クリック数: 497
1
フォロー
1617
フォロワー

ボリンジャーバンドとローソク足パターンに基づく動的ボラティリティ取引戦略

概要

この戦略は,ブリン帯と図形状分析に基づく取引システムで,日線レベルの価格変動と図特性を分析することで,市場の逆転の機会を捉える.戦略の核心は,ブリン帯の波動率チャネルと図上の下線と実体との比率関係を組み合わせて,価格がブリン帯の境界に触れたときに潜在的な逆転シグナルを探すことである.このシステムは,多周期分析をサポートし,日線レベルの分析を維持しながら,より小さな時間周期で取引することができる.

戦略原則

戦略は20周期のブリン帯を主要技術指標として採用し,標準差の倍数は2.0である.図の上下影線と実体比を計算し,この比が設定された値 (デフォルト1.0) を超え,価格がブリン帯の境界に触れたときに,システムは取引信号を発信する.入場タイミングは,日線での収収価格,翌日の開場価格,日中の高点または低点の柔軟な選択を可能にします.戦略には,口座余剰に基づくリスク管理システムも含まれ,ポジションの規模を動的に計算することで,各取引のリスクを制御します.

戦略的優位性

  1. 多次元分析:技術指標と価格形状分析を組み合わせ,信号の信頼性を高めます.
  2. フレキシブルなエントリーメカニズム:異なる取引スタイルに対応する複数のエントリータイムオプションを提供します.
  3. 優れたリスク管理:ダイナミックなポジション規模と自動ストップでリスクを制御する.
  4. 多時間周期互換性:日線分析を維持しながらより短い時間周期で取引を行うことができる.
  5. 自動化程度: 信号認識からポジション管理まで自動化されている.

戦略リスク

  1. 市場波動の危険性: 市場が激しく波動すると,偽信号が生じることがあります.
  2. 遅延リスク: 日線データを使用しているため,急速な市場では十分な反応が及ばない可能性があります.
  3. 参数感性:ブリン帯の参数と影線比率の値下げの選択は,戦略のパフォーマンスに顕著な影響を及ぼします.
  4. 流動性のリスク:流動性の低い市場では,予想した価格で取引することが困難である.

戦略最適化の方向性

  1. 取引量分析の導入:取引量データを組み合わせて,価格逆転の有効性を検証する.
  2. 市場環境のフィルタリングを増やす:不良な市場環境をフィルタリングするためにトレンド強さの指標を追加する.
  3. 最適化パラメータの自適化:市場変動率の動向に応じてブリン帯パラメータと影線比率の値の調整.
  4. リスク管理の改善:撤回管理と利益曲線監視の強化
  5. 強化信号確認: 補助確認ツールとして他の技術指標を導入する.

要約する

これは,ブリン帯と図分析を組み合わせた完全な取引システムで,市場逆転の機会を多次元分析によって捉えます.戦略の優位性は,その包括的な分析枠組みと完善したリスク管理システムにあるが,同時に,市場環境とパラメータ選択が戦略のパフォーマンスに与える影響にも注意する必要があります.提案された最適化方向によって,戦略の安定性と信頼性がさらに向上する見込みがあります.

ストラテジーソースコード
/*backtest
start: 2023-11-29 00:00:00
end: 2024-11-28 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trade Entry Detector, based on Wick to Body Ratio when price tests Bollinger Bands", overlay=true, default_qty_type=strategy.fixed)

// Input for primary analysis time frame
timeFrame = "D"  // Daily time frame

// Bollinger Band settings
length = input.int(20, title="Bollinger Band Length", minval=1)
mult = input.float(2.0, title="Standard Deviation Multiplier", minval=0.1)
source = input(close, title="Source")

// Entry ratio settings
wickToBodyRatio = input.float(1.0, title="Minimum Wick-to-Body Ratio", minval=0)

// Order Fill Timing Option
fillOption = input.string("Daily Close", title="Order Fill Timing", options=["Daily Close", "Daily Open", "HOD", "LOD"])

// Account and risk settings
accountBalance = 100000  // Account balance in dollars
riskPercentage = 1.0     // Risk percentage per trade
riskAmount = (riskPercentage / 100) * accountBalance // Fixed 1% risk amount

// Request daily data for calculations
dailyHigh = request.security(syminfo.tickerid, timeFrame, high)
dailyLow = request.security(syminfo.tickerid, timeFrame, low)
dailyClose = request.security(syminfo.tickerid, timeFrame, close)
dailyOpen = request.security(syminfo.tickerid, timeFrame, open)

// Calculate Bollinger Bands on the daily time frame
dailyBasis = request.security(syminfo.tickerid, timeFrame, ta.sma(source, length))
dailyDev = mult * request.security(syminfo.tickerid, timeFrame, ta.stdev(source, length))
dailyUpperBand = dailyBasis + dailyDev
dailyLowerBand = dailyBasis - dailyDev

// Calculate the body and wick sizes on the daily time frame
dailyBodySize = math.abs(dailyOpen - dailyClose)
dailyUpperWickSize = dailyHigh - math.max(dailyOpen, dailyClose)
dailyLowerWickSize = math.min(dailyOpen, dailyClose) - dailyLow

// Conditions for a candle with an upper wick or lower wick that touches the Bollinger Bands
upperWickCondition = (dailyUpperWickSize / dailyBodySize >= wickToBodyRatio) and (dailyHigh > dailyUpperBand)
lowerWickCondition = (dailyLowerWickSize / dailyBodySize >= wickToBodyRatio) and (dailyLow < dailyLowerBand)

// Define the swing high and swing low for stop loss placement
var float swingLow = na
var float swingHigh = na

if (ta.pivothigh(dailyHigh, 5, 5))
    swingHigh := dailyHigh[5]

if (ta.pivotlow(dailyLow, 5, 5))
    swingLow := dailyLow[5]

// Determine entry price based on chosen fill option
var float longEntryPrice = na
var float shortEntryPrice = na

if lowerWickCondition
    longEntryPrice := fillOption == "Daily Close" ? dailyClose :
                      fillOption == "Daily Open" ? dailyOpen :
                      fillOption == "HOD" ? dailyHigh : dailyLow

if upperWickCondition
    shortEntryPrice := fillOption == "Daily Close" ? dailyClose :
                       fillOption == "Daily Open" ? dailyOpen :
                       fillOption == "HOD" ? dailyHigh : dailyLow

// Execute the long and short entries with expiration
var int longOrderExpiry = na
var int shortOrderExpiry = na

if not na(longEntryPrice)
    longOrderExpiry := bar_index + 2  // Order expires after 2 days

if not na(shortEntryPrice)
    shortOrderExpiry := bar_index + 2  // Order expires after 2 days

// Check expiration and execute orders
if (longEntryPrice and bar_index <= longOrderExpiry and high >= longEntryPrice)
    longStopDistance = close - nz(swingLow, close)
    longPositionSize = longStopDistance > 0 ? riskAmount / longStopDistance : na
    if (not na(longPositionSize))
        strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEntryPrice := na  // Reset after entry

if (shortEntryPrice and bar_index <= shortOrderExpiry and low <= shortEntryPrice)
    shortStopDistance = nz(swingHigh, close) - close
    shortPositionSize = shortStopDistance > 0 ? riskAmount / shortStopDistance : na
    if (not na(shortPositionSize))
        strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEntryPrice := na  // Reset after entry

// Exit logic: hit the opposing Bollinger Band
if (strategy.position_size > 0) // Long position
    strategy.exit("Exit Long", "Long", limit=dailyUpperBand)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Exit Short", "Short", limit=dailyLowerBand)

if (strategy.position_size > 0) // Long position
    strategy.exit("Stop Loss Long", "Long", stop=swingLow)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Stop Loss Short", "Short", stop=swingHigh)

// Plot daily Bollinger Bands and levels on the chosen time frame
plot(dailyUpperBand, color=color.blue, linewidth=1, title="Daily Upper Bollinger Band")
plot(dailyLowerBand, color=color.blue, linewidth=1, title="Daily Lower Bollinger Band")
plot(dailyBasis, color=color.gray, linewidth=1, title="Daily Middle Bollinger Band")