양방향의 변동성 흡수 전략

저자:차오장, 날짜: 2023-11-21 12:04:19
태그:

img

전반적인 설명

이 전략은 변동성을 추적하는 이방향 거래 전략이다. 평균 진정한 범위 (ATR) 지표를 사용하여 스톱 손실을 설정하고 스톱 손실 수준을 깨는 가격에 따라 트렌드 방향을 결정합니다. 트렌드 방향이 변경되면 역 포지션을 개척합니다.

전략 논리

이 전략은 변동성을 계산하기 위해 3일 ATR을 사용합니다. 계수와 곱한 ATR 값은 스톱 로스 수준으로 사용됩니다. 가격이 스톱 로스 수준 이상일 때 상승 추세로 판단하고 가격이 스톱 로스 수준 이하로 떨어지면 긴 포지션을 닫습니다. 가격이 스톱 로스 수준 이하일 때 하락 추세로 판단하고 가격이 스톱 로스 수준 이상으로 상승할 때 짧은 포지션을 닫습니다. 트렌드가 변할 때 역 포지션을 여는 것입니다. 트렌드 중에 스톱 로스 수준이 최적화되고 트렌드가 변할 때 재설정됩니다.

이점 분석

  • ATR을 사용하여 시장 변동성을 동적으로 추적하고 스톱 로스 타격 가능성을 줄입니다.
  • 시장 변동으로 인한 양방향 거래 수익
  • 더 높은 승률을 위해 트렌드 변화의 초기 반전 포지션을 개설합니다.

위험 분석

  • 극심한 변동성은 ATR 지연으로 인해 스톱 로스가 실패할 수 있습니다.
  • 긴 포지션에 GAP 리스크가 존재합니다.
  • 작은 수익을 자주 거래 할 수 있습니다.

위험을 완화하기 위해: 더 넓은 스톱 레벨에 대한 ATR 계수를 높이고, 거래 빈도를 제한하고, 최소한의 수익을 취하는 수준을 설정합니다.

최적화 방향

  • 트렌드 변화 신호를 위해 다른 지표를 결합하십시오.
  • ATR 매개 변수를 최적화
  • 트레이드 사이즈 컨트롤 추가

요약

이 전략은 전체적으로 안정적인 쌍방향 트레일링 스톱 전략이다. ATR은 드라우다운을 제어하기 위해 동적 스톱 레벨을 설정한다. 쌍방향 거래는 또한 수익 가능성을 증가시킨다. 추가적인 최적화는 전략을 더 견고하게 만들 수 있으며, 트렌드 추적 능력을 향상시킬 수 있다.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("BCH Swinger v1", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100)

/////////////////////////////////////////////////////////////
//START - SET DATE RANGE

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year")
ToMonth   = input(defval = 10, title = "To Month", minval = 1)
ToDay     = input(defval = 01, title = "To Day", minval = 1)
ToYear    = input(defval = 2020, title = "To Year")

startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1)
endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
withinTimeRange = true

/////////////////////////////////////////////////////////////
//END - SET DATE RANGE



/////////////////////////////////////////////////////////////
//START - INDICATORS

length = input(3)
mult = input(1, minval = 0.01)
atr_ = atr(length)
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
is_uptrend_prev = nz(is_uptrend[1], true)
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2)

/////////////////////////////////////////////////////////////
//END - INDICATORS



/////////////////////////////////////////////////////////////
//START - TRADING RULES
direction = input(defval=1, title = "Strategy Direction",  minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

condition1 = close > vstop and withinTimeRange
condition2 = close < vstop and withinTimeRange

strategy.entry("BUY", strategy.long, when = condition1)
strategy.entry("SELL", strategy.short, when = condition2)

/////////////////////////////////////////////////////////////
//END - TRADING RULES

더 많은