Есть особенность при использовании делителя инструмента (Divider Sec): в случае если делитель инструмента делит сжатые данные, то есть данные инструмента после блока "сжать" и "сжать (расшир)", то при встрече с непотоковыми блоками, например, с блоком "обновляемое значение", с блоками "логическая формула" или "формула" если после этих блоков нет встречи с разжатыми данными, то ТСЛаб не понимает, что данные необходимо разжать и выдаст ошибку следующего вида:

[size:9pt]23.08.2021 4:13:10 138 System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
в System.SZArrayHelper.get_Item[T](Int32 index)
в TSLab.User.Script.Execute(IContext context, ISecurity Sec) в C:\Users\Ганов\AppData\Local\TSLab\TSLab 2.0\temp\code-2021-08-22-16-12-55-761-186.cs:строка 3497
[/color]


О чем данная ошибка нам говорит? О том, что ТСЛаб пытается использовать коллекцию сжатых данных и данных основного интервала (не сжатых) без разжатия сжатых данных. Чтобы было понятно о чем речь, привожу пояснение.
К примеру, мы берем и сжимаем минутки в 5-ти минутные бары. Пусть минуток будет 1000 баров, следовательно в коллекции 5ти минутных сжатых баров будет только 200 элементов, то есть 1000/5 - 200 баров по 5 минут. Дальше, мы берем кубик "номер бара", запитываем его от сжатых баров и подаем в обновляемое значение. Если кубик "номер бара" будет запитан от кубиков "сжать" и "сжать (расшир)", то ТСЛаб автоматически разожмет данные и подаст в обновляемое значение не 200 сжатых баров, а 1000 баров, каждый пять из которых будут одинаковыми, то есть:

имеем бары основного интервала по закрытию (close)
не сжатые свечи №1-5: 200,210,200,215,213
не сжатые свечи №6-10: 215,213,220,200,205
не сжатые свечи №11-15: 207,210,202,213,208.

То есть имеем список: 200,210,200,215,213, 215,213,220,200,205, 207,210,202,213,208

Получаем сжатые в 5М ТФ свечи: №1 - 213, №2 - 205, №3 - 208.
При разжатии из сжатых свечей будет автоматически "приготовлен" список с количество элементов 15шт (то есть сжатый список будет приведен к НЕ сжатому интервалу), но в качестве элементов будут не начальные свечи, а закрытия сжатых свечей.

То есть имеем список: 213, 213, 213, 213, 213, 205, 205, 205, 205, 205, 208, 208, 208, 208, 208, 208

Таким образом, длины обоих списков будут одинаковыми и можно корректно сравнивать i-й элемент списка. Данную процедуру ТСЛаб делает автоматически при встрече сжатых данных с непотоковыми кубиками или с формулами, когда дальше (после формулы) предполагается использовать уже разжатые данные, например, для вывода на график. Но в случае с делителем ТСЛаб не понимает, что данные надо разжать, то есть будет пытаться сравнивать список: 200,210,200,215,213, 215,213,220,200,205, 207,210,202,213,208 со списком 213, 205, 208, в связи с чем и выведет ошибку, о том, что индекс за пределами границ как только считает индекс номер три, т.к. во втором списке максимальный индекс равен двум. Автоматического разжатия не происходит потому как кубик "делитель" не является штатным функционалом и ТСЛаб банально не понимает, что пришедшие с него данные необходимо разжать.

Решение вопроса: ручное разжатие данные. Эту особенность надо учитывать и не паниковать, что "все пропало" при использовании делителей smile. Примеры привожу ниже.



Attachments
ПримерИспользования.jpg (224 downloads)



Отредактировано AleksandrGanov (Sun Aug 22 2021 08:46 PM)