이것은 ATR 스톱을 사용하는 모멘텀 기술을 기반으로 한 일간 인터벌 스윙 트레이딩 전략입니다. 이것은 Stably의 코리 호랑이 만들었습니다.
이 전략은 동력 지표를 사용하여 트렌드 방향을 파악하고 ATR에 기반한 스톱 로스 라인을 설정하여 낮은 구매-높은 판매 스윙 거래를 구현합니다.
코드는 먼저 백테스팅 시간대를 설정합니다.
그 다음, 지표 섹션에서는 다음 지표들을 계산합니다.
트렌드를 판단하는 주된 논리는 다음과 같습니다.
만약 클로저가 이전 상향 스톱 로스 라인 입점보다 높다면, 그것은 상승 추세로 판단됩니다. 만약 클로저가 이전 상향 스톱 로스 라인 입점보다 낮다면, 그것은 하락 추세로 판단됩니다.
트렌드가 바뀌면, 스톱 로스 라인 위치를 조정하세요.
특히, 상승세에서는 스톱 로스 라인을 이전 바의 가장 높은 가격과 ATR 값을 빼고, 하락세에서는 스톱 로스 라인을 이전 바의 가장 낮은 가격과 ATR 값을 더하여 설정합니다.
이것은 스톱 로스를 따르는 트렌드를 실현합니다.
거래 규칙 섹션에서는 가격이 스톱 로스 라인을 넘으면 긴/단기 포지션을 개척합니다.
이 전략의 장점:
또한 몇 가지 위험이 있습니다.
몇 가지 최적화:
이 전략을 최적화하는 몇 가지 방향:
다양한 ATR 매개 변수를 테스트하여 최적을 찾습니다. 여러 매개 변수 세트를 테스트하고 수익/위험 비율을 평가합니다.
ATR 위에 변동성 메트릭을 결합하여 스톱 로스를 최적화합니다. 변동성 메트릭을 추가하고, 변동성이 증가하는 기간 동안 스톱 로스를 적절히 완화하십시오.
트렌드 필터를 추가하여 불안한 시장에서 거래를 피합니다. 트렌드 판단 지표를 추가하여 트렌드가 명확한 경우에만 거래하십시오.
포지션 사이즈 메커니즘을 추가합니다. 계정 활용률, 연속 스톱 로스 시간 등에 따라 포지션 크기를 조정합니다.
오버나이트 게프 리스크 통제를 추가합니다. 오버나이트 게프 리스크를 피하기 위해 시장 폐쇄 전에 손실을 적극적으로 절감하십시오.
기본적인 일일 스윙 트레이딩 전략으로서, 전체적인 논리는 명확합니다. 이 운동 기법으로 트렌드를 판단하고 ATR을 트레일링 스톱 로스로 활용하여 위험을 효과적으로 제어합니다.
여전히 최적화 할 수있는 넓은 공간, 트렌드 판단, 중지 손실 방법, 위치 사이징 등과 같은 측면에서 전략을 더 실용적으로 만들기 위해 개선 할 수 있습니다. 전체적으로이 전략은 양적 거래에 대한 견고한 틀을 제공합니다.
/*backtest start: 2023-01-29 00:00:00 end: 2024-02-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("BTC Swinger", 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 = 2010, title = "From Year") ToMonth = input(defval = 12, title = "To Month", minval = 1) ToDay = input(defval = 31, 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