Расчет RSI для оптимизации новых элементов - PullRequest
0 голосов
/ 15 марта 2020

Следующая формула рассчитывает 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...