Современные процессоры перемалывают числа очень быстро. Думаю есть смысл, сначала, сделать по простому, а уже потом решать, требуется ли оптимизация. Вот пример несложного индикатора (сглаживающий фильтр).
Code:
using System.Collections.Generic;
using TSLab.Script.Handlers;

namespace MyIndicators {
  [HandlerCategory("Мои индикаторы")]
  public class Wma : IDouble2DoubleHandler {
    [HandlerParameter(true, "20", Min = "10", Max = "100", Step = "5")]
    public int Period { get; set; }

    public IList<double> Execute(IList<double> source) {
      int count = source.Count;
      int w = Period*(Period + 1)/2;

      var wma = new double[count];
      for (int i = Period-1; i < count; i++) {
        double wma1 = 0;
        for (int k = i - Period + 1, wv = 1; k <= i; k++, wv++)
          wma1 += wv*source[k];
        wma[i] = wma1/w;
      }
      return wma;
    }
  }
}

В примере все значения пересчитываются каждый раз. Сохранение результатов предыдущего пересчета сопряжено с некоторыми сложностями и очень вероятно, что это и не потребуется.
_________________________
Не пишите мне! Никому ничего делать не буду.