RSI 동적 손절매 및 이익 실현 전략


생성 날짜: 2024-03-19 15:54:01 마지막으로 수정됨: 2024-03-19 15:54:01
복사: 1 클릭수: 309
1
집중하다
1166
수행원

RSI 동적 손절매 및 이익 실현 전략

전략 요약: 이 전략은 RSI 지표와 가격 사이의 관계를 기반으로, 동적으로 중지 중지 지점을 조정하여 거래 성과를 최적화합니다. 전략의 주요 아이디어는 RSI 지표의 과매매 과매매 특성을 활용하여 가격과 거래량 변화를 결합하여 RSI가 이탈하는 경우 적시에 중지하고 동적으로 중지 중지하여 위험을 제어하는 것입니다.

전략적 원칙:

  1. RSI 지표의 값을 계산하고 입력된 변수에 따라 과매매와 과매매의 마이너스를 결정합니다.
  2. 현재 RSI 값과 앞의 K 선의 RSI 값을 비교하여 상위 형태 ((isPeak) 또는 하위 형태 ((isBottom) 를 판단합니다.
  3. 꼭대기 형태가 발생했을 때, 현재 가격이 이전 꼭대기의 최고점보다 높고 거래량이 이전 꼭대기의 거래량보다 작으면 판매 신호가 발생한다.
  4. 바닥 형태가 발생했을 때, 현재 가격이 이전 바닥의 낮은 지점보다 낮고 거래량이 이전 바닥의 거래량보다 작으면 구매 신호가 발생한다.
  5. 구매 신호가 트리거된 후, 가격이 이전 하위점으로 되돌아가거나 이전 하위점보다 거래량이 작을 때 정지한다.
  6. 팔기 신호가 발동된 후, 가격이 이전 최고점으로 부딪히거나 거래량이 이전 최고점보다 작을 때 정지한다.
  7. 포지션 개시 후, 포지션 개시 가격의 일정한 비율로 스톱 손실 가격을 설정하여 ((2%)), 위험을 제어한다.

전략적 장점:

  1. 동적 스톱을 통해, 트렌드 반전의 초기에는 적시에 수익을 잠금할 수 있으며, 전략적 수익을 향상시킬 수 있다.
  2. 트래픽 변화를 보조 판단 조건으로 활용하여 가짜 신호를 효과적으로 필터링하여 신호의 정확성을 향상시킬 수 있다.
  3. 스톱로스 설정은 단일 거래의 리스크 을 효과적으로 제어하고, 전략적 철수를 감소시킨다.
  4. 변수는 조정 가능하며, 다른 시장 환경과 거래 품종에 적용된다.

전략적 위험:

  1. 불안정한 시장에서 RSI 지표는 자주 오버 바이 오버 셀 신호가 발생할 수 있으며, 이는 전략이 더 많은 가짜 신호를 생성하도록 만듭니다.
  2. 스톱로스 설정은 전략이 단기간에 큰 회수로 이어질 수 있다.
  3. 트렌드형 시장에서 트렌드 추적 전략보다 덜 효과가 있을 수 있다.

최적화 방향:

  1. 신호의 신뢰성을 높이기 위해 MACD, 브린 밴드 등과 같은 다른 기술 지표를 도입하는 것을 고려할 수 있습니다.
  2. 정지 손실의 절댓값을 최적화하여, 다양한 품종의 특성과 시장 환경의 동력에 따라 조정한다.
  3. 포지션 관리 모듈을 추가하여 시장의 변동성과 계좌의 위험 상태에 따라 포지션 크기를 조정합니다.
  4. 전략에 대한 변수 최적화를 통해 최적의 변수 조합을 찾습니다.

결론: RSI 다이내믹 스톱포드 전략은 RSI 지표와 가격의 이탈 관계를 통해 거래량 변화를 합성하여 트렌드 초기에 신속한 스톱포드를 설정하고 동시에 트렌드 반전의 초기 수익을 잠금 할 수 있으며 전략의 회귀를 줄일 수 있으며 약간의 적응력을 가지고 있습니다. 그러나 불안정한 시장에서이 전략은 더 많은 거짓 신호가 발생할 수 있으므로 다른 기술 지표와 최적화된 스톱포드 값을 도입하여 전략의 성능을 향상시킬 필요가 있습니다. 또한 포지션 관리 및 변수 최적화는 전략의 안정성과 수익을 향상시키는 중요한 방향입니다.

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

//@version=4
strategy("RMM_byMR", overlay=true)

// RSI uzunluğu girişi
rsiLength = input(14, title="RSI Uzunluğu")

// Tepe ve dip seviyeleri için girişler
overboughtLevel = input(70, title="Aşırı Alım Seviyesi")
oversoldLevel = input(30, title="Aşırı Satım Seviyesi")

// RSI hesaplama
rsiValue = rsi(close, rsiLength)

// Son tepe noktalarını tespit etme // Son dip noktalarını tespit etme
isPeak = rsiValue[2] > overboughtLevel and rsiValue[2] > rsiValue[1] and rsiValue[2] > rsiValue[3] and (rsiValue[1] > rsiValue or rsiValue[3] > rsiValue[4])
isBottom = rsiValue[2] < oversoldLevel and rsiValue[2] < rsiValue[1] and rsiValue[2] < rsiValue[3] and (rsiValue[1] < rsiValue or rsiValue[3] < rsiValue[4])

// Önceki tepe noktalarını tespit etme
prevPeak = valuewhen(isPeak, rsiValue[2], 1)
prevPeakHighPrice = valuewhen(isPeak, high[2], 1)
volumePeak = valuewhen(isPeak, volume[1]+volume[2]+volume[3], 1)
prevPeakBarIndex = valuewhen(isPeak, bar_index, 1)

// Önceki dip noktalarını tespit etme
prevBottom = valuewhen(isBottom, rsiValue[2], 1)
prevBottomLowPrice = valuewhen(isBottom, low[2], 1)
volumeBottom = valuewhen(isBottom, volume[1]+volume[2]+volume[3], 1)
prevBottomBarIndex = valuewhen(isBottom, bar_index, 1)

// Tepe noktasında satış sinyali
isSellSignal = prevPeakBarIndex > prevBottomBarIndex and isPeak and rsiValue[2] < prevPeak and high[2] > prevPeakHighPrice and (volume[1]+volume[2]+volume[3]) < volumePeak
isBuyTakeProfit = isPeak and ((rsiValue[2] < prevPeak and high[2] > prevPeakHighPrice) or (rsiValue[2] < prevPeak and (volume[1]+volume[2]+volume[3]) < volumePeak))

// Dip noktasında alış sinyali
isBuySignal = prevBottomBarIndex > prevPeakBarIndex and isBottom and rsiValue[2] > prevBottom and low[2] < prevBottomLowPrice and (volume[1]+volume[2]+volume[3]) < volumeBottom
isSellTakeProfit = isBottom and ((rsiValue[2] > prevBottom and low[2] < prevBottomLowPrice) or (rsiValue[2] > prevBottom and (volume[1]+volume[2]+volume[3]) < volumeBottom))

sellTakeProfit = valuewhen(isSellTakeProfit, low, 1)
buyTakeProfit = valuewhen(isBuyTakeProfit, high, 1)

// isSellTakeProfit koşulu için işaretlemeyi yap
plotshape(isSellTakeProfit, style=shape.triangleup, location=location.abovebar, color=color.green, size=size.small, title="Sell Take Profit", offset=-2) 

// isBuyTakeProfit koşulu için işaretlemeyi yap
plotshape(isBuyTakeProfit, style=shape.triangledown, location=location.belowbar, color=color.red, size=size.small, title="Buy Take Profit", offset=-2)

buyComment = "Buy \n Rsi:" + tostring(round(rsiValue[2], 2)) + " \n Low:" + tostring(round(low[2],2)) + " \n Hacim:" + tostring(round(volume[1]+volume[2]+volume[3],2))
sellComment = "Sell \n Rsi:" + tostring(round(rsiValue[2], 2)) + " \n High:" + tostring(round(high[2],2)) + " \n Hacim:" + tostring(round(volume[1]+volume[2]+volume[3],2)) 

// Alış sinyali durumunda uzun pozisyon aç
if (isBuySignal)
    strategy.entry("Buy", strategy.long, comment = buyComment )
    strategy.exit("SL", "Buy", stop=close * 0.98)

// Satış sinyali durumunda kısa pozisyon aç
if (isSellSignal)
    strategy.entry("Sell", strategy.short, comment = sellComment )
    strategy.exit("SL","Sell", stop=close * 1.02)
// Limit değerini sonradan belirleme


// Alış sinyali durumunda uzun pozisyon kapat
if (isBuyTakeProfit)
    strategy.close("Buy", comment="TP")

// Satış sinyali durumunda kısa pozisyon kapat
if (isSellTakeProfit)
    strategy.close("Sell", comment="TP")