확률적 모멘텀 지수와 RSI를 기반으로 한 양적 전략


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

확률적 모멘텀 지수와 RSI를 기반으로 한 양적 전략

개요

이 전략은 주로 Stochastic Momentum Index (SMI) 와 상대적으로 강한 지수 (RSI) 를 기반으로 한다. 또한, 컬러 필터와 K선 엔티티 필터가 보조 판단 조건으로 추가되었다. SMI와 RSI 지표의 다공간 신호를 기반으로, 필터 조건과 결합하여 거래 신호를 발산한다. 이 전략은 시장의 단선 거래 기회를 효과적으로 발견할 수 있다.

전략 원칙

이 전략의 핵심은 SMI와 RSI의 두 지표에 의존하여 판단한다. SMI는 주가가 과매매되고 있는지 판단하고 RSI는 주가가 상대적으로 강하다는 판단을 한다. 둘 다 동시에 구매 신호를 주면 구매 작업을 수행한다. 구체적인 논리는 다음과 같습니다:

  1. SMI 과매매 (하위 하위), 구매 신호로 간주
  2. RSI가 하락하면 구매 신호입니다.
  3. SMI 과매매와 RSI가 동시 상대적 하위치보다 낮을 때 구매 신호를 발산합니다.
  4. 공허 신호 판단 논리 비슷한

또한, 이 전략은 이중 신호 모드를 설정한다. 이 모드는 SMI와 RSI가 동시에 신호를 내야 거래를 할 수 있다. 이것은 가짜 신호를 효과적으로 줄일 수 있다.

또한, 이 전략은 색상 필터와 K선 엔티티 필터를 추가한다. 이 두 필터는 K선 엔티티가 더 크도록 요구하며, 마지막 K선 엔티티의 종료 가격은 개시 가격보다 높다. 이것은 거래의 가짜 돌파구를 추가적으로 방지할 수 있다.

전략적 이점

  1. SMI를 사용하여 과매매를 판단하고 RSI 판단은 상대적으로 약하며, 이중 확인은 가짜 신호를 줄일 수 있습니다.
  2. 이중 신호 모드를 설정하여 유효하지 않은 거래를 크게 줄일 수 있습니다
  3. 컬러 필터와 K선 엔티티 필터는 가짜 돌파구를 효과적으로 필터링 할 수 있습니다.
  4. 전략 실행 논리는 명확하고 간단합니다.
  5. 대부분의 변수는 사용자 정의 가능합니다.

위험과 최적화

  1. SMI와 RSI가 개별 지표로 사용되면 더 많은 가짜 신호가 발생할 수 있으므로 주의해야 합니다.
  2. 이중 신호 모드에서, 변수가 잘못 설정되면, 더 좋은 거래 기회를 놓칠 수 있습니다.
  3. 다양한 주기적 변수 아래의 전략 수익 상황을 테스트할 수 있으며, 최적의 변수 조합을 찾습니다.
  4. 시뮬레이션 또는 재검토를 통해 특정 절댓값 매개 변수의 설정
  5. 더 많은 필터 최적화 전략을 고려할 수 있습니다.

요약하다

이 전략은 SMI와 RSI의 두 지표의 신호를 통합하여, 이중 확인을 통해 거래 지시문을 발송한다. 동시에 색 필터와 K선 엔티티 필터를 설정하면 가짜 돌파구를 필터링 할 수 있다. 이 전략의 운영 논리는 간단하고 명확하며, 대부분의 매개 변수를 사용자 정의 할 수 있다. 매개 변수를 조정하면 더 나은 전략 수익 성과를 얻을 수 있다.

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

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
//avgrel = ema(ema(rdiff,b),b)
//avgdiff = ema(ema(diff,b),b)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()