동적 추세 반전과 확률적 지표를 결합한 적응형 거래 전략

ZigZag ATR SMA STOCH TP/SL
생성 날짜: 2025-02-21 13:37:41 마지막으로 수정됨: 2025-02-27 17:00:50
복사: 1 클릭수: 370
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

동적 추세 반전과 확률적 지표를 결합한 적응형 거래 전략 동적 추세 반전과 확률적 지표를 결합한 적응형 거래 전략

개요

이 전략은 ZigZag 퍼센티지 반전과 무작위 지표를 결합한 자기 적응 거래 시스템이다. 그것은 시장의 변동성을 동적으로 계산하여 중요한 반전점을 식별하고 무작위 지표 오버 바이 오버 셀 신호와 결합하여 거래 시간을 결정한다. 전략은 자동 스톱 손실 메커니즘을 통합하여 위험을 효과적으로 관리 할 수 있다.

전략 원칙

전략의 핵심은 비율 역전 방법을 통해 시장 추세를 동적으로 추적하는 것입니다. 그것은 사용자가 수동으로 역전 비율을 설정하거나 다른 주기 (~ 5 ~ 250 일) 에 기반한 ATR의 동적 계산을 선택할 수 있습니다. 가격이 역전선을 뚫고 무작위 지표 K 값이 30 이하일 때 멀티 신호를 생성합니다. 가격이 역전선을 뚫고 K 값이 70 이상일 때 휴식 신호를 생성합니다. 시스템은 수익을 보호하고 위험을 제어하기 위해 자동으로 스톱 손실을 설정합니다.

전략적 이점

  1. 역동적으로 적응하는 회전 계산 방법을 사용하여 다양한 시장 환경에 더 잘 적응할 수 있습니다.
  2. 트렌드 반전 및 동력 지표와 결합하여 더 신뢰할 수 있는 거래 신호를 제공합니다.
  3. 내장된 Stop Loss 메커니즘, 트레이더가 자동으로 위험을 관리할 수 있도록 도와줍니다.
  4. 유연한 변수 설정으로 트레이더가 개인 거래 스타일에 따라 최적화 할 수 있습니다.
  5. 분석과 의사결정을 위한 시각화된 거래 신호 표시

전략적 위험

  1. 위기 시장에서 빈번한 잘못된 신호가 발생할 수 있습니다.
  2. ATR 주기의 선택은 전략의 성과에 영향을 미칩니다.
  3. 고정 스톱 스톱 손실은 모든 시장 환경에 적합하지 않을 수 있습니다.
  4. 무작위 지표는 특정 시장 조건에서 지연될 수 있습니다.
  5. 과도한 거래를 피하기 위해 합리적인 매개 변수 설정이 필요합니다.

전략 최적화 방향

  1. 다중 시간 프레임 분석을 도입하여 신호 신뢰성을 향상시킵니다.
  2. 동적으로 스톱 스톱 손실 수준을 조정하여 시장의 변동에 더 잘 적응합니다.
  3. 확인 신호로 거래량 지표를 추가합니다.
  4. 자율적 임의 지표 변수를 개발
  5. 트렌드 강도를 높여서 필터로 가짜 신호를 줄여

요약하다

이것은 기술 분석의 고전적인 도구를 결합한 현대적인 거래 전략이다. ZigZag 역전, 무작위 지표 및 위험 관리를 통합하여 거래자에게 포괄적인 거래 시스템을 제공합니다. 전략의 사용자 정의가 강하여 다양한 위험 선호를 가진 거래자의 사용에 적합합니다. 지속적인 최적화 및 매개 변수는 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-06-04 00:00:00
end: 2025-02-19 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("[RS]ZigZag Percent Reversal with Stochastic Strategy", overlay=true)

// ZigZag Settings
string percent_method = input.string(
         defval="MANUAL", 
         title="Method to use for the zigzag reversal range:", 
         options=[
             "MANUAL", 
             "ATR005 * X", "ATR010 * X", "ATR020 * X", "ATR050 * X", "ATR100 * X", "ATR250 * X"
             ]
         )

var float percent = input.float(
         defval=0.25, 
         title="Percent of last pivot price for zigzag reversal:", 
         minval=0.0, maxval=99.0
         ) / 100

