Как ускорить обработку скрипта на 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. Использовать кеширование индикаторов
Подробнее тут: Кэширование.
Last updated
Was this helpful?