Тут для RSI изменение считается как close - open текущей свечи. Нужно считать относительно предыдущего закрытия: currentClose - previousClose. Иначе значения RSI будут отличаться от стандартного расчёта.
Здесь для усреднения gains/losses используется обычная SMA. Для стандартного RSI нужно сглаживание Wilder/RMA. Лучше сделать отдельный расчёт RMA для RSI, иначе значения будут отличаться от TradingView/стандартного RSI.
Здесь не нужно дополнительно добавлять whitespace через unshift. calculateMASeriesData() уже возвращает whitespace для периода, где MA ещё нельзя рассчитать. Сейчас из-за этого данные дополнительно сдвигаются по времени. Плюс лучше не мутировать массивы, полученные из series.data().
Для realtime здесь нельзя брать .at(-1), потому что в series могут быть future whitespace и последний элемент не обязательно относится к текущей свече. Лучше искать значение по candle.time, как это уже сделано в MACD.
Здесь нужно учитывать whitespace-точки. customValues может отсутствовать, поэтому сейчас возможна ошибка при обращении к close/open. В таком случае нужно возвращать только { time }, как это уже делается, например, в volume().
Тут лучше не заполнять массив null. Ниже в rsi() у элемента вызывается lineCandle.time, поэтому на короткой истории можно получить runtime error. Лучше сразу сформировать whitespace-элементы вида { time }.
Здесь лучше не использовать 999999 как замену бесконечности и не делать Math.floor(). При avgLoss = 0 RSI должен доходить до 100, а текущая формула может дать 99. Также Math.floor() теряет дробную точность RSI. Лучше отдельно обработать avgLoss === 0, а обычное значение считать без принудительного округления.