ATR 및 ADX를 기반으로 한 다이나믹한 3라인 브레이크아웃 트레이딩 전략

ATR ADX SL TP
생성 날짜: 2025-02-21 09:23:20 마지막으로 수정됨: 2025-02-27 17:20:50
복사: 2 클릭수: 405
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

ATR 및 ADX를 기반으로 한 다이나믹한 3라인 브레이크아웃 트레이딩 전략 ATR 및 ADX를 기반으로 한 다이나믹한 3라인 브레이크아웃 트레이딩 전략

개요

이 전략은 고전적인 3선 돌파구 형태를 기반으로 한 고급 거래 시스템으로, ADX 트렌드 확인 지표와 ATR 동적 스톱스톱 메커니즘을 통합하여 전체적인 거래 솔루션을 제공합니다. 전략의 핵심은 3개의 연속 동향 K선 이후의 돌파구 형태를 식별하고, 트렌드 강도 확인과 함께 정확한 거래 신호 생성을 구현하는 것입니다.

전략 원칙

전략은 세 가지 핵심 메커니즘을 기반으로 작동합니다. 첫째는 고전적인 삼선 돌파 형태를 식별하는 것으로, 우익 형태 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

전략적 이점

  1. 신호 확인 메커니즘 개량: 여러 기술 지표 (K선 형태, ADX, ATR) 를 조합하여 신호 신뢰성을 향상
  2. 위험 관리 지능화: 시장의 변동성에 따라 자동으로 조정할 수 있는 ATR 기반의 동적 스톱/스트로드 설정
  3. 고도로 사용자 정의 가능: ADX 미지수, ATR 주기 등과 같은 여러 핵심 매개 변수의 조정 옵션을 제공합니다.
  4. 트렌드 추적 강화: ADX 필터링은 강력한 트렌드 환경에서만 입장을 보장합니다.
  5. 코드 구조가 명확하다: 모듈화 설계가 유지보수 및 확장하기 편리하다

전략적 위험

  1. 형태 인식 지연: 3선 돌파 형태 확인을 위해 4개의 K선 완료가 필요하며, 출입 시간 지연을 초래할 수 있다.
  2. 가짜 브레이크 위험: 불안한 시장에서 가짜 브레이크 신호가 발생할 수 있습니다.
  3. ADX 지연성: 동향 확인 지표로서, ADX 자체는 지연성이 있다.
  4. 스톱 손실 크기의 고려: ATR 기반의 스톱 손실 설정은 급격한 변동 시 너무 크거나 너무 작을 수 있습니다.
  5. 시장 환경 의존성: 전략이 트렌드 시장에서 더 잘 작동하고, 흔들림 시장에서는 덜 효과적일 수 있다.

전략 최적화 방향

  1. 신호 필터링 강화: 수량 확인 메커니즘을 추가하여 신호 신뢰도를 높일 수 있다.
  2. 동적 매개 변수 최적화: 적응 메커니즘을 도입하여 ADX 값과 ATR 주기를 동적으로 조정
  3. 진입 시점 최적화: 가격 구조와 결합할 수 있다.
  4. 포지션 관리 개선: 변동율 기반의 동적 포지션 관리 메커니즘을 추가
  5. 시장 환경 인식: 시장 환경 분류 논리를 추가하여 다른 시장 조건에서 다른 파라미터 설정을 사용합니다.

요약하다

이 전략은 고전적인 3선 돌파구 형태와 현대 기술 지표를 결합하여 이론적 기초와 실용성을 겸비한 거래 시스템을 만듭니다. 그것의 핵심 장점은 다중 신호 확인 메커니즘과 지능화된 위험 관리에 있습니다. 그러나 사용 시 시장 환경에 대한 적합성 및 변수 최적화에 주의를 기울여야 합니다. 제안된 최적화 방향에 의해, 전략에는 추가로 향상 될 여지가 있습니다.

