Как ускорить обработку скрипта на API
1. Замерить время работы скрипта
Для того чтобы что-то улучшить, это надо измерить. Поэтому хорошая практика замерять выполнение скрипта.
В начале скрипта ставим:
var sw = Stopwatch.StartNew();
В конце:
ctx.Log($"Time: {sw.Elapsed}", MessageType.Info, true);
После выполнения скрипта в логе будет написано время выполнения.
Также можно замерять отдельные участки кода.
Пример:
public void Execute(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 >= new TimeSpan(10, 00, 00) && bars[i].Date.TimeOfDay < new TimeSpan(20, 00, 00); ... }
Создание TimeSpan лучше вынести до цикла:
var bars = sec.Bars; var timeStart = new TimeSpan(10, 00, 00); var timeFinish = new TimeSpan(20, 00, 00); for (int i = startBar; i < barsCount; i++) { var signal = bars[i].Date.TimeOfDay >= timeStart && bars[i].Date.TimeOfDay < timeFinish; ... }
4. Использовать кеширование индикаторов
Подробнее тут: Кэширование.