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