因此,我一直试图复制tradingview的rsi值,方法是自己将其硬编码为一个小项目,但没有效果。我试图做的是与通常复制的价值观有点不同,因为我没有在相同的时间框架内操作。我试图复制rsi的值(它在较小的时间范围内)而不是图表(在更大的时间范围内)。
在这里,您可以找到我的代码:
def kline_subtraction(kline, i, period_path):
if kline == "low":
low = get_low(period_path,i)
low_a = get_low(period_path,i + 1)
p_diff = get_procental_diff(low, low_a) # low - low_a
return p_diff
else:
high = get_high(period_path, i)
high_a = get_high(period_path, i + 1)
p_diff = get_procental_diff(high, high_a) # high - high_a
return p_diff
def average_upward_downward_movement(m, period_, n, direction, kline, period_path):
curr_up_mov = 0
curr_down_mov = 0
p_diff_low = kline_subtraction("low", m, period_path)
p_diff_high = kline_subtraction("high", m, period_path)
p_diff_green = []
p_diff_red = []
i = 8
j = 0
counter = 0
if n == 1:
while counter < period_:
p_diff = kline_subtraction(kline, i, period_path)
if p_diff > 0:
p_diff_green.append(abs(p_diff))
else:
p_diff_red.append(abs(p_diff))
counter += 1
i += 8
pre_avg_up = sum(p_diff_green) / period_
pre_avg_down = sum(p_diff_red) / period_
if direction == "up":
return pre_avg_up
else:
return pre_avg_down
if direction == "up":
if p_diff_low > 0:
curr_up_mov = p_diff_low
else:
curr_down_mov = abs(p_diff_low)
curr_mov = p_diff_low
avg_ = (curr_up_mov + ((period_ - 1) * average_upward_downward_movement(m+1, period_, n - 1, direction, kline, period_path))) / period_
return avg_
else:
if p_diff_high > 0:
curr_up_mov = p_diff_high
else:
curr_down_mov = abs(p_diff_high)
curr_mov = p_diff_high
avg_ = (curr_down_mov + ((period_ - 1) * average_upward_downward_movement(m + 1, period_, n - 1, direction,
kline, period_path))) / period_
return avg_
def rsi_calculation(m, period_, period_path):
global l_a
global b
global s
i = 0
j = 1
p_diff_green = []
p_diff_red = []
curr_up_mov = 0
curr_down_mov = 0
if l_a == "buy":
avg_up = average_upward_downward_movement(m, period_, period_, "up", "low", period_path)
avg_down = average_upward_downward_movement(m, period_, period_, "down", "low", period_path)
rs = avg_up/avg_down
rsi = 100 - (100 / (1 + rs))
return rsi
else:
avg_up = average_upward_downward_movement(m, period_, period_, "up", "high", period_path)
avg_down = average_upward_downward_movement(m, period_, period_, "down", "high", period_path)
rs = avg_up / avg_down
rsi = 100 - (100 / (1 + rs))
return rsi"m“表示我使用的klines作为基本数据的索引。"third_period_path“指的是保存在特定时间框架的.txt文件中的klines (datapoints)。
这是我试图实现的一个例子: 2022-03-22 11:00 RSI: 72.03
我的结果是: 2022-03-22 :00 11:00 RSI: 65.46
我不介意这些值是否有点"off“,但它们甚至不是在相同的序列中(就像以前的rsi高于或低于当前的rsi那样)。我已经成功地复制了其他指标(MACD、Bollinger波段等)。虽然他们的价值观有一点偏差,但他们的工作是正确的。
任何帮助或指向正确方向的指针都将不胜感激,因为我看不到我在哪里搞错了代码。
发布于 2022-09-02 06:03:19
请尝试下面的公式,关键的区别是在计算相对强度时使用指数平均而不是简单平均。
import numpy as np
def RSI(dataset, n):
delta = dataset.diff().dropna()
u = delta * 0
d = u.copy()
u[delta > 0] = delta[delta > 0]
d[delta < 0] = -delta[delta < 0]
u[u.index[n-1]] = np.mean( u[:n] ) #first value is sum of avg gains
u = u.drop(u.index[:(n-1)])
d[d.index[n-1]] = np.mean( d[:n] ) #first value is sum of avg losses
d = d.drop(d.index[:(n-1)])
rs = u.ewm(n,min_periods=0,adjust=False,ignore_na=False).mean() / \
d.ewm(n,min_periods=0,adjust=False,ignore_na=False).mean()
rsi = 100 - 100 / (1 + rs)
rsi = pd.DataFrame(rsi)
rsi.rename(columns={'close':'rsi_'+str(n)}, inplace = True)
return rsihttps://stackoverflow.com/questions/72927375
复制相似问题