리소스 로딩... 로딩...

트리플 바닥 리바운드 모멘텀 돌파구 전략

저자:차오장, 날짜: 2025-01-10 15:49:30
태그:EMAATRMASMA

 Triple Bottom Rebound Momentum Breakthrough Strategy

전반적인 설명

이 전략은 기술 분석을 기반으로 한 양적 거래 시스템이며, 주로 시장에서 트리플 바닥 패턴과 추진력 돌파 신호를 식별하는 데 초점을 맞추고 있습니다. 이 전략은 이동 평균 (MA) 크로스오버, 평균 진정한 범위 (ATR) 및 가격 채널을 포함한 여러 기술적 지표를 결합하여 완전한 거래 시스템을 구축합니다. 프로그래밍 구현을 통해 트리플 바닥 리바운드 패턴의 자동 식별과 거래 실행을 달성합니다.

전략 원칙

핵심 논리는 다음의 핵심 요소들을 포함합니다. 1. 시장 트렌드 방향을 확인하기 위해 빠른 (5주기) 및 느린 (20주기) 이동 평균 크로스오버를 사용하여 2. 자동으로 세 개의 연속적인 낮은 점 (low1, low2, low3) 을 식별하여 세 개의 바닥 패턴을 형성합니다. 3. 변동성을 계산하고 동적 스톱 로스 및 영리 레벨을 설정하기 위해 ATR 지표를 활용 4. 가격이 3번째 하위점 이후 이전 리바운드 고위점 이상으로 돌파할 때 긴 엔트리 신호를 확인하고, MA 크로스오버 신호와 결합 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)

관련

더 많은