Для того чтобы что то улучшить, это надо измерить.
Поэтому хорошая практика замерять выполнение скрипта.
В начале скрипта ставим:
var sw = Stopwatch.StartNew();
В конце:
ctx.Log($"Time: {sw.Elapsed}", MessageType.Info, true);
После выполнения скрипта в логе будет написано время выполнения.
Также можно замерять отдельные участки кода.
Пример:
publicvoidExecute(IContext ctx,ISecurity sec){var sw =Stopwatch.StartNew(); // тут код скриптаif (!ctx.Runtime.IsAgentMode) // пишем в лог только в режиме Лабораторияctx.Log($"Time: {sw.Elapsed}",MessageType.Info,true);}
2. Получить необходимые данные из ISecurity до цикла
Это касается свойств в ISecurity: ClosePrices, OpenPrices, HighPrices, LowPrices, Volumes.
Внутри них есть кеширование, из-за этого получение этих данных будет медленным.
Поэтому рекомендуется получить все нужные данные перед торговым циклом и в цикле их использовать.
var closePrices = sec.ClosePrices;
var openPrices = sec.OpenPrices;
var highPrices = sec.HighPrices;
var lowPrices = sec.LowPrices;
var volumes = sec.Volumes;
Пример:
var closePrices =sec.ClosePrices;for (int i = startBar; i < barsCount; i++){var signal =closePrices[i] >closePrices[i -1];...}
3. Создавать объекты до цикла
По возможности создавать необходимые объекты до цикла, в котором они используются.
Например, есть такой код, в котором используется время:
var bars =sec.Bars;for (int i = startBar; i < barsCount; i++){var signal =bars[i].Date.TimeOfDay>=newTimeSpan(10,00,00) &&bars[i].Date.TimeOfDay<newTimeSpan(20,00,00);...}
Создание TimeSpan лучше вынести до цикла:
var bars =sec.Bars;var timeStart =newTimeSpan(10,00,00);var timeFinish =newTimeSpan(20,00,00);for (int i = startBar; i < barsCount; i++){var signal =bars[i].Date.TimeOfDay>= timeStart &&bars[i].Date.TimeOfDay< timeFinish;...}