동적 추세 추종 전략

ATR
생성 날짜: 2024-06-03 16:57:51 마지막으로 수정됨: 2024-06-03 16:57:51
복사: 4 클릭수: 628
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

동적 추세 추종 전략

개요

이 전략은 Supertrend 지표를 사용하여 시장의 흐름을 포착한다. Supertrend 지표는 가격과 변동률을 결합하고, 지표선이 녹색일 때 상승세를 나타내고, 빨간색일 때 하락세를 나타낸다. 전략은 지표선의 색상의 변화를 감지하여 매매 신호를 생성하며, 지표선을 동적인 중지 지점으로 사용한다. 전략은 또한 전략의 성능을 최적화하기 위해 이동 중지 및 고정 중지 논리를 도입한다.

전략 원칙

  1. 수퍼트렌드 지표의 상류 (up) 와 하류 (dn) 를 계산하고, 상류 (up) 와 하류 (dn) 의 관계에 따라 현재 트렌드 방향 (trend) 을 판단한다.
  2. 트렌드가 하락 (-1) 으로부터 상승 (-1) 으로 바뀌었을 때, 구매 신호 (buySignal) 를 생성한다. 트렌드가 상승 (-1) 으로부터 하락 (-1) 으로 바뀌었을 때, 판매 신호 (sellSignal) 를 생성한다.
  3. 구매 신호를 생성할 때, 더 많은 것을 하고, 하향 경로 ((dn) 를 손실 지점으로 설정합니다. 판매 신호를 생성할 때, 공백을 하고, 상향 경로 ((up) 를 손실 지점으로 설정합니다.
  4. 이동식 스톱 로직을 도입하여, 가격이 상승/하락할 때 특정 점수 (trailingValue) 가 있을 때, 스톱 리스트를 위/아래로 이동시켜 스톱 보호를 실현한다.
  5. 고정 스톱 로직을 도입하여, 추세가 변하면, 평행이 수익으로 끝납니다.

전략적 이점

  1. 적응성: 슈퍼트렌드 지표는 가격과 변동성을 결합하여 다른 시장 상태와 거래 유형에 적응할 수 있습니다.
  2. 동적 중지: 지표선을 동적 중지 지점으로 사용하여 위험을 효과적으로 제어하고 손실을 줄일 수 있습니다.
  3. 이동 중지: 이동 중지 논리를 도입하여 추세가 지속되는 동안 수익을 보호하고 전략의 수익성을 향상시킬 수 있습니다.
  4. 명확한 신호: 전략에서 생성된 구매/판매 신호는 명확하고, 조작 및 실행이 쉽다.
  5. 매개 변수 유연성: 전략의 매개 변수 (ATR 주기, ATR 곱하기 등) 는 시장 특성과 거래 스타일에 따라 조정될 수 있어 적응력을 높일 수 있다.

전략적 위험

  1. 매개 변수 위험: 서로 다른 매개 변수 설정으로 인해 전략 성능에 큰 차이가 발생할 수 있으며 충분한 재검토와 매개 변수 최적화가 필요합니다.
  2. 흔들리는 시장 위험: 흔들리는 시장에서, 빈번한 트렌드 변화가 전략이 더 많은 거래 신호를 생성하도록 만들 수 있으며, 거래 비용과 슬라이드 포인트 위험을 증가시킵니다.
  3. 추세 변동 위험: 시장 추세가 급격히 변할 때, 전략이 너무 늦어질 수 있으며, 이로 인해 손실이 커질 수 있습니다.
  4. 과도한 최적화 위험: 전략에 대한 과도한 최적화는 곡선 적합으로 이어져 미래 시장에서 좋지 않은 성과를 낼 수 있습니다.

전략 최적화 방향

  1. 다중 시간 프레임 분석을 도입하여 트렌드의 안정성을 확인하고, 불안정한 시장에서 자주 거래되는 것을 줄여줍니다.
  2. 다른 기술적인 지표나 기본적 요소와 결합하여 트렌드 판단의 정확도를 높여줍니다.
  3. 다이내믹 스톱 또는 리스크 수익률을 도입하는 것과 같은 스톱 손실 및 스톱 로직을 최적화하여 전략의 수익률을 향상시킵니다.
  4. 매개 변수의 안정성 테스트를 실시하고, 다양한 시장 상태에서 좋은 성능을 유지할 수 있는 매개 변수 조합을 선택한다.
  5. 포지션 관리 및 자금 관리 규칙을 도입하여 개별 거래 위험과 전체 위험을 통제하십시오.

요약하다

동적 트렌드 추적 전략은 슈퍼트렌드 지표를 사용하여 시장 추세를 포착하고, 동적 스톱 및 모바일 스톱으로 손실을 제어하고, 고정 스톱을 사용하여 수익을 잠금합니다. 이 전략은 적응력이 강하고, 신호가 명확하며, 작동하기 쉽습니다. 그러나 실제 응용에서는 파라미터 최적화, 흔들림 시장 위험 및 트렌드 돌림 위험과 같은 문제에 주의를 기울여야합니다. 다중 시간 프레임 분석, 최적화 스톱 로직 파라미터, 수적 안정성 테스트와 같은 조치를 도입하여 전략의 성과와 안정성을 더욱 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Supertrend Strategy', overlay=true, format=format.price, precision=2)
Periods = input.int(title='ATR Period', defval=10)
src = input.source(hl2, title='Source')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0)
changeATR = input.bool(title='Change ATR Calculation Method ?', defval=true)
showsignals = input.bool(title='Show Buy/Sell Signals ?', defval=true)
highlighting = input.bool(title='Highlighter On/Off ?', defval=true)

// ATR calculation
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2

// Supertrend calculations
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn

// Trend direction
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Plotting
upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title='UpTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))

dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title='DownTrend Begins', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))

