RSI 과매도 탄력적 양적 전략과 동적 ATR 손절매

RSI SMA ATR TP SL
생성 날짜: 2024-11-29 16:18:55 마지막으로 수정됨: 2024-11-29 16:18:55
복사: 0 클릭수: 453
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

RSI 과매도 탄력적 양적 전략과 동적 ATR 손절매

개요

이 전략은 RSI 오버셀 신호와 동적 ATR 스톱을 기반으로 한 정량 거래 시스템이다. 이 전략은 RSI 지표의 오버셀 신호와 200 일간 평균 선과 결합된 일일 라인 레벨 데이터를 사용하여 시장 오버셀 할 때 반발 기회를 잡는다. 이 전략은 동적 ATR 스톱과 정적 비율 스톱 손실의 이중 보호 장치를 채택하고 세 개의 수익 목표를 설정하여 분기적 인 포지 감소를 통해 수익을 극대화한다.

전략 원칙

전략의 핵심 논리에는 다음과 같은 핵심 요소가 포함됩니다.

  1. 입시 신호: RSI ((5) 가 30의 초과 판매 수준보다 낮고 가격이 200일 평균선 위에 있을 때, 시스템은 더 많은 신호를 낸다.
  2. 손해 차단 메커니즘: 1.5배의 ATR ((20) 의 동적 차단과 25%의 고정 차단을 결합한 이중 메커니즘.
  3. 이윤 목표: 5%, 10%, 15%의 3개의 목표 지점을 설정하고, 목표가 달성될 때 각각 33%, 66% 및 100%의 지분을 줄인다.
  4. 포지션 관리: 케일리 코디컬을 사용하여 계산된 포지션의 59.13%를 사용하거나 포지션의 75%를 보존하여 거래하는 것이 좋습니다.

전략적 이점

  1. 이중 트렌드 확인: RSI 오버셀과 평균선 트렌드 이중 검증을 통해 거래 승률을 높인다.
  2. 유연한 위험 제어: 동적 ATR 상쇄는 시장의 변동에 따라 적응할 수 있으며, 고정 상쇄는 마지막 방어선을 제공합니다.
  3. 지능적인 수익 관리: 세 가지 목표 지표와 분기 하락, 수익의 일부를 고정 할 수 있지만 큰 시장을 놓치지 않습니다.
  4. 재무 관리 과학: 케일리 원칙을 적용하여 포지션을 최적화하여 위험과 수익 사이의 균형을 이룬다.

전략적 위험

  1. 트렌드 의존성: 전략은 흔들리는 시장에서 자주 스톱 손실을 유발할 수 있다. 추천: 위조 신호를 필터링하는 진동 지표를 추가할 수 있습니다.

  2. 큰 스톱: 25%의 고정 스톱은 한 번에 너무 큰 손실을 초래할 수 있습니다. 추천: 개인의 위험 부담에 따라 손해배상 비율을 조정하십시오.

  3. 철회 위험: 분기 수익은 강세를 보인 상황에서 조기 감축될 수 있다. 추천: 수익 목표를 동적으로 조정하거나, 일부 포지션을 트렌드 추적으로 유지할 수 있습니다.

전략 최적화 방향

  1. 신호 최적화:
  • 수량 확인
  • MACD와 같은 트렌드 지표와 함께
  • 변동성 필터 소개
  1. 스탠드 로즈 최적화
  • 동적 중지 손실 비율을 달성
  • 시간 손실을 증가
  • 이윤/손실 필터
  1. 이윤 최적화:
  • ATR 기반의 동적 설정 목표 지점
  • 추적 중지 구현
  • 최적화 하락 비율

요약하다

이 전략은 RSI 과매매 신호와 평행선 트렌드 필터링을 결합하여 동적 ATR 중지 및 3 배 수익 목표와 함께 완전한 거래 시스템을 구축합니다. 전략의 장점은 위험 통제가 유연하고 수익 관리가 합리적이지만 실제 시장 상황과 개인 위험 선호에 따라 최적의 조정이 필요합니다. 신호 시스템, 중지 메커니즘 및 수익 전략의 지속적인 개선을 통해 시스템은 실제 거래 디스크에서 더 나은 성과를 낼 것으로 기대됩니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA/4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © wielkieef

//@version=5
strategy("Simple RSI stock Strategy [1D] ", overlay=true, pyramiding=1, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=75, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0.03)

// Rsi
oversoldLevel = input(30, title="Oversold Level")
overboughtLevel = input(70, title="Overbought Level")
rsi = ta.rsi(close, 5)
rsi_overbought = rsi > overboughtLevel  
rsi_oversold = rsi < oversoldLevel

// Sma 200
lenghtSMA = input(200, title = "SMA lenght")
sma200 = ta.sma(close, lenghtSMA)

// ATR stop-loss
atrLength = input.int(20, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Multiplier")
atrValue = ta.atr(atrLength)
var float long_stop_level = na
var float short_stop_level = na
var float tp1_level = na
var float tp2_level = na
var float tp3_level = na

// Strategy entry
long = (rsi_oversold ) and close > sma200 

// Take Profit levels
tp_1 = input.float(5.0, "TP 1", minval=0.1, step=0.1)
tp_2 = input.float(10.0, "TP 2", minval=0.2, step=0.1)
tp_3 = input.float(15.0, "TP 3", minval=0.3, step=0.1)

if long
    strategy.entry('Long', strategy.long)
    long_stop_level := close - atrMultiplier * atrValue
    tp1_level := strategy.position_avg_price * (1 + tp_1 / 100)
    tp2_level := strategy.position_avg_price * (1 + tp_2 / 100)
    tp3_level := strategy.position_avg_price * (1 + tp_3 / 100)

// basic SL - this code is from author RafaelZioni, modified by wielkieef
sl = input.float(25.0, 'Basic Stop Loss %', step=0.1)
per(procent) =>
    strategy.position_size != 0 ? math.round(procent / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)

// ATR SL
if (strategy.position_size > 0 and (close <= long_stop_level))
    strategy.close("Long")
    tp1_level := na
    tp2_level := na
    tp3_level := na
plot(long_stop_level, color=color.orange, linewidth=2, title="Long Stop Loss")

// TP levels
if (strategy.position_size > 0)
    if (not na(tp1_level) and close >= tp1_level)
        tp1_level := na
    if (not na(tp2_level) and close >= tp2_level)
        tp2_level := na
    if (not na(tp3_level) and close >= tp3_level)
        tp3_level := na

plot(strategy.position_size > 0 and not na(tp1_level) ? tp1_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 1")
plot(strategy.position_size > 0 and not na(tp2_level) ? tp2_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 2")
plot(strategy.position_size > 0 and not na(tp3_level) ? tp3_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 3")

// Strategy exit points for Take Profits
strategy.exit('TP 1', from_entry="Long", qty_percent=33, profit=per(tp_1), loss=per(sl))
strategy.exit('TP 2', from_entry="Long", qty_percent=66, profit=per(tp_2), loss=per(sl))
strategy.exit('TP 3', from_entry="Long", qty_percent=100, profit=per(tp_3), loss=per(sl))

// by wielkieef