на исторических данных execute вызывается один раз. И в теле этого метода вы сразу можете обратиться к любому бару истории.
sec.Bars[1].Close - хоть к первому, sec.Bars[777].Close - хоть 777-му.
Но чаще всего на истории делается в цикле:
for (int i = 1; i < ctx.BarsCount; i++)
{}
что представляет собой эмуляцию реальной торговли. т.е. i - внутри тела цикла это как бы текущий бар.
В реальной торговле execute выполняется каждый раз при поступлении нового бара (зависит от режима пересчета)
и нет необходимости делать цикл.
В реале делается так:
var bar = ctx.BarsCount - 1; // длина текущей загруженной истории, что представляет собой последний загруженный бар.
и далее к примеру sec.Bars[bar-5].Close - минус 5 баров назад загруженной истории.
т.е. грубо говоря в реале цикл for заменяется методом execute.