이 전략의 핵심 아이디어는 RSI 지표의 평형 기간을 동적으로 만들어 가격과 동력 사이의 상관관계에 따라 자동으로 조정하여 RSI 지표의 유용성을 향상시키는 것입니다.
이 전략은 먼저 가격의 동력을 계산하고, 그 다음 가격과 동력 사이의 상관 계수를 계산합니다. 상관 계수가 1에 가까워지면 가격과 동력이 매우 긍정적으로 상관된다는 것을 의미합니다. 상관 계수가 -1에 가까워지면 가격과 동력이 매우 부정적으로 상관된다는 것을 의미합니다.
가격과 동력 사이의 상관관계에 따라 RSI 지표의 평형 기간을 조정할 수 있습니다. 상관관계가 높을 때 더 짧은 RSI 기간을 사용합니다. 상관관계가 낮을 때 더 긴 RSI 기간을 사용합니다.
구체적으로, 이 전략은 RSI 기간 범위를 기본적으로 20-50로 설정합니다. 가격과 추진력 사이의 상관 계수를 계산한 후 선형 지도를 사용하여 상관 계수를 최종 RSI 평형 기간으로 20-50 범위에 매핑합니다.
이는 RSI 매개 변수를 시장 조건에 따라 자동으로 조정할 수 있게 한다. 가격 변화와 동력 변화가 밀접하게 상관관계가 있을 때, 짧은 기간 RSI가 더 민감하게 작용하기 위해 사용된다. 상관관계가 약할 때, 더 긴 기간 RSI가 신호에 미치는 잡음의 영향을 줄이기 위해 사용된다.
역동적으로 RSI 평형 기간을 조정하는 아이디어는 배울 가치가 있지만 구체적인 구현에는 개선할 여지가 있습니다. 핵심은 RSI 매개 변수 선택에 영향을 미치는 결정적인 요소를 식별하고 수치화 가능한 지표로 변환하는 것입니다. 또한, 모델에만 의존하지 말고 매개 변수 범위의 경험적 최적화가 필요합니다. 전반적으로 이것은 추가 최적화 및 개선 후 실용적인 잠재력을 가진 매우 혁신적인 아이디어입니다.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 ) // +++++++++++++++++++++ // ++ INPUT ++ // +++++++++++++++++++++ // Momentum len = input.int(10, "Momentum Length", 1, group = "Dynamic RSI Momentum") src = input.source(close, "Source", group = "Dynamic RSI Momentum") min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum") max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum") upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum") dnLvl = input.float(30, "OverSold", 0, 100, group = "Dynamic RSI Momentum") // +++++++++++++++++++++ // ++ CALCULATION ++ // +++++++++++++++++++++ // RMA Function rmaFun(src, len) => sma = ta.sma(src, len) alpha = 1/len sum = 0.0 sum := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1]) // RSI Function rsiFun(src, len) => 100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / rmaFun(src[1] - src > 0 ? src[1] - src : 0, len)) // Momentum momVal = src - src[len] // Calculation Price vs Momentum corr = ta.correlation(src, momVal, len) corr := corr > 1 or corr < -1 ? float(na) : corr rsiLen = 0 rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0)) rsiMom = rsiFun(src, rsiLen) // +++++++++++++++++++++ // ++ STRATEGY ++ // +++++++++++++++++++++ long = ta.crossover(rsiMom, dnLvl) short = ta.crossunder(rsiMom, upLvl) // +++> Long <+++++ if long and not na(rsiMom) strategy.entry("Long", strategy.long) // +++> Short <+++++ if short and not na(rsiMom) strategy.entry("Short", strategy.short) // +++++++++++++++++++++ // ++ PLOT ++ // +++++++++++++++++++++ plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow) hline(50, "Mid Line", color.gray) upperLine = hline(upLvl, "Upper Line", color.gray) lowerLine = hline(dnLvl, "Lower Line", color.gray) fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")