트렌드 역전 전략 (RSI Trend Reversal Strategy) 은 상대 강도 지수 (RSI) 와 평균 참 범위 (ATR) 를 기반으로 한 양적 거래 전략이다. 빠른 시장 변동에 적응하고 트렌드 역전 기회를 포착하기 위해 수익을 취하고 손실을 중지 (TP/SL) 하는 수준을 동적으로 조정한다. 전략은 변동성을 측정하기 위해 ATR과 결합하여 RSI 주위를 중심으로 두 가지 적응 역동 밴드를 구축하고 있다. 이 전략은 독립적으로 또는 다른 전략에 대한 수익을 취하고 손실을 중지하는 모듈로 사용될 수 있다. 테슬라 (TSLA), 애플 (AAPL), 그리고 엔비디아 (NDAV) 등의 주식의 15분 데이터에서 잘 테스트되었다.
RSI 트렌드 역전 전략의 핵심은 동적인 TP/SL 대역의 구축에 있다. 먼저, 사용자 지정 최고_자례 및 최저_자례 함수를 사용하여 마지막 크로스오버 이후 최고 및 최저 가격을 찾아 대역의 기초를 형성한다. 그 다음, 사용자가 지정한 길이로 RSI와 ATR을 계산하고 다음과 같은 계산을 수행한다.
여기서, 곱셈은 사용자 정의 대역 확장 요인이다. 가격이 상단 범위를 넘으면 길게 갈 것이고, 하단 범위를 넘으면 짧게 갈 것이다. 이 두 대역의 색상 또한 대역에 대한 가격의 위치에 따라 변화하여 쉽게 관찰할 수 있다.
RSI 트렌드 역전 전략은 TP/SL 포인트를 동적으로 조정하고 시장 변화에 신속히 대응할 수 있는 적응형 대역을 구축하기 위해 RSI와 ATR을 활용한다. 전략은 명확한 논리, 광범위한 적용 가능성, 그리고 양적 거래자에게 강력한 도구가 될 수 있다. 그러나 실제 사용에서는 여전히 매개 변수 선택과 위험 통제에 주의를 기울여야 하며, 전반적인 성능을 향상시키기 위해 다른 지표 신호와 결합하여 사용하는 것이 좋습니다. 전략은 트렌드 필터와 매개 변수 최적화와 같은 최적화를 위한 추가 공간을 갖추고 있다. 전반적으로, RSI 트렌드 역전 전략은 양적 거래에 간단하면서도 효과적인 접근 방식을 제공한다.
/*backtest start: 2023-04-22 00:00:00 end: 2024-04-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false) //INPUTS rsi_length = input.int(title = "Lenght", defval = 8) rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05) lookback = input.int(title = "Delay to prevent idealization", defval = 1) sltp = input.float(title = "Minimum Difference", defval = 10) src = input.source(title = "Source Input", defval = close) //PARAMETERS INITILIZATION hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src) //FUNCTION INITILIZATION highest_custom(src, length) => x = src for i = 0 to length if src[i] > x x := src[i] x lowest_custom(src, length) => x = src for i = 0 to length if src[i] < x x := src[i] x rsilev(src, length, mult, sltp) => sl = (100 - sltp) / 100 tp = (100 + sltp) / 100 var bool crossup = na var bool crossdown = na var float dir = na dir_change = ta.change(dir) var float BearGuy = 0 BullGuy = ta.barssince(crossup or crossdown) if na(BullGuy) BearGuy += 1 else BearGuy := BullGuy var float upper = na var float lower = na rsilower = ta.rsi(src, length) rsiupper = math.abs(ta.rsi(src, length) - 100) atr = ta.atr(length) / src lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy) upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy) var float thresh = na if na(thresh) thresh := lower if na(dir) dir := 1 if crossdown dir := -1 if crossup dir := 1 if dir == 1 thresh := lower if dir == -1 thresh := upper crossup := ta.crossover(src, thresh) crossdown := ta.crossunder(src, thresh) thresh rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp) //PLOTTING var color col = color.lime if hclose > rsiclose col := color.lime if hclose < rsiclose col := color.red plot(rsiclose, linewidth = 2, color = col) //STRATEGY buy = ta.crossover(hclose, rsiclose) sell = ta.crossunder(hclose, rsiclose) if buy[lookback] strategy.entry("long", strategy.long) if sell[lookback] strategy.entry("Short", strategy.short)