// Highlighting
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? trend == 1 ? color.green : color.white : color.white
shortFillColor = highlighting ? trend == -1 ? color.red : color.white : color.white
fill(mPlot, upPlot, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, dnPlot, title='DownTrend Highligter', color=shortFillColor, transp=90)

// Alerts
alertcondition(buySignal, title='SuperTrend Buy', message='SuperTrend Buy!')
alertcondition(sellSignal, title='SuperTrend Sell', message='SuperTrend Sell!')
changeCond = trend != trend[1]
alertcondition(changeCond, title='SuperTrend Direction Change', message='SuperTrend has changed direction!')

// Pip and trailing stop calculation
pips = 50
pipValue = syminfo.mintick * pips
trailingPips = 10
trailingValue = syminfo.mintick * trailingPips

// Strategy
if (buySignal)
    strategy.entry("Long", strategy.long, stop=dn, comment="SuperTrend Buy")
if (sellSignal)
    strategy.entry("Short", strategy.short, stop=up, comment="SuperTrend Sell")

// Take profit on trend change
if (changeCond and trend == -1)
    strategy.close("Long", comment="SuperTrend Direction Change")
if (changeCond and trend == 1)
    strategy.close("Short", comment="SuperTrend Direction Change")

// Initial Stop Loss
longStopLevel = up - pipValue
shortStopLevel = dn + pipValue

// Trailing Stop Loss
var float longTrailStop = na
var float shortTrailStop = na

if (strategy.opentrades > 0)
    if (strategy.position_size > 0)  // Long position
        if (longTrailStop == na or close > strategy.position_avg_price + trailingValue)
            longTrailStop := high - trailingValue
        strategy.exit("Stop Loss Long", from_entry="Long", stop=longTrailStop)
    if (strategy.position_size < 0)  // Short position
        if (shortTrailStop == na or close < strategy.position_avg_price - trailingValue)
            shortTrailStop := low + trailingValue
        strategy.exit("Stop Loss Short", from_entry="Short", stop=shortTrailStop)

// Initial Exit
strategy.exit("Initial Stop Loss Long", from_entry="Long", stop=longStopLevel)
strategy.exit("Initial Stop Loss Short", from_entry="Short", stop=shortStopLevel)