public static IList<double> RSI(IList<double> candles, int period)
{
var res = new double[candles.Count];
if (candles.Count > 0)
{
var u = new double[candles.Count];
var d = new double[candles.Count];
u[0] = 0;
d[0] = 0;
for (int i = 1; i < candles.Count; i++)
{
double tu = 0, td = 0;
if (candles[i - 1] < candles[i])
{
tu = candles[i] - candles[i - 1];
}
else if (candles[i - 1] > candles[i])
{
td = candles[i - 1] - candles[i];
}
u[i] = tu;
d[i] = td;
}
var eu = EMA(u, period);
var ed = EMA(d, period);
for (int i = 0; i < candles.Count; i++)
{
if(ed[i] == 0.0)
{
res[i] = 100;
}
else if (eu[i] / ed[i] == 1.0)
{
res[i] = 0;
}
else
{
res[i] = 100 - 100 / (1 + eu[i] / ed[i]);
}
}
}
return res;
}
А соответствует ли это это такой формуле?
RSI = 100 / (1 + D(P,N) / U(P,N)),
где
U(P,N) - скользящее среднее роста цены P за N периодов,
D(P,N) - скользящее среднее падения цены P за N периодов.
Параметры настройки:
«Кол-во периодов» - количество периодов N для расчета скользящих средних,
«Поле цены» - используемое для P значение цены интервала (Open, High, Low, Close, Median, Typical).