float percent_multiplier = input.float(
         defval=1.0, 
         title="Multiplier to apply to ATR if applicable:"
         )
if percent_method == "ATR005 * X"
    percent := ta.atr(5) / open * percent_multiplier
if percent_method == "ATR010 * X"
    percent := ta.atr(10) / open * percent_multiplier
if percent_method == "ATR020 * X"
    percent := ta.atr(20) / open * percent_multiplier
if percent_method == "ATR050 * X"
    percent := ta.atr(50) / open * percent_multiplier
if percent_method == "ATR100 * X"
    percent := ta.atr(100) / open * percent_multiplier
if percent_method == "ATR250 * X"
    percent := ta.atr(250) / open * percent_multiplier

// Zigzag function
f_zz(_percent)=>
    // Direction
    var bool _is_direction_up = na
    var float _htrack = na
    var float _ltrack = na
    var float _pivot = na
    float _reverse_range = 0.0
    var int _real_pivot_time = na
    var int _htime = na
    var int _ltime = na
    var float _reverse_line = na
    
    if bar_index >= 1
        
        if na(_is_direction_up)
            _is_direction_up := true
        
        _reverse_range := nz(_pivot[1]) * _percent
        
        if _is_direction_up
            _ltrack := na
            _ltime := time
            
            if na(_htrack)
                if high > high[1]
                    _htrack := high
                    _htime := time
                else
                    _htrack := high[1]
                    _htime := time[1]
            else
                if high > _htrack
                    _htrack := high
                    _htime := time

            _reverse_line := _htrack - _reverse_range
            
            if close <= _reverse_line
                _pivot := _htrack
                _real_pivot_time := _htime
                _is_direction_up := false

        if not _is_direction_up
            _htrack := na
            _htime := na
            
            if na(_ltrack)
                if low < low[1]
                    _ltrack := low
                    _ltime := time
                else
                    _ltrack := low[1]
                    _ltime := time[1]
            else
                if low < _ltrack
                    _ltrack := low
                    _ltime := time
                
            _reverse_line := _ltrack + _reverse_range
            
            if close >= _reverse_line
                _pivot := _ltrack
                _real_pivot_time := _ltime
                _is_direction_up := true

    [_pivot, _is_direction_up, _reverse_line, _real_pivot_time]

[pivot, direction_up, reverse_line, pivot_time] = f_zz(percent)

// Reversal line
var float static_reverse_line = na
if (not na(reverse_line))
    static_reverse_line := reverse_line

plot(series=static_reverse_line, color=color.gray, style=plot.style_line, title="Reversal Line", trackprice=false)

// Stochastic Settings
K_length = input.int(9, title="Stochastic K Length", minval=1)  // User input
K_smoothing = input.int(3, title="Stochastic K Smoothing", minval=1)  // User input
stochK = ta.sma(ta.stoch(close, high, low, K_length), K_smoothing)

// User Input: Take Profit and Stop Loss Levels
stop_loss_pips = input.int(100, title="Stop Loss (pips)", minval=1)  // Stop Loss
take_profit_pips = input.int(300, title="Take Profit (pips)", minval=1)  // Take Profit

// Calculating levels
long_stop_loss = close - stop_loss_pips * syminfo.mintick
long_take_profit = close + take_profit_pips * syminfo.mintick
short_stop_loss = close + stop_loss_pips * syminfo.mintick
short_take_profit = close - take_profit_pips * syminfo.mintick

// Buy and Sell Conditions
buy_signal = close > static_reverse_line and stochK < 30  // K < 30 condition
sell_signal = close < static_reverse_line and stochK > 70  // K > 70 condition

if buy_signal
    strategy.entry("Buy", strategy.long)
    strategy.exit("TP/SL", "Buy", stop=long_stop_loss, limit=long_take_profit)

if sell_signal
    strategy.entry("Sell", strategy.short)
    strategy.exit("TP/SL", "Sell", stop=short_stop_loss, limit=short_take_profit)

// Signal Visualization
plotshape(series=buy_signal, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY", textcolor=color.white)
plotshape(series=sell_signal, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL", textcolor=color.white)