Как ускорить обработку скрипта на 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