CreateDataSource, не грузятся данные при формир. через CreateDataSource
Пользователь
Сообщений: Регистрация: 08.02.2015
08.04.2015 11:08:39
не грузятся данные при формировании таблицы свечей через CreateDataSource.
function main() -- если сюда воткнуть sleep(100) то выведет Class_Code = "SPBOPT" Sec_Code="RI75000BP5" ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) t=getParamEx(Class_Code, Sec_Code, "LONGNAME").param_image local s=0 s=ds:Size() message("ds:Size()="..s.." name "..t,1)
ds:Close()
while is_run do sleep(1000)
end end
ответом будет ds:Size()=0 name RTS-6.15M150415PA 75000
если воткнуть sleep(100) в самом начале то выведет ds:Size()=949 name RTS-6.15M150415PA 75000
Вопрос. Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные. Может какую проверку написать для проверки правильности загруженных данных?
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 13:04:31
Цитата
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Лучше, ловить данные в колбеке SetUpdateCallback
Как определить оптимальное время на закачку? Просто если поменять инст. на RIM5 проблем нет. Куда втыкать sleep до CreateDataSource или после и сколько ставить единиц? Как определить полноту передачи массива свечей?
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamEx как пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 13:34:03
Цитата
Сергей Радченко пишет: Как определить оптимальное время на закачку? Просто если поменять инст. на RIM5 проблем нет. Куда втыкать sleep до CreateDataSource или после и сколько ставить единиц? Как определить полноту передачи массива свечей?
Втыкать sleep после CreateDataSource Определить можно только поставив эксперимент.
Цитата
Сергей Радченко пишет: SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
getParamEx позволяет получить только текущие(последние) данные , а CreateDataSource я использую для получения прошлых данных. Правильно ли я понял, что нужно написать так: ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) while ds:SetEmptyCallbac()==false do ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) end
это позволит убедиться ,что данные были отправлены, а если нет, то ds:SetEmptyCallbac() вернет false и попытка создать таблицу будет повторена
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 14:15:19
Нет Вы поняли не правильно. Если у Вас нет открытого графика по нужному инструменту, но ранее он открывался, значит Вы не подписаны на изменение по нему данных. В этом случае данные в терминале есть и CreateDataSource сработает, но только для тех данных которые остались в памяти терминала. Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
На сколько становится понятно, график у Вас не открыт и скорее всего открываться не будет. Значит напишите так:
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
getParamEx позволяет получить только текущие(последние) данные , а CreateDataSource я использую для получения прошлых данных. Правильно ли я понял, что нужно написать так: ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) while ds:SetEmptyCallbac()==false do ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) end
это позволит убедиться ,что данные были отправлены, а если нет, то ds:SetEmptyCallbac() вернет false и попытка создать таблицу будет повторена
не работает пишет: attempt to call method 'SetEmptyCallbac' (a nil value)
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 14:18:27
Цитата
Сергей Радченко пишет: не работает пишет:attempt to call method 'SetEmptyCallbac' (a nil value)
Значит терминал старый, обновите до актуальной версии (сейчас это 6.17)
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 14:19:57
Цитата
Сергей Радченко пишет: не работает пишет:attempt to call method 'SetEmptyCallbac' (a nil value)
Sergey Gorokhov пишет: Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback. Причем без них работает все гораздо быстрей. И при этом графики в терминале не открыты. Это "ошибка" в реализации QLua? Или все же так и должно быть?
Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2015 14:59:41
Цитата
Дмитрий пишет: И при этом графики в терминале не открыты.
Sergey Gorokhov пишет: Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback. Причем без них работает все гораздо быстрей. И при этом графики в терминале не открыты. Это "ошибка" в реализации QLua? Или все же так и должно быть?
Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
да, работать будет и без открытия графика, но лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться. Одну строчку прописать легко. Спасибо, команде поддержки Квика.
Пользователь
Сообщений: Регистрация: 31.01.2015
08.04.2015 15:18:05
Нет, с самого утра не открывал и исторические данные за прошлые дни (файлы *.dat из подкаталога archive) при этом тоже тоже все удалены.
Пользователь
Сообщений: Регистрация: 31.01.2015
08.04.2015 15:21:43
Цитата
Сергей Радченко пишет: лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений. А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов. В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
Сергей Радченко пишет: лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений. А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов. В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
благодоря использованию колбека можно не только обновить данные, но для меня самое важное проверить их. У меня массив инструментов в цикле и время тоже важно ,но еще важнее получить данные. А вдруг задержки в 100 будет мало. Мне тоже не приятно использовать слип и обновлять данные без необходимости. Это все только для того ,чтоб получить правильные и полные данные. В моем случае с точки зрения логики CreateDataSource должен был получить массив свечей и только после этого перейти дальше по коду. А он это не сделал и побежал дальше. Я это увидел при тесте не поверив частично нулевым данным. Колбек это способ увидеть нули и проверить данные еще раз. Да плата за это время. У меня наверно теперь час будет индюк рассчитываться :)
Пользователь
Сообщений: Регистрация: 31.01.2015
08.04.2015 16:52:05
Цитата
Сергей Радченко пишет: Колбек это способ увидеть нули и проверить данные еще раз
А вы знаете способ как определить с помощью колбэка не только полное отсутствие данных, но и момент окончания их загрузки, то есть когда с сервера получена последняя свеча?
Пользователь
Сообщений: Регистрация: 08.02.2015
08.04.2015 18:01:11
текущее время против ds:T(ds:Size()).hour..ds:T(ds:Size()).min как сделать с помощью колбека не знаю.
Пользователь
Сообщений: Регистрация: 31.01.2015
08.04.2015 18:06:22
Цитата
Сергей Радченко пишет: текущее время против ds:T(ds:Size()).hour..ds:T(ds:Size()).min
А если сделки по этому инструменту происходят не каждую минуту, а раз в несколько минут, а то и реже? В таком случае можно очень долго ждать...
Дмитрий пишет: И при этом графики в терминале не открыты.
А Вы до этого их открывали?
Так это уже обсуждалось:
спасибо
Пользователь
Сообщений: Регистрация: 30.04.2015
13.01.2016 13:12:36
Здравствуйте. В версии 7 в ТВС появился OI Как его получить в QLUA, не из таблицы истории а именно из ТВС? Спасибо.
Пользователь
Сообщений: Регистрация: 23.01.2015
13.01.2016 16:00:31
Цитата
PFelix пишет: Здравствуйте. В версии 7 в ТВС появился OI Как его получить в QLUA, не из таблицы истории а именно из ТВС? Спасибо.
ровно также как и любой другой параметр из ТВС. Имя параметра который требуется open_interest
Пользователь
Сообщений: Регистрация: 30.04.2015
14.01.2016 12:07:11
Сергей, здравствуйте. Не нашел в описании. Я правильно понимаю? В калбеке получим индекс (номер строки), с которым "идем" в таблицу обезличенных сделок?
Пользователь
Сообщений: Регистрация: 23.01.2015
14.01.2016 12:11:18
Цитата
PFelix пишет: Сергей, здравствуйте. Не нашел в описании. Я правильно понимаю?
Если не нашли в описании значит оно у Вас устаревшей версии, или сам терминал устаревшей версии, выполните обновление.
Цитата
PFelix пишет: В калбеке получим индекс (номер строки), с которым "идем" в таблицу обезличенных сделок?
Согласно документации, колбек OnAllTrade возвращает таблицу, а не номер строки.
Пользователь
Сообщений: Регистрация: 30.04.2015
14.01.2016 12:15:50
Спасибо
Пользователь
Сообщений: Регистрация: 30.04.2015
14.01.2016 12:25:00
А есть ли какая-либо приоритетность калбека, устанавливаемого SetUpdateCallback (от CreateDataSource) и OnAllTrade?
Пользователь
Сообщений: Регистрация: 23.01.2015
14.01.2016 14:13:07
Цитата
PFelix пишет: А есть ли какая-либо приоритетность калбека, устанавливаемого SetUpdateCallback (от CreateDataSource) и OnAllTrade?
приоритетности нет
Пользователь
Сообщений: Регистрация: 30.04.2015
18.01.2016 08:38:16
Сергей, здравствуйте, Скажите, пожалуйста. Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие), в хранилище еще не поступили. Спасибо.
Пользователь
Сообщений: Регистрация: 23.01.2015
18.01.2016 08:43:15
Цитата
PFelix пишет: Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие), в хранилище еще не поступили.
не понял вопроса. Вы имеете в виду может ли быть нарушен хронологический порядок? Если так то нет.
Пользователь
Сообщений: Регистрация: 30.04.2015
18.01.2016 08:56:02
Я имел ввиду большую очередь "текущих" данных/калбеков, когда quik/qlua обрабатывают калбеки (тики - OnAllTrade на RI в момент стопа), т.е. данные пришли порцией и информацией о 50-ти (например) сделках. И в этот момент обрабатываются калбеки не последовательно в том смысле, что калбек, следом заполнение строки в ТВС, а проходит одним чохом 50 (или меньше, но несколько) калбеков, и только потом они все одним чохом оседают в ТВС?
Пользователь
Сообщений: Регистрация: 30.04.2015
18.01.2016 09:00:12
Представьте, если алгоритм программы в калбеке фиксирует только факт появления новой сделки, в этот момент ее в ТВС еще нет, а предыдущаа есть/ точно есть/есть с вероятностью в зависимости от скорости следования сделок.
Сергей, речь идет (принципиально) о двух вариантах Если в одном пакете в quik пришла информация о 50 сделках 1. сначала пройдут все 50 калбеков, а потом разом или опосредованно будут заполнены 50 строк ТВС 2. 50 сделок будут обработаны по порядку: - вызов калбека, далее заполнение строки ТВС; - вызов калбека, далее заполнение строки ТВС; и так 50 раз? Спасибо.
Пользователь
Сообщений: Регистрация: 23.01.2015
18.01.2016 09:22:44
Цитата
PFelix пишет: 2. 50 сделок будут обработаны по порядку: - вызов калбека, далее заполнение строки ТВС; - вызов калбека, далее заполнение строки ТВС;
и так 50 раз
Пользователь
Сообщений: Регистрация: 30.04.2015
18.01.2016 09:24:11
Еще раз, спасибо.
Пользователь
Сообщений: Регистрация: 30.04.2015
01.08.2016 12:52:17
Здравствуйте, помню, вроде, вопрос поднимался. Объясните, пожалуйста, в каком случае в калбеки, устанавливаемые SetUpdateCallback (от CreateDataSource) будут приходить все данные, в том числе пропущенные с начала сессии, а в каком только новые? Спасибо.
Пользователь
Сообщений: Регистрация: 30.04.2015
01.08.2016 13:19:03
И есть ли в этом разница для калбеков OnAllTrade? Спасибо.
Пользователь
Сообщений: Регистрация: 30.01.2015
01.08.2016 19:29:50
Цитата
PFelix написал: И есть ли в этом разница для калбеков OnAllTrade? Спасибо.
Все очень просто. Приходит пакет от сервера брокера в терминал. терминал начинает его разбирать(парсить) вытаскивает обезличенные сделки строчка за строчкой. Потом вызывает колбек и передает ему эту строчку. При возврате из колбека запихивает эту строчку в ТВС. ------------------------------------ Теперь можете ответить на свои вопросы сами. все, что пришло попадет сначала в колбек. Если это пришло раньше и уже есть в ТВС, то снова это не придет и в колбек повторно не попадет. Т е если Вы прервали работу своего скрипта, то при новом запуске будете принимать в колбеке пропущенные терминалом ( т е если был разрыв связи с сервером), а не вашим скриптом, и новые.
Пользователь
Сообщений: Регистрация: 30.01.2015
01.08.2016 19:30:15
Разницы нет
Пользователь
Сообщений: Регистрация: 30.01.2015
01.08.2016 19:31:32
Не всегда это верно. Пример тому - перезаказ данных.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
02.08.2016 10:37:14
Цитата
написал: Не всегда это верно. Пример тому - перезаказ данных.
согласен. Если перезаказать, то то при этом весь архив данных стирается и осуществляется прием всех данных. Других случаев нет.
Пользователь
Сообщений: Регистрация: 30.04.2015
22.12.2016 10:46:14
Всем, здравствуйте. Есть такая незадача. На определенном этапе работы скрипта CreateDataSource отказывается вызываться. Бумаг прилично и еще под их параметры - столько же. Итог: не хватает памяти. Изначально для большего быстродействия таблицы были объявлены локальными. Когда проблема вскрылась, переделал на глобальные, скрипт стал заказывать данных больше, однако, решить надежно проблему не удалось. Что посоветуете, можно ли заказать памяти для скрипта больше или по другому как-то ей управлять ? Заранее, спасибо.
Просьба прислать для анализа на скрипт который вызывает проблему. И скриншот ошибки, так чтобы было видно версию терминала.
Пользователь
Сообщений: Регистрация: 30.04.2015
22.12.2016 14:44:46
Спасибо, "конечно". Скрипт - в вариациях. И странное дело. Чем больше "размусаливешь": - sleep добавить между вызовами CreateDataSource - collectgarbage добавить, -- ВСЁ мёртвому припарки. Всё еще немного усложнено: - разным объемом (в разрезе по бумагам) поставками данных от разных брокеров/их серверов - сравнительной скоростью поставки данных и скоростью компа - объемом инфы по запрашиваемым графикам (проблем больше на Газпроме и Сбере, где данных МЕНЬШЕ) - конфигурацией компа в плане его аппаратной мультизадачности. Запрос с файлами отправил. Заранее спасибо