RSI 지표를 기반으로 한 추세 추종 손절매 전략


생성 날짜: 2023-12-12 15:46:49 마지막으로 수정됨: 2023-12-12 15:46:49
복사: 0 클릭수: 1051
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

RSI 지표를 기반으로 한 추세 추종 손절매 전략

개요

이 전략은 RSI 지표 기반의 트렌드 추적 중지 전략이라고 합니다. 이 전략은 RSI 지표를 사용하여 과매매 상황을 판단하고, 빠른 느린 MA 지표와 결합하여 트렌드 방향을 판단하고, 입문 조건을 설정합니다. 또한 비율 추적 중지 메커니즘을 사용하여, 중지 탈퇴를 구현합니다.

전략 원칙

이 전략은 주로 RSI 지표와 MA 지표를 통해 진입 시기를 판단한다. RSI 지표 파라미터는 2 주기로 설정되어, 과매매 과매매 상황을 판단한다. 급속한 MA는 각각 50 주기와 200 주기로 설정되어, 트렌드 방향을 판단한다. 구체적인 진입 논리는 다음과 같다:

다수 입점: 빠른 MA에서 느린 MA를 입고, 느린 MA보다 가격이 높으며, RSI가 초과 지역 (기본 10%) 보다 낮을 때 더 많이 입는 것;
공허 입시: 빠른 MA 아래에서 느린 MA를 통과하고, 느린 MA보다 가격이 낮으며, RSI가 초고 구매 영역 (설정 90%) 보다 높을 때 공허 .

또한, 전략은 선택 가능한 변동율 필터를 설정한다. 필터는 MA의 기울기 차원을 빠르게 계산하고, 차원이 설정된 차원을 초과할 때만 포지션을 열는다. 이는 가격 변동 기간이 명확하지 않은 방향에서 포지션을 열지 않도록 하기 위한 것이다.

exit에서, 전략은 퍼센트 추적 스톱 방식을 사용합니다. 입력된 스톱의 퍼센트에 따라, 점프 가격 차이와 결합하여 스톱 가격을 계산하여 동적으로 조정 스톱을 구현합니다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. RSI 지표의 매개 변수는 2주기로 설정되어 있으며, 초과 구매와 초과 판매 상황을 빠르게 포착하여 역전 기회를 판단할 수 있습니다.
  2. MA는 트렌드 방향과 전환점을 효과적으로 식별할 수 있습니다.
  3. RSI와 MA 이중 지표 판단을 결합하여 가짜 브레이크를 피할 수 있다.
  4. 변동율 필터를 설정하여 시장의 방향이 명확하지 않은 시기를 필터링 할 수 있습니다.
  5. 백분율 추적 스톱 방식은 시장의 변동성에 따라 스톱 폭을 조정하여 위험을 효과적으로 제어 할 수 있습니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. RSI와 MA 지표는 다소 뒤쳐져 있으며, 반전 기회를 놓칠 수 있습니다.
  2. %의 정지 손실은 축축 하락에 의해 촉발됩니다.
  3. 야반과 디스크 앞의 큰 변동을 효과적으로 처리할 수 없는 품종.

위와 같은 위험에는 다음과 같은 측면에서 최적화할 수 있습니다.

  1. RSI 파라미터를 1주기로 조정하여 지연을 줄일 수 있습니다.
  2. 다양한 품종 특성에 따라 MA 주기 파라미터를 조정한다.
  3. 스피드 레벨의 비율을 조정하여 스피드 레벨과 흔들림 허용을 고려합니다.

전략 최적화 방향

이 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. 거래량 지표와 같은 다른 지표 판단을 추가하여 가짜 돌파구를 피하십시오.
  2. 기계 학습 모델 판단을 증가시키고, 모델 예측 결과를 사용하여 의사 결정을 보조한다.
  3. 이윤회복과 포지션 관리를 최적화하여 전략 수익률을 더욱 향상시킵니다.
  4. 야간 디스크와 디스크 전의 변동 필터링 메커니즘을 설정한다. 변동의 폭에 따라 다음 거래 날의 결정에 참여하는지 설정한다.

요약하다

