이 전략의 핵심 아이디어는 RSI 지표의 평형 주기를 동적으로 만들고, 가격과 동력의 상관관계에 따라 자동으로 조정하여 RSI 지표의 실용성을 개선하는 것입니다.
이 전략은 우선 가격의 동력을 계산하고, 다음에는 가격과 동력 사이의 상관관계 계수를 계산한다. 상관관계 계수가 1에 가까워지면 가격과 동력이 매우 긍정적으로 연관되어 있음을 나타냅니다. 상관관계 계수가 1에 가까워지면 가격과 동력이 매우 부정적으로 연관되어 있음을 나타냅니다.
가격과 동력의 상관관계에 따라 RSI 지표의 평형 주기 길이를 조정할 수 있다. 상관관계가 높을 때 짧은 RSI 주기를 사용한다. 상관관계가 낮을 때 긴 RSI 주기를 사용한다.
구체적으로, 이 전략은 RSI 주기의 길이를 20-50의 범위로 설정합니다. 가격과 동력의 관련 계수를 계산한 후, 선형적 지도 방법을 통해 관련 계수를 20-50의 범위로 RSI의 최종 평형 주기의 길이가됩니다.
이렇게하면 시장 상황에 따라 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")