RSI 동적 스톱 손실 및 수익 전략

저자:차오장, 날짜: 2024-03-19 15:54:01
태그:

img

전략 개요: 이 전략은 RSI 지표와 가격 사이의 관계를 기반으로 하며, 수익을 취하고 손실을 멈추는 수준을 동적으로 조정함으로써 거래 성능을 최적화합니다. 전략의 주요 아이디어는 RSI 지표의 과잉 구매 및 과잉 판매 특성을 가격 및 거래량 변화와 결합하여 RSI가 분리가 될 때 적시에 수익을 취하는 동시에 동적 스톱 손실을 통해 위험을 제어하는 것입니다.

전략 원칙:

  1. RSI 지표의 값을 계산하고 입력 매개 변수에 기초하여 과잉 구매 및 과잉 판매 임계치를 결정합니다.
  2. 현재 RSI 값을 이전 몇 개의 촛불의 RSI 값과 비교하여 피크 형성 (isPeak) 또는 바닥 형성 (isBottom) 이 나타나는지 판단하십시오.
  3. 피크 형성이 나타나면, 현재 가격이 이전 피크의 최고보다 높고 거래 부피가 이전 피크의 거래 부피보다 작으면 판매 신호가 생성됩니다.
  4. 바닥 형성이 나타나면, 현재 가격이 이전 바닥의 최저보다 낮고 거래 부피가 이전 바닥의 거래 부피보다 작으면 구매 신호가 생성됩니다.
  5. 구매 신호가 발사된 후, 가격이 이전 바닥의 최저 수준으로 다시 올라가거나 거래량이 이전 바닥의 거래량보다 작을 때 수익을 취합니다.
  6. 판매 신호가 발사된 후, 가격이 이전 피크의 최고 수준으로 상승하거나 거래량이 이전 피크의 거래량보다 작을 때 수익을 취합니다.
  7. 포지션을 열고 나면 위험 조절을 위해 오픈 가격의 특정 비율 (2%) 로 스톱 로스 가격을 설정합니다.

전략적 장점:

  1. 이윤을 동적으로 취득함으로써 이윤은 트렌드 반전 초기에는 적시에 잠금되어 전략 수익을 향상시킬 수 있습니다.
  2. 거래량 변화를 보조 판단 조건으로 사용하면 잘못된 신호를 효과적으로 필터링하고 신호 정확도를 향상시킬 수 있습니다.
  3. 스톱 손실을 설정하면 단일 거래의 위험 노출을 효과적으로 제어하고 전략 마감량을 줄일 수 있습니다.
  4. 매개 변수는 조정 가능하며 다른 시장 환경과 거래 종류에 적용됩니다.

전략 위험:

  1. 측면 시장에서 RSI 지표는 자주 과잉 구매 및 과잉 판매 신호를 생성하여 전략이 더 많은 잘못된 신호를 생성 할 수 있습니다.
  2. 스톱 손실을 설정하면 전략이 단기적으로 큰 마이너 다운을 경험하게 될 수 있습니다.
  3. 트렌드 시장에서의 전략의 성과는 트렌드를 따르는 전략만큼 좋지 않을 수 있습니다.

최적화 방향:

  1. 신호의 신뢰성을 높이기 위해 MACD, 볼링거 밴드 등과 같은 다른 기술 지표를 도입하는 것을 고려하십시오.
  2. 이윤을 취하고 손실을 멈추는 기준을 최적화하고 다른 품종과 시장 환경의 특성에 따라 동적으로 조정합니다.
  3. 포지션 관리 모듈을 추가하여 시장 변동성과 계정 위험 상태에 따라 포지션 크기를 조정합니다.
  4. 최적의 매개 변수 조합을 찾기 위해 전략에 매개 변수 최적화를 수행합니다.

요약: 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")

더 많은