Следующая формула рассчитывает RSI для всех цен. Всякий раз, когда я добавляю новую цену в массив, он должен будет пересчитать RSI для всего массива / всех цен. Есть ли способ, которым я могу рассчитать RSI для новой цены без необходимости пересчитать всю вещь? Я хочу сделать это, потому что, когда я вычисляю это для каждой новой свечи, и это должно быть выполнено за наименьшее возможное время. Если это невозможно, подскажите, пожалуйста, способ его оптимизации, чтобы он выполнялся максимально быстро. Сейчас это не так быстро.
decimal[] prices = ...
Calculate(prices, 14);
public decimal[] Calculate(decimal[] price, int period)
{
var rsi = new decimal[price.Length];
decimal gain = 0m;
decimal loss = 0m;
rsi[0] = 0m;
for (int i = 1; i <= period; ++i)
{
var diff = price[i] - price[i - 1];
if (diff >= 0)
{
gain += diff;
}
else
{
loss -= diff;
}
}
decimal avrg = gain / period;
decimal avrl = loss / period;
decimal rs = gain / loss;
rsi[period] = 100m - (100m / (1m + rs));
for (int i = period + 1; i < price.Length; ++i)
{
var diff = price[i] - price[i - 1];
if (diff >= 0)
{
avrg = ((avrg * (period - 1)) + diff) / period;
avrl = (avrl * (period - 1)) / period;
}
else
{
avrl = ((avrl * (period - 1)) - diff) / period;
avrg = (avrg * (period - 1)) / period;
}
rs = avrg / avrl;
rsi[i] = 100m - (100m / (1m + rs));
}
return rsi;
}