Заранее прошу прощения за вероятно избитую тему с CreateDataSource, но огромная просьба помочь разобраться новичку.
Нужно в течении всего дня постоянно получать данные по свечам. Где-то раньше читал, что не требуется при этом повторно вызывать CreateDataSource, а можно просто обращаться к его функциям (т.е., ds:C(index)). Или же все таки требуется? Или для того, чтобы не обращаться должен быть настроен какой-то колбек. Но пишут SetEmptyCallback уже бесполезен, SetUpdateCallback не работает с 2021 года. Т.е. нужно каждый раз в бесконечном цикле вызывать CreateDataSource? Или все таки не нужно? А если бумаг будет 200?
СreateDataSource после создания сам обновляется. Там была фича, что его сделали асинхронным, т.е. момент получения данных lua не контролирует, поэтому цикл ожидания лучше делать.
Тогда все же вопрос разработчику с отсылкой к документации, которая размещена на сайте. А именно речь про SetUpdateCallback, SetEmptyCallback, эти функции работают? Не знаю правильно ли понимаю, но понимаю так, что если эти функции работают, то однажды вызвав CreateDataSource он обновляется без его повторного вызова или это не так?
Пример: после вызова ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1) будет ли через минуту в ds2 новая свеча, через 5 минут 5 новых свечей или нет? Или чтобы они там появились надо снова выполнить вызов CreateDataSource? Или же эти методы обновляют только последнюю незакрытую свечу, которая уже оказалась в наборе с первым вызовом или вообще ничего не обновляется?
Создан источник данных ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1), данные получены, обновляются. Через 10 минут происходит разрыв соединения. Еще через 10 минут соединение восстанавливается. Вопрос: данные в ds2 продолжат поступать или для этого нужно снова вызвать ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)?
Acaw, Вы поймите, ds2 это не место хранения данных, это таблица методов получения этих данных. ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1) это подписка на получение данных по коду класса по коду тикера и определённому тайм фрейму. Сами данные на сервере и обновляются не зависимо от Вашего подключения.
Не совсем понимаю с практической точки зрения, т.к. ds2 может и то, что Вы пишите, но и место хранения данных тоже, т.к. туда же пишутся заказанные данные и обращаясь к ds2 эти данные можно читать. Вопрос связан с тем, что нужно ли повторно заказывать данные в ds2 если связь рвется, не закрывается ли при этом ds2, не рвется ли эта связь ds2 с сервером.
Вы просто выведите таблицу ds2 и посмотрите что получите. А там будут методы и служебная информация. Функции для получения значений по индексу и дополнительному параметру. Так что не хранит ничего кроме этих методов. Если Ваш код подписку не закрывает, то и пере подписываться не нужно.
Отцы, помогите, пожалуйста, разобраться с еще одним ламерским вопросом.
В блоке MAIN у меня создается источник данных (ДС): ds["NLMK"] = CreateDataSource("TQBR", "NLMK", INTERVAL_D1)
Далее мне нужно в функции обращаться к нему, но не напрямую, а присвоив его локальному дс: local dsf = ds["NLMK"], т.е. чтобы можно обращаться через dsf:C(i).
Вопрос: если так сделать, не повлечет ли это за собой то, что терминал будет обновлять кучу копий датасорсов (которые будут созданы в функциях) и это потребует ресурсов, трафика и т.п. Это и не требуется, достаточно чтобы обновлялся основной, а тот, что в функции берется для анализа исторических данных и после отработки функции он не нужен. И еще вопрос - после выполнения функции ее локальные переменные "разинициализируются" (обнуляются в памяти)? Если так, то тогда и вопрос решается сам собой.
Также есть вопрос по параметру Interval в функции CreateDataSource. Его типа по документации Number, т.е. числовой, при этом он передается через константы, например INTERVAL_H1. А как его передать через переменную?
2.5. Таблицы (стр.36) "Вы можете рассматривать таблицу как динамически выделяемый объект; ваша программа работает только со ссылками (указателями) на них. Lua никогда не прибегает к скрытому копированию или созданию новых таблиц."
Acaw написал: не повлечет ли это за собой то, что терминал будет обновлять кучу копий
Не повлечет. Вы в своих функциях работаете всего лишь со ссылкой на первоначальный ds.
Цитата
Acaw написал: И еще вопрос - после выполнения функции ее локальные переменные "разинициализируются" (обнуляются в памяти)?
Память отведенная под переменные на которые больше нет ссылок со временем будет очищена сборщиком мусора.
Цитата
Acaw написал: Также есть вопрос по параметру Interval в функции CreateDataSource. Его типа по документации Number, т.е. числовой, при этом он передается через константы, например INTERVAL_H1.А как его передать через переменную?
Ну просто переменной присвойте значение константы. Для INTERVAL_H1 это вроде 60.
Acaw написал: В блоке MAIN у меня создается источник данных (ДС):ds["NLMK"] = CreateDataSource("TQBR", "NLMK", INTERVAL_D1)Далее мне нужно в функции обращаться к нему, но не напрямую, а присвоив его локальному дс:local dsf = ds["NLMK"], т.е. чтобы можно обращаться через dsf:C(i).
В Lua, поведение относительно памяти зависит от того, является ли это совершенно новой таблицей или ссылкой на существующую таблицу. 1) Под новую таблицу, Lua выделит новую память. Предыдущая таблица, на которую ссылается пользователь, станет доступной для сборки мусора. Утечки памяти нет. 2) Если это ссылка (или псевдоним) на таблицу, которая уже существует в программе, то она просто укажет на эту существующую таблицу. Для самой таблицы не выделяется новая память. Тем не менее, предыдущая таблица, на которую ссылается пользователь, все равно будет удалена сборщиком мусора, если на нее больше не ссылаются нигде. Короче говоря, в целом безопасен и эффективен. Сборка мусора Lua отвечает за управление памятью, предотвращая утечки памяти в большинстве случаев.