전략 소스 코드
/*backtest
start: 2024-08-05 00:00:00
end: 2024-12-24 00:00:00
period: 5h
basePeriod: 5h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

// Copyright ...
// Based on the TMA Overlay by Arty, converted to a simple strategy example.
// Pine Script v5

//@version=5
strategy(title='3 Line Strike [TTF] - Strategy with ATR and ADX Filter',
     shorttitle='3LS Strategy [TTF]',
     overlay=true,
     initial_capital=100000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=100,
     pyramiding=0)

// -----------------------------------------------------------------------------
//                               INPUTS
// -----------------------------------------------------------------------------

// ATR and ADX Inputs
atrLength = input.int(title='ATR Length', defval=14, group='ATR & ADX')
adxLength = input.int(title='ADX Length', defval=14, group='ATR & ADX')
adxThreshold = input.float(title='ADX Threshold', defval=25, group='ATR & ADX')

// ### 3 Line Strike
showBear3LS = input.bool(title='Show Bearish 3 Line Strike', defval=true, group='3 Line Strike',
     tooltip="Bearish 3 Line Strike (3LS-Bear) = 3 zelené sviečky, potom veľká červená sviečka (engulfing).")
showBull3LS = input.bool(title='Show Bullish 3 Line Strike', defval=true, group='3 Line Strike',
     tooltip="Bullish 3 Line Strike (3LS-Bull) = 3 červené sviečky, potom veľká zelená sviečka (engulfing).")

// -----------------------------------------------------------------------------
//                          CALCULATIONS
// -----------------------------------------------------------------------------

// Calculate ATR
atr = ta.atr(atrLength)

// Calculate ADX components manually
tr = ta.tr(true)
plusDM = ta.change(high) > ta.change(low) and ta.change(high) > 0 ? ta.change(high) : 0
minusDM = ta.change(low) > ta.change(high) and ta.change(low) > 0 ? ta.change(low) : 0
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)
smoothedTR = ta.rma(tr, adxLength)

plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, adxLength)

// Helper Functions
getCandleColorIndex(barIndex) =>
    int ret = na
    if (close[barIndex] > open[barIndex])
        ret := 1
    else if (close[barIndex] < open[barIndex])
        ret := -1
    else
        ret := 0
    ret

isEngulfing(checkBearish) =>
    sizePrevCandle = close[1] - open[1]
    sizeCurrentCandle = close - open
    isCurrentLargerThanPrevious = math.abs(sizeCurrentCandle) > math.abs(sizePrevCandle)

    if checkBearish
        isGreenToRed = (getCandleColorIndex(0) < 0) and (getCandleColorIndex(1) > 0)
        isCurrentLargerThanPrevious and isGreenToRed
    else
        isRedToGreen = (getCandleColorIndex(0) > 0) and (getCandleColorIndex(1) < 0)
        isCurrentLargerThanPrevious and isRedToGreen

isBearishEngulfing() => isEngulfing(true)
isBullishEngulfing() => isEngulfing(false)

is3LSBear() =>
    is3LineSetup = (getCandleColorIndex(1) > 0) and (getCandleColorIndex(2) > 0) and (getCandleColorIndex(3) > 0)
    is3LineSetup and isBearishEngulfing()

is3LSBull() =>
    is3LineSetup = (getCandleColorIndex(1) < 0) and (getCandleColorIndex(2) < 0) and (getCandleColorIndex(3) < 0)
    is3LineSetup and isBullishEngulfing()

// Signals
is3LSBearSig = is3LSBear() and adx > adxThreshold
is3LSBullSig = is3LSBull() and adx > adxThreshold

// Take Profit and Stop Loss
longTP = close + 2 * atr
longSL = close - 1 * atr
shortTP = close - 2 * atr
shortSL = close + 1 * atr

// -----------------------------------------------------------------------------
//                          STRATEGY ENTRY PRÍKAZY
// -----------------------------------------------------------------------------
if (showBull3LS and is3LSBullSig)
    strategy.entry("3LS_Bull", strategy.long, comment="3LS Bullish")
    strategy.exit("Exit Bull", from_entry="3LS_Bull", limit=longTP, stop=longSL)

if (showBear3LS and is3LSBearSig)
    strategy.entry("3LS_Bear", strategy.short, comment="3LS Bearish")
    strategy.exit("Exit Bear", from_entry="3LS_Bear", limit=shortTP, stop=shortSL)