0

我试图将 Tradingviews pine 脚本 RSI 代码重新创建为 Javascript 代码。但是很难弄清楚它是如何工作的。我使用正常的移动平均线计算制作了基本的 RSI。但是 pine 脚本使用指数加权移动平均线。那里的文档对我来说真的很难理解。这是松树脚本。

//@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")

这就是我在 Javascript 中所做的:

// Period = 200
// Close variable is 200 closed values. Where [0] in array = oldest, [199] in array = newest value.

/**
 * Relative strength index. Based on closed periods.
 * 
 * @param {Array} close 
 * @param {Integer} period 
 * @returns 
 */
function calculateRSI(close, period) {

    // Only calculate if it is worth it. First {period - 1} amount of calculations aren't correct anyway.
    if (close.length < period) {
        return 50;
    }

    let averageGain = 0;
    let averageLoss = 0;
    const alpha = 1 / period;

    // Exponential weighted moving average.
    for (let i = 1; i < period; i++)
    {
        let change = close[i] - close[i - 1];

        if (change >= 0) {
            averageGain = alpha * change + (1 - alpha) * averageGain;
        } else {
            averageLoss = alpha * -change + (1 - alpha) * averageLoss;
        }
    }

    // Tried this too, but seems to not really matter.
    // To get an actual average.
    // averageGain /= period;
    // averageLoss /= period;

    // Calculate relative strength index. Where it can only be between 0 and 100.
    var rsi = 100 - (100 / (1 + (averageGain / averageLoss)));

    return rsi;
}

这个函数在我的图表上给出的结果还不错,但它与我在 Tradingview 中的结果不同。我相信我错过了 pine 脚本所做的一些事情,而我没有。

我不了解 pine 脚本的事情:

  • 它什么时候做for loop?我没有在功能中看到它。如果他们不这样做,他们如何计算超过 2 的时间段的平均值?您必须为此循环,对吗?
  • 该功能如何rma工作?这是他们的文档

我可能对此有太多问题,但我想如果你像他们一样在 RSI 计算的 Javascript 中展示一个有点工作的例子。那我大概能理解了吧。

我在 Javascript 中的计算与 pine 脚本中的计算是否正确?

4

0 回答 0