Пример скрипта вводит в заблуждение не только отсутствием отступов, но и неодинаковым исполнением на истории и в реале.
1. Судя по всему, в конструкции:
for (int i = 0; (i < barsCount); i++) {
IPosition le = source.Positions.GetLastActiveForSignal("LE");
if (le == null) {
//...
} else {
//...
}
}GetLastActiveForSignal не зависит от номера бара, и на реальном счёте, в случае открытой позиции, всегда возвращает открытую позу, т.е. условие else выполняется при каждой итерации цикла, от 0 и до упора, в отличие от истории, где Positions "живёт" в течение цикла и условие будет срабатывать только на барах с открытыми позициями.
2. Похоже, IPosition.CloseAtProfit сначала проверяет второй аргумент (цену), а только потом первый аргумент (номер бара), если вообще его учитывает. Подозрение возникло потому, что этот метод ошибочно закрывал у меня позицию по рынку при каждом выполнении скрипта, причём до того, как цикл дойдёт до последнего бара (на истории всё рисовалось как надо).
обе проблемы пока что решил заменой
for (int i = 0; (i < barsCount); i++) {на
for (int i = source.Positions.IsRealtime? barsCount - 1: 0; (i < barsCount); i++) {