如何在Java中获得与Tradingview相同的RSI?

问题描述 投票:0回答:1

我不明白为什么,但我的 RSI 总是与 Tradingview 的 RSI 不同。

使用相同的周期(14根蜡烛,每根15分钟),我使用相同类型的值(收盘价),我尝试添加最后一个非收盘蜡烛,但我从未得到相同的RSI。

Tradingview RSI 代码:

//@version=4
study(title="Relative Strength Index", shorttitle="RSI", 
format=format.price, precision=2, resolution="")
len = input(14, minval=1, title="Length")
src = input(close, "Source", type = input.source)
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, "RSI", color=#7E57C2)
band1 = hline(70, "Upper Band", color=#787B86)
bandm = hline(50, "Middle Band", color=color.new(#787B86, 50))
band0 = hline(30, "Lower Band", color=#787B86)
fill(band1, band0, color=color.rgb(126, 87, 194, 90), title="Background")

我的 TA-Lib 代码

MInteger outBegIdx = new MInteger();
MInteger outNbElement = new MInteger();
double[] outReal = new double[array.length-1];
int startIdx = 0;
int endIdx = array.length - 1;

Core core = new Core();
core.rsi(startIdx, endIdx, array, length-1, outBegIdx, outNbElement, outReal);
System.out.println(Arrays.toString(outReal));

return outReal[0];

我的自定义代码没有插件

 double av_gain_up_periods = 0;
 double av_loss_down_periods = 0;
 int gain_count = 0;
 int loss_count = 0;
 double previous_observation = array[0];

 for (int i = 1; i < array.length; i++) {
            if (previous_observation <= array[i]) { // if gain
                double gain = array[i] - previous_observation;
                gain_count++;
                av_gain_up_periods += gain;
            }
            else { // if loss
                double loss = previous_observation - array[i];
                loss_count++;
                av_loss_down_periods += loss;
            }
            previous_observation = array[i];
        }
        av_gain_up_periods = av_gain_up_periods/gain_count;
        av_loss_down_periods = av_loss_down_periods/loss_count;

        // CALCULATE RSI
        double relative_strength = av_gain_up_periods/av_loss_down_periods;
        double relative_strength_index = 100-(100/(1+relative_strength));

        // PRINT RESULT
        return relative_strength_index;

我可以向您保证,我有 14 个收盘价,它们与 Tradingview 的相同。区别在于计算。

与此问题相关

java tradingview-api ta-lib rsi
1个回答
2
投票

我认为问题出在RMA(相对移动平均线)计算上。这是因为获取RMA的起点不同而发生的。获取 RMA 的起点不同,会导致计算出的 RSI 与 tradeview RSI 存在很大差异。 Tradingview 使用实时数据,因此是较旧的数据。我的建议是从 1000 klines 开始。

这是交易视图公式:

len = input(14, minval=1, title="Length")
src = input(close, "Source", type = input.source)
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

根据这个公式,首先你需要获取价格并将其存储在某个地方。闭合蜡烛要么是盈利,要么是亏损。之后,您必须计算收益和损失的变化。

注意:为了获得更接近的结果,请使用更多的 K 线。您需要较旧的数据才能进行更准确的计算。(例如1000 k线)

现在是计算 RMA 的时候了。 RMA 公式为:

Alpha*source(or as we know, change) + (1-alpha) * previous RMA

Alpha : 1/period(for example 1/14)

此时我们正处于计算的棘手部分。正如您在 RMA 公式中看到的,我们需要以前的 RMA 来计算当前的 RMA。假设我们使用 1 小时时间范围并将 K 线存储在数组中。每个数组元素都有一个前一个元素,因此是前一个 RMA ;但是 array[0] 中存储的元素呢?

还需要之前的 RMA。这里您需要计算 SMA(简单移动平均线)。

SMA:一个时间段内的价格数量除以总时间段数量。

计算出的 SMA 等于阵列第一个成员 RMA。

现在是计算 RSI 的时候了。通过这种方法,我能够计算出与 tradeview 几乎完全相同的 RSI。 就我个人而言,我用 C++ 编写了一个机器人,使用 Binance API 根据 tradeview 计算 RSI。你可以在这里看到我的代码:

https://github.com/Mina-Jahan/RSIgnal_bot

如果有办法改进我的代码,我将很高兴听到您的意见,以便使我的代码变得更好。 谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.