first, this is pinescript code
length = 10
src = close
min_rsi = 20
max_rsi = 50
rmaFun(src, length) =>
sma = ta.sma(src, length)
alpha = 1/length
sum = 0.0
sum := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])
rsiFun(src, length) =>
100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, length) /
rmaFun(src[1] - src > 0 ? src[1] - src : 0, length))
momVal = src - src[length]
corr = ta.correlation(src, momVal, length)
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)
and this is my python code
def rma(series, length):
sma = series.rolling(window=length).mean()
alpha = 1 / length
rma = sma.copy()
for i in range(length, len(series)):
rma.iloc[i] = alpha * series.iloc[i] + (1 - alpha) * rma.iloc[i - 1]
return rma
def rsiFun(series, length):
delta = series.diff()
gain = np.where(delta > 0, delta, 0)
loss = np.where(delta < 0, -delta, 0)
avg_gain = rma(pd.Series(gain), length)
avg_loss = rma(pd.Series(loss), length)
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return rsi
momentum_length = 10
min_rsi = 20
max_rsi = 50
df['momentum'] = df['close'] - df['close'].shift(momentum_length)
df['corr'] = df['close'].rolling(momentum_length).corr(df['momentum'])
df['rsiLen'] = min_rsi + ((1 - df['corr']) * (max_rsi - min_rsi) / 2).round(0)
df['rsiLen'] = df['rsiLen'].fillna(0).astype(int)
df['rsiMom'] = 0.0
for i in range(len(df)):
if df.at[i, 'rsiLen'] > 0 and i >= df.at[i, 'rsiLen']:
rsi_len = df.at[i, 'rsiLen']
df.at[i, 'rsiMom'] = rsiFun(df['close'][:i+1], rsi_len).iloc[-1]
I tried to convert, but the result of ‘rsiMom’ is different. Can someone help me get the code that produces the same result?
All other results are same, but only the result of ‘rsiMom’ is different.
New contributor
son is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.