Originally Posted By: Nektodron
попробуйте сначала сделать другой скрипт, примитивный, будет ли с ним подобная проблема или нет.


Хороший совет, но не пригодился. Потому что проблема была обнаружена путем удаления кусков кода строка за строкой.
А вот результат оставил меня в полном недоумении. Похоже на какой-то глюк.

Итак, начну от печки.

1. Когда программой генерится исполняемый скрипт codeXX.cs, в него вставляется строчка:
TSLab.Script.IPane Главное_pane = context.CreatePane("Главное", 50, false);
Назначение очевидно - создать главную панель для отображения графиков.

2. Обратите внимание на второй параметр. Согласно документации, это относительный размер панели. Поскольку в документации его описание выглядит как double SizePct [get, set], то его очевидно можно изменять по мере необходимости.

3. Я в своем скрипте вставляю строчки:
TSLab.Script.IPane Main_pane = context.First;
Main_pane.SizePct = 50;


4. Вторая строчка в общем-то не нужна, просто ниже создаются дополнительные панели, и хочется быть уверенным, что их размеры не изменятся, если TSLab по какой-то причине решит генерить исполняемый скрипт с другой цифрой в строке, приведенной в пункте 1.

5. Никаких замечаний ни со стороны компилятора (Sharp Develop 3.2.0), ни со стороны TSLab. Да и с какой стати?

6. Так вот, если эта строка в коде присутствует, происходит то самое явление - повторная генерация и компиляция исполняемого скрипта на каждом шаге компиляции, а также при каждом нажатии на F5 в TSLab.

7. А если отсутствует - ничего лишнего не генерится, оптимизация идет с нормальной скоростью, время прогнозируется разумное и по ходу дела уменьшается.

8. Забавно, что при оптимизации эта часть кода вообще не исполняется, потому что для экономии времени чуть выше вставлена строка:
if(context.IsOptimization) return;
return - потому что строки прорисовки графиков идут последними в функции Execute создаваемого класса.

Хотелось бы получить комментарий разработчиков.

Кроме того, нельзя ли из генерируемого скрипта убрать ненужный пустой цикл по барам:
int barsCount = var0.Bars.Count;
for (int i = context.TradeFromBar; (i < barsCount); i++)
{
}

Только время зря тратит, хоть и немного.