def calculate_adx(high, low, close):
up = high.diff()
down = -low.diff()
plus_array = []
minus_array = []
for index in up.index:
if up.isna()[index] is True:
plus_array.append(pd.NA)
elif up[index] > down[index] and up[index] > 0:
plus_array.append(up[index])
else:
plus_array.append(0)
for index in down.index:
if down.isna()[index] is True:
minus_array.append(pd.NA)
elif down[index] > up[index] and down[index] > 0:
minus_array.append(down[index])
else:
minus_array.append(0)
plus_dm = pd.Series(plus_array)
minus_dm = pd.Series(minus_array)
tr1 = pd.DataFrame(high - low)
tr2 = pd.DataFrame(abs(high - close.shift(1)))
tr3 = pd.DataFrame(abs(low - close.shift(1)))
frames = [tr1, tr2, tr3]
tr = pd.concat(frames, axis = 1, join = 'inner').max(axis = 1)
tr = rma(tr)
# print(tr)
# plus_dm = 100 * rma(plus_dm) / tr
# minus_dm = 100 * rma(minus_dm) / tr
plus_dm = 100 * rma(plus_dm)
minus_dm = 100 * rma(minus_dm)
for index in plus_dm.index:
plus_dm[index] = plus_dm[index] / tr[index]
minus_dm[index] = minus_dm[index] / tr[index]
sum = plus_dm + minus_dm
sum[sum == 0] = 1
adx = 100 * rma(abs(plus_dm - minus_dm) / sum)
# print(sum)
return adx
def rma(data):
test = []
sum = 0
alpha = 1 / 12
count = 0
length = len(data)
for index in range(0, length):
if count < 11:
if math.isnan(data.iloc[index]):
test.append(np.nan)
continue
sum = sum + data.iloc[index]
test.append(np.nan)
count = count + 1
elif count == 11:
test.append(sum / 12)
count = count + 1
else:
test.append(alpha * data[index] + (1-alpha) * test[-1])
result = pd.Series(test)
return result
如果你的ADX指标代码在不同时间执行时结果不一致,可能有以下几个原因:
输入数据不一致:ADX指标需要根据一定的时间序列数据进行计算。如果每次运行时输入的数据不同,例如时间范围、间隔或者数据本身的不同,那么结果可能会有所变化。
参数设置不准确:ADX指标通常有一些参数需要设置,例如移动平均周期长度、最小价格变动等。确保你在每次运行时使用相同的参数,否则结果可能有所不同。
代码逻辑错误:检查你的ADX指标代码是否有错误或逻辑问题,例如计算公式、边界条件或循环结构。确保你的代码能够正确地计算ADX指标,并且不依赖于外部因素。
随机性:在一些情况下,ADX指标的计算可能包含随机性或随机抽样。这可能导致每次执行时的结果略有不同。在此情况下,你可以尝试多次运行代码并对结果取平均值或进行统计分析。
在调试代码时,可以逐步检查以发现问题所在。例如,使用打印语句输出中间结果,验证计算逻辑的正确性,并确保输入数据和参数的一致性。
不知道你这个问题是否已经解决, 如果还没有解决的话: