не грузятся данные при формировании таблицы свечей через 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
Вопрос. Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные. Может какую проверку написать для проверки правильности загруженных данных?
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Лучше, ловить данные в колбеке SetUpdateCallback
Как определить оптимальное время на закачку? Просто если поменять инст. на RIM5 проблем нет. Куда втыкать sleep до CreateDataSource или после и сколько ставить единиц? Как определить полноту передачи массива свечей?
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamEx как пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Сергей Радченко пишет: Как определить оптимальное время на закачку? Просто если поменять инст. на 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 и попытка создать таблицу будет повторена
Нет Вы поняли не правильно. Если у Вас нет открытого графика по нужному инструменту, но ранее он открывался, значит Вы не подписаны на изменение по нему данных. В этом случае данные в терминале есть и 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)
Sergey Gorokhov пишет: Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback. Причем без них работает все гораздо быстрей. И при этом графики в терминале не открыты. Это "ошибка" в реализации QLua? Или все же так и должно быть?
Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
Sergey Gorokhov пишет: Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback. Причем без них работает все гораздо быстрей. И при этом графики в терминале не открыты. Это "ошибка" в реализации QLua? Или все же так и должно быть?
Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
да, работать будет и без открытия графика, но лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться. Одну строчку прописать легко. Спасибо, команде поддержки Квика.
Сергей Радченко пишет: лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений. А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов. В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
Сергей Радченко пишет: лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений. А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов. В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
благодоря использованию колбека можно не только обновить данные, но для меня самое важное проверить их. У меня массив инструментов в цикле и время тоже важно ,но еще важнее получить данные. А вдруг задержки в 100 будет мало. Мне тоже не приятно использовать слип и обновлять данные без необходимости. Это все только для того ,чтоб получить правильные и полные данные. В моем случае с точки зрения логики CreateDataSource должен был получить массив свечей и только после этого перейти дальше по коду. А он это не сделал и побежал дальше. Я это увидел при тесте не поверив частично нулевым данным. Колбек это способ увидеть нули и проверить данные еще раз. Да плата за это время. У меня наверно теперь час будет индюк рассчитываться :)
Сергей Радченко пишет: Колбек это способ увидеть нули и проверить данные еще раз
А вы знаете способ как определить с помощью колбэка не только полное отсутствие данных, но и момент окончания их загрузки, то есть когда с сервера получена последняя свеча?
Сергей, здравствуйте. Не нашел в описании. Я правильно понимаю? В калбеке получим индекс (номер строки), с которым "идем" в таблицу обезличенных сделок?
Сергей, здравствуйте, Скажите, пожалуйста. Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие), в хранилище еще не поступили. Спасибо.
PFelix пишет: Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие), в хранилище еще не поступили.
не понял вопроса. Вы имеете в виду может ли быть нарушен хронологический порядок? Если так то нет.
Я имел ввиду большую очередь "текущих" данных/калбеков, когда quik/qlua обрабатывают калбеки (тики - OnAllTrade на RI в момент стопа), т.е. данные пришли порцией и информацией о 50-ти (например) сделках. И в этот момент обрабатываются калбеки не последовательно в том смысле, что калбек, следом заполнение строки в ТВС, а проходит одним чохом 50 (или меньше, но несколько) калбеков, и только потом они все одним чохом оседают в ТВС?
Представьте, если алгоритм программы в калбеке фиксирует только факт появления новой сделки, в этот момент ее в ТВС еще нет, а предыдущаа есть/ точно есть/есть с вероятностью в зависимости от скорости следования сделок.
Сергей, речь идет (принципиально) о двух вариантах Если в одном пакете в quik пришла информация о 50 сделках 1. сначала пройдут все 50 калбеков, а потом разом или опосредованно будут заполнены 50 строк ТВС 2. 50 сделок будут обработаны по порядку: - вызов калбека, далее заполнение строки ТВС; - вызов калбека, далее заполнение строки ТВС; и так 50 раз? Спасибо.
Здравствуйте, помню, вроде, вопрос поднимался. Объясните, пожалуйста, в каком случае в калбеки, устанавливаемые SetUpdateCallback (от CreateDataSource) будут приходить все данные, в том числе пропущенные с начала сессии, а в каком только новые? Спасибо.
PFelix написал: И есть ли в этом разница для калбеков OnAllTrade? Спасибо.
Все очень просто. Приходит пакет от сервера брокера в терминал. терминал начинает его разбирать(парсить) вытаскивает обезличенные сделки строчка за строчкой. Потом вызывает колбек и передает ему эту строчку. При возврате из колбека запихивает эту строчку в ТВС. ------------------------------------ Теперь можете ответить на свои вопросы сами. все, что пришло попадет сначала в колбек. Если это пришло раньше и уже есть в ТВС, то снова это не придет и в колбек повторно не попадет. Т е если Вы прервали работу своего скрипта, то при новом запуске будете принимать в колбеке пропущенные терминалом ( т е если был разрыв связи с сервером), а не вашим скриптом, и новые.
Всем, здравствуйте. Есть такая незадача. На определенном этапе работы скрипта CreateDataSource отказывается вызываться. Бумаг прилично и еще под их параметры - столько же. Итог: не хватает памяти. Изначально для большего быстродействия таблицы были объявлены локальными. Когда проблема вскрылась, переделал на глобальные, скрипт стал заказывать данных больше, однако, решить надежно проблему не удалось. Что посоветуете, можно ли заказать памяти для скрипта больше или по другому как-то ей управлять ? Заранее, спасибо.
Спасибо, "конечно". Скрипт - в вариациях. И странное дело. Чем больше "размусаливешь": - sleep добавить между вызовами CreateDataSource - collectgarbage добавить, -- ВСЁ мёртвому припарки. Всё еще немного усложнено: - разным объемом (в разрезе по бумагам) поставками данных от разных брокеров/их серверов - сравнительной скоростью поставки данных и скоростью компа - объемом инфы по запрашиваемым графикам (проблем больше на Газпроме и Сбере, где данных МЕНЬШЕ) - конфигурацией компа в плане его аппаратной мультизадачности. Запрос с файлами отправил. Заранее спасибо