트리플 바텀 리바운드 브레이크아웃 모멘텀 전략

EMA ATR MA SMA
생성 날짜: 2025-01-10 15:49:30 마지막으로 수정됨: 2025-01-10 15:49:30
복사: 0 클릭수: 401
avatar of ChaoZhang ChaoZhang
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)