トリプルボトムリバウンドブレイクアウトモメンタム戦略

EMA ATR MA SMA
作成日: 2025-01-10 15:49:30 最終変更日: 2025-01-10 15:49:30
コピー: 0 クリック数: 401
1
フォロー
1617
フォロワー

トリプルボトムリバウンドブレイクアウトモメンタム戦略

概要

この戦略は、テクニカル分析に基づいた定量的な取引システムであり、主に市場におけるトリプルボトムパターンとモメンタムブレイクスルーシグナルを識別して取引を行います。この戦略は、移動平均 (MA) クロスオーバー、真の範囲 (ATR)、価格チャネルなどの複数のテクニカル指標を組み合わせて、完全な取引システムを構築します。この戦略は、プログラムされた方法でトリプルボトムリバウンドパターンの自動識別と取引実行を実現します。

戦略原則

戦略の中核となるロジックには、次の重要な要素が含まれます。

  1. 高速(5期間)移動平均と低速(20期間)移動平均のクロスオーバーを使用して、市場のトレンドの方向を確認します。
  2. プログラムは自動的に3つの連続した安値(low1、low2、low3)を識別し、トリプルボトムパターンを形成します。
  3. ATRインジケーターを使用してボラティリティを計算し、動的なストップロスとテイクプロフィットレベルを設定します。
  4. 3回目の底打ち後、価格が前回のリバウンド高値を突破し、移動平均線のクロスオーバーシグナルと相まって、買いのタイミングを確認します。
  5. 並列チャネルを作成して価格変動範囲を視覚化し、追加の市場参照を提供します。
  6. 取引実行時にATRに基づいて動的なストップロスとテイクプロフィット条件を設定します。

戦略的優位性

  1. 複数のテクニカル指標を組み合わせて取引シグナルの信頼性を向上させる
  2. ATRを使用してストップロスと利益確定ポジションを動的に調整し、市場のボラティリティの変化に適応します。
  3. トリプルボトムパターンを自動的に識別し、主観的な判断の影響を軽減します。
  4. 過剰取引を避けるために取引間隔の制限を設定する
  5. 視覚化ツール(並列チャネルとラベル)を通じて市場構造を明確に参照できます。
  6. 戦略ロジックは明確で、維持と最適化が容易です

戦略リスク

  1. 不安定な市場では誤ったシグナルが発生する可能性がある
  2. トリプルボトムパターンの識別プロセスは市場ノイズの影響を受ける可能性がある
  3. 固定ATR倍率はすべての市場状況に適しているわけではない
  4. 急激なトレンドの変化の時期には継続的な損失が発生する可能性がある
  5. 取引間隔の設定により、有効なシグナルを見逃してしまう可能性があります

戦略最適化の方向性

  1. 回復の妥当性を確認するためのボリューム指標の導入
  2. さまざまな市場環境に応じてATR倍率を動的に調整
  3. トレンド強度フィルターを追加して取引シグナルの品質を向上させる
  4. トリプルボトム認識アルゴリズムを最適化して精度を向上
  5. 市場変動サイクル分析を導入し、取引間隔設定を最適化
  6. 価格パターンに対称性分析を追加することを検討する

要約する

この戦略は、トリプルボトムリバウンドブレイクスルー取引戦略をプログラム的に実装し、複数のテクニカル指標とリスク管理方法を組み合わせており、実用性に優れています。継続的な最適化と改善を通じて、この戦略は実際の取引でより良いパフォーマンスを達成することが期待されます。実際の取引の前に十分なバックテスト検証を実施し、特定の市場状況に応じてパラメータ設定を調整することをお勧めします。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
strategy("反彈三次突破策略", overlay=true, initial_capital=100000, commission_value=0.001425, slippage=1)

// === 參數設定 ===
fast_length = input.int(5, title="快速均線週期")
slow_length = input.int(20, title="慢速均線週期")
atr_period = input.int(14, title="ATR 週期")
atr_factor = input.float(2.0, title="ATR 因子")
profit_factor = input.float(2.0, title="止盈因子")

// === 計算均線 ===
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.ema(close, slow_length)

// === 均線交叉訊號 ===
long_signal = ta.crossover(fast_ma, slow_ma)
short_signal = ta.crossunder(fast_ma, slow_ma)

// === 計算 ATR ===
atr = ta.atr(atr_period)

// === 反彈三次突破策略 ===
var float low1 = na
var float low2 = na
var float low3 = na
var bool trend_down = false
var bool long_breakout = false
var line lower_line = na
var line upper_line = na

if (na(low1) or na(low2) or na(low3))
    // 初始化低點
    low1 := na
    low2 := na
    low3 := na

if (close < low3 or na(low3))
    // 更新低點
    low1 := low2
    low2 := low3
    low3 := close
    trend_down := true

if (trend_down and close > low2 and close > low1)
    // 確認反轉且第三次反彈比第二次高
    trend_down := false
    long_breakout := true

// 清除前一個反彈通道
if (not na(lower_line))
    line.delete(lower_line)
if (not na(upper_line))
    line.delete(upper_line)

// 繪製新的反彈通道
if (not na(low1) and not na(low3))    
    lower_line := line.new(x1=bar_index[2], y1=low1, x2=bar_index, y2=low3, color=color.yellow, width=2)
    upper_line := line.new(x1=bar_index[2], y1=low1 + (low3 - low1), x2=bar_index, y2=low3 + (low3 - low1), color=color.yellow, width=2)

// === 進出場條件 ===
var float last_long_exit = na
var float last_short_exit = na
var float stop_loss_long = na
var float take_profit_long = na
var float stop_loss_short = na
var float take_profit_short = na

var label stop_loss_label_long = na
var label take_profit_label_long = na
var label stop_loss_label_short = na
var label take_profit_label_short = na

if (long_signal or long_breakout)
    if na(last_short_exit) or (time - last_short_exit) > 2 * 60 * 60 * 1000  // 確保多頭出場後有一段時間間隔
        // 做多
        strategy.entry("做多", strategy.long)
        // 止損設置為最近低點下方
        stop_loss_long := low3 - atr_factor * atr
        take_profit_long := close + profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做多", stop=stop_loss_long, limit=take_profit_long)
        last_long_exit := time  // 記錄多頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_long))
            label.delete(stop_loss_label_long)
        if (not na(take_profit_label_long))
            label.delete(take_profit_label_long)

        // 繪製新的止盈止損標籤
        stop_loss_label_long := label.new(x=bar_index, y=stop_loss_long, text=str.tostring(math.round(stop_loss_long * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_long := label.new(x=bar_index, y=take_profit_long, text=str.tostring(math.round(take_profit_long * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)

if (short_signal)
    if na(last_long_exit) or (time - last_long_exit) > 2 * 60 * 60 * 1000  // 確保空頭出場後有一段時間間隔
        // 做空
        strategy.entry("做空", strategy.short)
        // 止損設置為最近高點上方
        stop_loss_short := high + atr_factor * atr
        take_profit_short := close - profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做空", stop=stop_loss_short, limit=take_profit_short)
        last_short_exit := time  // 記錄空頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_short))
            label.delete(stop_loss_label_short)
        if (not na(take_profit_label_short))
            label.delete(take_profit_label_short)

        // 繪製新的止盈止損標籤
        stop_loss_label_short := label.new(x=bar_index, y=stop_loss_short, text=str.tostring(math.round(stop_loss_short * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_short := label.new(x=bar_index, y=take_profit_short, text=str.tostring(math.round(take_profit_short * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)