マルチインジケーターブレイクアウトトレンドフォロー戦略

ATR SL N1 N2 波动率过滤 风险管理 多周期 趋势跟踪 海龟交易
作成日: 2025-07-03 10:14:35 最終変更日: 2025-07-03 10:14:35
コピー: 6 クリック数: 265
2
フォロー
319
フォロワー

マルチインジケーターブレイクアウトトレンドフォロー戦略 マルチインジケーターブレイクアウトトレンドフォロー戦略

概要

多指数突破トレンドトラッキング戦略は,クラシック海取引システムに基づく定量取引戦略で,多周期突破シグナルによって市場の強いトレンドを捕捉する.戦略の核心は,異なる時間周期の価格突破を入場と出場シグナルとして利用し,ATR ((平均リアル波幅) と組み合わせたリスク管理とポジション管理を行うことである.この戦略は,市場突破シグナルを識別するために使用される指標として使用することも,完全な自動取引システムとして取引を実行することもできる.戦略の優点は,トレンドの機会を体系的に捕捉し,厳格なリスク制御によって資金管理の効率性を向上させることにある.

戦略原則

この戦略の核心原則は,価格が歴史的な高点または低点を突破することを認識することによって潜在的なトレンドの動きを捉えることです.具体的には,以下の論理を実行します.

  1. 入学制度戦略は,N1周期 (デフォルト20サイクル) の歴史的な最高値と最低値を突破基準として使用する. 価格が上向きに前N1周期の最高値を破るとき,多頭入場信号を生成する. 価格が下向きに前N1周期の最低値を破るとき,空頭入場信号を生成する.

  2. 出場メカニズム戦略は二重出場によるもの.

    • 止損出場:ATRの設定に基づく動的止損位で,入場価格の減算 (多頭) または加算 (空頭) のATR値の2倍をデフォルトで設定する.
    • トレンド反転出場:価格がN2サイクル (デフォルト10サイクル) の最低値を下回ったとき,平仓の多頭;価格がN2周期の最高値を破ったとき,平仓の空頭.
  3. ポジション管理: 戦略は,波動率 ((ATR) とリスク比率に基づいて取引単位サイズを計算し,各取引のリスクは,口座資金の固定比率 ((デフォルト 1%) の内にあることを保証します. 計算式は次のとおりです.

   交易单位 = 风险金额 / (ATR * 每点价值)

リスク額は,初期資金にリスクの比率を掛けます.

  1. 取引実行: 戦略は,ポジションが持たないときにのみ新しい入場シグナルを実行し,重複入場を回避し,同時に入場価格を記録し,ストップロスの位置を計算する.

戦略的優位性

  1. トレンド追跡能力戦略的設計は,大きなトレンドを捉え,突破シグナルによって潜在的トレンドの起点を識別し,市場のトレンド的な動きを有効に活用することに焦点を当てています.

  2. ダイナミックなリスク管理:ATRによるストップポジションの計算により,市場の実際の変動状況に応じてストップ距離を動的に調整することで,固定ストップが近すぎると引き起こされる頻繁なストップを回避するとともに,ストップ距離が遠すぎると引き起こされる過度の損失を防止します.

  3. ポジションの適応:市場変動率と口座リスクの比率に基づいてポジションサイズを動的に調整し,高変動の市場でポジションを自動的に小さくし,低変動の市場でポジションを適切に増加させ,リスクの隙間を均衡的に制御する.

  4. パラメータの可変性策略は,複数の重要なパラメータ (N1,N2,ATRサイクル,リスク比率など) の調整インターフェースを提供し,ユーザーは異なる市場環境と個人リスクの好みに応じて最適化することができます.

  5. システム化された取引完全に体系化された取引規則は,感情的な干渉を排除し,入場,出場,資金管理の規則を厳格に遵守し,取引の規律を高めます.

戦略リスク

  1. 市場が揺れ動いた:トレンド追跡策として,横軸振動市場では頻繁に偽の突破信号が生じやすく,連続したストップが引き起こされます. 解決策は,波動率のフィルタリング条件を増加させ,波動率が一定値を超えるとのみ入場を検討することができます.

  2. スライドポイントと手数料の影響:高頻度取引または流動性不足の市場では,スライドポイントと手数料が戦略のパフォーマンスに著しく影響を与える可能性があります.取引頻度を下げたり,シグナル確認メカニズムを増やすことでこの問題を軽減することができます.

  3. パラメータ感度: 戦略のパフォーマンスはN1,N2のパラメータ設定に敏感であり,異なる市場と時間枠で最適のパラメータは大きく異なることがあります. 歴史的回帰で堅牢なパラメータの組み合わせを探し,過度に最適化によって引き起こされる曲線適合を避けるのが推奨されます.

  4. ギャップの大きなリスク突発的な重大事件による価格上昇では,ストップ・ロスは予想した価格で実行できない可能性があり,予想以上の損失を引き起こす.最大損失の制限を増加させたり,変動率調整因子を導入することを考慮することができる.

  5. 資金管理のリスク: 策略にはリスク制御メカニズムが含まれているにもかかわらず,極端な市場条件下では,連続停止は,資本曲線の大幅な引き下げにつながる可能性があります. 最大連続損失の回数制限を設定するか,全体的なリスク値制御を導入することを推奨しています.

最適化の方向

  1. 複数時間枠確認: より長い周期のトレンド確認メカニズムを導入し,複数の時間枠のトレンドが一致するときにのみ入場を考慮し,信号の質を向上させる.例えば,日線トレンドの方向が現在の取引周期のトレンド方向と一致しているかどうかをチェックする条件を追加することができる.

  2. 波動率のフィルター:波動率フィルタリング条件を導入し,市場波動率が合理的な範囲にある場合にのみ取引シグナルを実行し,過度に静かまたは過度に波動的な市場で入場を避ける.ATRの相対値 (例えばATR/価格比率) をフィルタリング指標として使用できます.

  3. 信号確認メカニズム: 突破確認メカニズムの追加,例えば,価格が突破後に一定の時間または幅を保持することを要求して信号が有効であることを確認し,偽突破による損失を減らす.

  4. 動態参数調整市場状況の動向に基づいてN1,N2パラメータを調整し,異なる波動率環境で異なるパラメータの組み合わせを使用し,市場環境への戦略の適応性を向上させる.

  5. トレンド強度評価に追加:トレンド強度指標 ((ADX,線形回帰斜率など) と組み合わせて,現在のトレンド強度を評価し,トレンド強さが一定の値に達したときにのみ入場を考慮し,トレンドキャプチャの正確性を向上させる.

  6. 損失防止の最適化: 移動ストップまたはサポート/レジスタンスベースのストップ方法の導入を検討し,リスク管理機能を保持しながら,トレンドにより多くの発展スペースを与えることができます.

要約する

多指数突破トレンド追跡戦略は,クラシックな海取引理念と近代的なリスク管理技術の組み合わせた体系化された取引戦略である.多周期的な価格突破によってトレンドの方向性を判断し,ATRと組み合わせてダイナミックなストップロストとポジションコントロールを行う.この戦略は,市場で顕著なトレンドの機会を効果的に捉えることができる.

戦略の核心的な優位性は,体系化された取引ルールと厳格なリスク管理であり,感情的な干渉を避け,パラメータ調整によって高い柔軟性を提供している.しかし,トレンドフォロー戦略として,それは震動的な市場でうまく機能しない可能性があり,使用者はその適用シナリオを理解し,適切なパラメータを最適化する必要があります.

多時間枠確認,波動率フィルター,信号確認機構などの最適化方向を導入することにより,この戦略は,信号の質と安定性をさらに向上させ,より多様な市場環境に適応する見込みがある.最終的に,多指標の突破トレンド追跡戦略は,トレーダーに市場動向を捉え,リスクを制御しながら,長期にわたって安定した取引パフォーマンスを達成するための信頼できる,体系的な方法を提供します.

ストラテジーソースコード
/*backtest
start: 2024-07-03 00:00:00
end: 2025-07-01 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("Turtle Trading Strategy (Simplified)", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=1000, commission_type=strategy.commission.cash_per_order, commission_value=1)

// --- Strategy Inputs ---
n1_entry_period = input.int(20, title="Entry Lookback Period (N1)", minval=1)
n2_exit_period = input.int(10, title="Exit Lookback Period (N2)", minval=1)
atr_period = input.int(20, title="ATR Period", minval=1)
atr_multiplier = input.float(2.0, title="ATR Stop Multiplier", minval=0.1)
risk_per_trade_percent = input.float(1.0, title="Risk Per Trade (%)", minval=0.1, maxval=10.0)

// --- Calculate Channels ---
highest_high_n1 = ta.highest(high, n1_entry_period)
lowest_low_n1 = ta.lowest(low, n1_entry_period)

highest_high_n2 = ta.highest(high, n2_exit_period)
lowest_low_n2 = ta.lowest(low, n2_exit_period)

// --- Calculate ATR (Average True Range) ---
atr_value = ta.atr(atr_period)

// --- Position Sizing (Simplified) ---
// This aims to calculate units based on a fixed percentage risk per trade.
// 1 Unit = 1 ATR worth of movement. Risk 1% of equity per trade.
risk_amount = strategy.initial_capital * (risk_per_trade_percent / 100)
dollar_per_point = syminfo.mintick // Or your instrument's specific dollar per point value
unit_size = atr_value * dollar_per_point > 0 ? math.round(risk_amount / (atr_value * dollar_per_point)) : 0

// Ensure unit_size is at least 1 if risk allows, and cap it for realism
if unit_size == 0 and risk_amount > 0
    unit_size := 1 // Minimum 1 unit if risk allows any trade
if unit_size > 10000 // Cap unit size to prevent excessively large positions in backtesting
    unit_size := 10000

// --- Entry Logic ---
long_condition = ta.crossover(close, highest_high_n1[1]) // Break above previous N1 high
short_condition = ta.crossunder(close, lowest_low_n1[1]) // Break below previous N1 low

// Variables to store entry information only for the *current* bar
var float current_entry_price = na
var int current_entry_type = 0 // 1 for long, -1 for short, 0 for no entry

if long_condition and strategy.opentrades == 0 // Only enter if no open positions
    strategy.entry("Long", strategy.long, qty=unit_size, comment="Turtle Long Entry")
    // Store entry details for the current bar
    current_entry_price := close // Or strategy.opentrades[0].entry_price if you prefer but close on entry bar is often same
    current_entry_type := 1

if short_condition and strategy.opentrades == 0 // Only enter if no open positions
    strategy.entry("Short", strategy.short, qty=unit_size, comment="Turtle Short Entry")
    // Store entry details for the current bar
    current_entry_price := close // Or strategy.opentrades[0].entry_price
    current_entry_type := -1

// --- Exit Logic ---

// Declare persistent variables to store stop prices
var float long_stop_price = na
var float short_stop_price = na

// Calculate and store stop price on the bar *after* an entry
if current_entry_type[1] == 1 // If a long entry occurred on the previous bar
    long_stop_price := current_entry_price[1] - (atr_value[1] * atr_multiplier) // Use values from previous bar
    short_stop_price := na // Reset short stop

if current_entry_type[1] == -1 // If a short entry occurred on the previous bar
    short_stop_price := current_entry_price[1] + (atr_value[1] * atr_multiplier) // Use values from previous bar
    long_stop_price := na // Reset long stop

// Stop Loss for Long Positions
if strategy.position_size > 0 // We have a long position
    strategy.exit("Long Exit SL", from_entry="Long", stop=long_stop_price, comment="Long Stop Loss")

// Stop Loss for Short Positions
if strategy.position_size < 0 // We have a short position
    strategy.exit("Short Exit SL", from_entry="Short", stop=short_stop_price, comment="Short Stop Loss")

// N2 Exit for Long Positions
if strategy.position_size > 0 and ta.crossunder(close, lowest_low_n2[1])
    strategy.close("Long", comment="Turtle Long N2 Exit")

// N2 Exit for Short Positions
if strategy.position_size < 0 and ta.crossover(close, highest_high_n2[1])
    strategy.close("Short", comment="Turtle Short N2 Exit")

// --- Plotting for Visualization ---
plot(highest_high_n1, "N1 High", color=color.green, linewidth=2, style=plot.style_linebr)
plot(lowest_low_n1, "N1 Low", color=color.red, linewidth=2, style=plot.style_linebr)
plot(highest_high_n2, "N2 High (Exit)", color=color.blue, linewidth=1, style=plot.style_linebr)
plot(lowest_low_n2, "N2 Low (Exit)", color=color.orange, linewidth=1, style=plot.style_linebr)