Хотел бы поделиться своими словами про нужное использование кеша для ускорения работы скрипта.
Надо сказать, что ребята с ТСЛаба уже написали вот тут
http://www.rusalgo.com/ ряд статей по этой теме. Но нужно признать, что нужно быть изрядно подготовленным программистом, чтобы сходу понять нужность этой очень классной фишки.
Попробую разжевать на очень примитивном примере.
Давай те загрузим наш систему какими нибудь большими вычислениями.
Вводные данные
1) Берем бар, ну скажем 10 сек
2) Высчитываем размер бара (Хай - Лоу)
3) И что нибудь с этим делаем. Анализируем и входим в позицию.
Легко подсчитать, что уже через 4ч работы мы накопим 1440 баров. То есть, через 4 часа работы мы можем с каждым пересчетом скрипта мы будем прогонять предыдующие 1440 баров и заново считать их размеры.
Естественно, было бы здорово, если бы скрипт уже при запуске брал бы подсчитанные значения заранее. Вот тут нас и спасает кеш.
Схемотично, запуск бы скрипта выглядел так
Но, так как при запуске скрипта у нас уже появились новые бары с прошлого раза, то нам нужно досчитать новые значения.
И схематично:

И в конце скрипта, нам нужно просто пересохранить старые расчеты уже с новыми добавленными расчетами.
Схематично

Так вот куда выгружаем и от куда загружаем - это и есть кеш.
Теперь что косательно Api.
Загрузить с кеша - LoadObject("свой какой нибудь придуманный индентификатор")
Сохранить в кеш - StoreObject("свой какой нибудь придуманный индентификатор", значение);
Что касательно нанего примера:
//Берем хаи и лоу, кстати их тоже можно было бы грузить в кеш
var high = source.HighPrices;
var low = source.LowPrices;
//в bar_count храним кол-во уже просчитанных раньше баров
//грузим из кеша по заданному идентификатору
var cache = ctx.LoadObject("bar_count");
//если ничего не загрузилось, то 0, иначе преобразуем к типу int
var bar_count = cache == null ? 0 : (int) cache;
//Грузим наш массив из кеша. Тут возможно я что то делаю не совсем правильно, но у меня работает на ура
cache = ctx.LoadObject("Delta[]");
//если ничего не загрузили, то пустой массив на 10000 баров, либо преобразуем загруженное к типу массива
double[] Delta = cache == null ? Delta = new double[10000]: (double[]) cache;
//делаем дорасчет новых какой нибудь анализ
//обращаю внимание, что цикл начинаем не с 0, а именно с того бара, на котором закончили расчет
(int i = bar_count+1; i < source.Bars.Count; i++)
{
//сам дорасчет
Delta[i]=high[i]-low[i];
//какой нибудь анализ
}
//сохраняем в кеш новые значения
ctx.StoreObject("bar_count", source.Bars.Count);
ctx.StoreObject("Delta[]", Delta);
В итоге получаем, что цикл расчета не идет заново с 0, а идет с последнего рассчитаного места.
Про себя скажу, такие манипуляции ускорили мой скрипт с 400млсек до 3млсек.
Удачи.