Тут в realtime change считается как close - open, а для RSI нужно, как и на истории, считать current close - previous close. И для первой свечи, где предыдущего close нет, лучше вернуть whitespace, а не считать close - 0. Иначе history и realtime дают разные значения RSI
Тут selfData.at(-1) при повторном realtime update уже может быть RMA текущей свечи. Из-за этого следующий update рассчитывается от предыдущего значения этой же свечи. Для пересчёта текущего бара нужно всегда брать RMA предыдущего бара по time, а не просто последний элемент selfData