Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用某种编程语言(JS/C#…)计算RSI(相对强度指数)_C#_Javascript_Stock_Stocks - Fatal编程技术网

使用某种编程语言(JS/C#…)计算RSI(相对强度指数)

使用某种编程语言(JS/C#…)计算RSI(相对强度指数),c#,javascript,stock,stocks,C#,Javascript,Stock,Stocks,我正在计算相对强度指数。我有这样的数据 **Date|Close|Change|Gain|Loss** 计算这个的公式是 RSI = 100 - 100/(1+RS) where RS = Average Gain / Average Loss 所以我想通过一些编程语言在JavaScript或C#中进行计算,但我不知道如何在编程语言中转换,或者我需要什么步骤 如果您还想了解我的问题,我将尝试解释。我将用伪代码编写,您可以轻松地用任何语言编写它。 最短的编码方式是: v0 = 0 v1 =

我正在计算相对强度指数。我有这样的数据

**Date|Close|Change|Gain|Loss**
计算这个的公式是

RSI = 100 - 100/(1+RS)
where RS = Average Gain / Average Loss

所以我想通过一些编程语言在
JavaScript
C#
中进行计算,但我不知道如何在编程语言中转换,或者我需要什么步骤


如果您还想了解我的问题,我将尝试解释。

我将用伪代码编写,您可以轻松地用任何语言编写它。 最短的编码方式是:

v0 = 0 
v1 = 0 
v2 = 0 
v3 = 1/N                     
v4 = 0

if Step == 1: #initialisation
   v0 = (Price[t] - Price[t-N] ) / N
   v1 = mean( abs( diff(Price[(t-N):t] ) ) # average price change over previous N
else
   v2 = Price[t]  - Price[t-1] 
   v0 = vv[t-1] + v3 * ( v2 - v0[t-1] )
   v1 = v1[t-1] + v3 * ( abs( v2 ) - v1[t-1] )

if v1 != 0: 
   v4 = v0 / v1 
else
   v4 = 0

RSI = 50 * ( v4 + 1 )

这可能是在模拟中应用RSI最有效的方法。

转换RSI公式的简单方法:

    public static double CalculateRsi(IEnumerable<double> closePrices)
    {
        var prices = closePrices as double[] ?? closePrices.ToArray();

        double sumGain = 0;
        double sumLoss = 0;
        for (int i = 1; i < prices.Length; i++)
        {
            var difference = prices[i] - prices[i - 1];
            if (difference >= 0)
            {
                sumGain += difference;
            }
            else
            {
                sumLoss -= difference;
            }
        }

        if (sumGain == 0) return 0;
        if (Math.Abs(sumLoss) < Tolerance) return 100;

        var relativeStrength = sumGain / sumLoss;

        return 100.0 - (100.0 / (1 + relativeStrength));
    }
公共静态双计算器i(IEnumerable closePrices)
{
var prices=收盘价为双倍[]??收盘价.ToArray();
双增益=0;
双累积损失=0;
对于(int i=1;i=0)
{
增益+=差值;
}
其他的
{
sumLoss-=差异;
}
}
如果(sumGain==0)返回0;
if(数学绝对值(sumLoss)<公差)返回100;
var relativeStrength=累计收益/累计损失;
返回100.0-(100.0/(1+相对长度));
}

有很多项目以不同的方式实施RSI

这应该与里加的答案没有什么不同,但它似乎永远不会降到40以下,所以要小心,也许就坚持TA_LIB

    //Relative Strength Index
    function rsi($ar, $period, $opt, $offset=0) //opt: 0=none, 1=exponential, 2=wilder, 3=average all
    {
        GLOBAL $smoothsteps;
        $pag = 0; //Previous Average Losses
        $pal = 0; //Previous Average Gains

        //Count average losses and gains
        $len = sizeof($ar)-1-$offset;
        $end = $len-$period-$offset;
        for($i = $len; $i > $end; $i--)
        {
            if($ar[$i] > $ar[$i-1]) //Gain
                $pag += $ar[$i] - $ar[$i-1]; 
            else //Loss
                $pal += $ar[$i-1] - $ar[$i];
        }
        $pag /= $period;
        $pal /= $period;

        //Smooth
        $ag = 0; //Average Losses
        $al = 0; //Average Gains
        for($i = $len; $i > 0; $i--)
        {
            if($ar[$i] > $ar[$i-1]) //Gain
                $ag += $ar[$i] - $ar[$i-1]; 
            else //Loss
                $al += $ar[$i-1] - $ar[$i];
        }

        if($opt == 3) //Average All Three
        {
            $a = 1 / $smoothsteps;
            $tag = $a * $ag + (1 - $a) * $pag;
            $tal = $a * $al + (1 - $a) * $pal;
            $wag = $pag * 13 + $ag;
            $wal = $pal * 13 + $al;
            $ag = ($wag+$tag+$pag)/3;
            $al = ($wal+$tal+$pal)/3;
        }
        else if($opt == 2) //Wilder Exp
        {
            $ag = $pag * 13 + $ag;
            $al = $pal * 13 + $al;
        }
        else if($opt == 1) //Exponential (Lame) [Closest to Trading View]
        {
            $sa = 1 / $smoothsteps;
            $ag = $sa * $ag + (1 - $sa) * $pag;
            $al = $sa * $al + (1 - $sa) * $pal;
        }
        else if($opt == 0) //None
        {
            $ag = $pag;
            $al = $pal;
        }

        //Relative Strength
        $rs = $ag / $al;

        //Relative Strength Index
        return 100 - (100 / (1+$rs));
    }

@此代码中的AmirFo使用的是
双公差=10e-20
,只是不要在下面的除法中得到错误。对于相对长度,我们需要将其除以总和增益和总和损失的平均值。。所以我觉得在上面的代码中,我们需要更改var relativeStrength=(sumGain/Period)/(sumLoss/Period)。。来自investopedia的参考资料。RSI​ =100−[100/(1+(平均损失/平均收益))]