У вас не стоит Flash Player
Настройки
#87026 - Sun Aug 15 2021 12:58 PM Кубик "Divider"
AleksandrGanov Offline
member

Registered: Fri Jun 02 2017
Записи: 181
Loc: Kamchatka
Кубик "Divider"

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

Примечание: Нет возможности соединить делитель с блоками открытия позиции, т.к. механизм генерации кода ТСЛаб "не заточен" под работу с другими блоками, кроме источника, о чем скрипт сообщит в виде ошибке при попытке его запуска. В иные случаях делитель инструмента можно использовать.

Дисклеймер: Кубик предоставляется "as is", но с обязательным тестированием и проверкой всех данных вручную. При выявлении багов просьба писать в телеграмм: @AleksandrGanov.



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



Отредактировано AleksandrGanov (Sun Aug 15 2021 01:00 PM)

Наверх
#87032 - Sun Aug 22 2021 07:46 PM Re: Кубик "Divider" [Re: AleksandrGanov]
AleksandrGanov Offline
member

Registered: Fri Jun 02 2017
Записи: 181
Loc: Kamchatka
Есть особенность при использовании делителя инструмента (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 (193 downloads)



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

Наверх
#87042 - Fri Aug 27 2021 11:48 AM Re: Кубик "Divider" [Re: AleksandrGanov]
AleksandrGanov Offline
member

Registered: Fri Jun 02 2017
Записи: 181
Loc: Kamchatka
примечание: делитель позиции работает некорректно, то есть ошибок при запуске не будет, но и позиция передаваться не будет в силу особенностей построения алгоритма ТСЛаб. Поэтому данный кубик "в слив". Все остальное работает как положено

Наверх


Moderator:  ViL, sar