이 전략은 전체적으로 좀 더 안정적인 트렌드 추적 전략이다. 이 전략은 RSI와 MA 이중 지표 판단과 결합하여 일정 수준의 안정성을 보장하면서도 명확한 트렌드 반전 기회를 잡을 수 있다. 동시에 변동율 필터를 설정하면 부분적인 위험을 피할 수 있으며, 퍼센트 중지 방식은 단위 손실을 효과적으로 제어할 수 있다. 이 전략은 여러 품종에 대한 일반적인 전략으로 사용할 수 있으며, 특정 품종에 대한 매개 변수 조정 및 모델 최적화를 통해 더 나은 전략 효과를 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// Scalping strategy
// © Lukescream and Ninorigo
// (original version by Lukescream - lastest versions by Ninorigo) - v1.3
//

//@version=4
strategy(title="Scalping using RSI 2 indicator", shorttitle="RSI 2 Strategy", overlay=true, pyramiding=0, process_orders_on_close=false)

var bool ConditionEntryL = false
var bool ConditionEntryS = false


//***********
// Costants
//***********
def_start_date = timestamp("01 Jan 2021 07:30 +0000")
def_end_date   = timestamp("01 Dec 2024 07:30 +0000")

def_rsi_length = 2
def_overbought_value = 90
def_oversold_value   = 10

def_slow_ma_length = 200
def_fast_ma_length = 50
def_ma_choice      = "EMA"

def_tick   = 0.5
def_filter = true

def_trailing_stop = 1


//***********
// Change the optional parameters
//***********
start_time  = input(title="Start date", defval=def_start_date, type=input.time)
end_time    = input(title="End date", defval=def_end_date, type=input.time)
// RSI
src         = input(title="Source", defval=close, type=input.source)
rsi_length  = input(title="RSI Length", defval=def_rsi_length, minval=1, type=input.integer)
overbought_threshold = input(title="Overbought threshold", defval=def_overbought_value, type=input.float)
oversold_threshold   = input(title="Oversold threshold", defval=def_oversold_value, type=input.float)
// Moving average
slow_ma_length = input(title="Slow MA length", defval=def_slow_ma_length, type=input.integer)
fast_ma_length = input(title="Fast MA length", defval=def_fast_ma_length, type=input.integer)
ma_choice = input(title="MA choice", defval="EMA", options=["SMA", "EMA"])
// Input ticker
tick   = input(title="Ticker size", defval=def_tick, type=input.float)
filter = input(title="Trend Filter", defval=def_filter, type=input.bool)
// Trailing stop (%)
ts_rate = input(title="Trailing Stop %", defval=def_trailing_stop, type=input.float)


//***********
// RSI
//***********
// Calculate RSI
up   = rma(max(change(src), 0), rsi_length)
down = rma(-min(change(src), 0), rsi_length)
rsi = (down == 0 ? 100 : (up == 0 ? 0 : 100-100/(1+up/down)))


//***********
// Moving averages
//***********
slow_ma = (ma_choice == "SMA" ? sma(close, slow_ma_length) : ema(close, slow_ma_length))
fast_ma = (ma_choice == "SMA" ? sma(close, fast_ma_length) : ema(close, fast_ma_length))
// Show the moving averages
plot(slow_ma, color=color.white,  title="Slow MA")
plot(fast_ma, color=color.yellow, title="Fast MA")


//***********
// Strategy
//***********
if true
    // Determine the entry conditions (only market entry and market exit conditions)
    // Long position
    ConditionEntryL := (filter == true ? (fast_ma > slow_ma and close > slow_ma and rsi < oversold_threshold) : (fast_ma > slow_ma and rsi < oversold_threshold))
    // Short position
    ConditionEntryS := (filter == true ? (fast_ma < slow_ma and close < slow_ma and rsi > overbought_threshold) : (fast_ma < slow_ma and rsi > overbought_threshold))
   
    // Calculate the trailing stop
    ts_calc = close * (1/tick) * ts_rate * 0.01

    // Submit the entry orders and the exit orders
    // Long position
    if ConditionEntryL
        strategy.entry("RSI Long", strategy.long)
    // Exit from a long position
    strategy.exit("Exit Long", "RSI Long", trail_points=0, trail_offset=ts_calc)

    // Short position 
    if ConditionEntryS
        strategy.entry("RSI Short", strategy.short)
    // Exit from a short position
    strategy.exit("Exit Short", "RSI Short", trail_points=0, trail_offset=ts_calc)

// Highlights long conditions
bgcolor (ConditionEntryL ? color.navy : na, transp=60, offset=1, editable=true, title="Long position band")
// Highlights short conditions
bgcolor (ConditionEntryS ? color.olive : na, transp=60, offset=1, editable=true, title="Short position band")