CreateDataSource

Страницы: 1 2 След.
RSS
CreateDataSource, не грузятся данные при формир. через CreateDataSource
 
не грузятся данные при формировании таблицы свечей через 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) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет:
Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Лучше, ловить данные в колбеке SetUpdateCallback
 
Цитата
Sergey Gorokhov пишет:
Цитата
Сергей Радченко пишет:
если воткнуть 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()
 
Цитата
Sergey Gorokhov пишет:
Цитата
Сергей Радченко пишет:
Цитата
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() один раз.

На сколько становится понятно, график у Вас не открыт и скорее всего открываться не будет.
Значит напишите так:

Код
......
ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) 
ds:SetEmptyCallbac()
sleep(100)
......
 
Цитата
Сергей Радченко пишет:
Цитата
Sergey Gorokhov пишет:
Цитата
Сергей Радченко пишет:
Цитата
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)
 
Цитата
Сергей Радченко пишет:
не работает пишет:attempt to call method 'SetEmptyCallbac' (a nil value)
Значит терминал старый, обновите до актуальной версии (сейчас это 6.17)
 
Цитата
Сергей Радченко пишет:
не работает пишет:attempt to call method 'SetEmptyCallbac' (a nil value)
А прошу прощения, это я опечатался.
Напишите так:
Код
......
ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) 
ds:SetEmptyCallback()
sleep(100)
......

 
Цитата
Sergey Gorokhov пишет:
ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15)
ds:SetEmptyCallback()
sleep(100)
СПАСИБО! заработало
 
Цитата
Sergey Gorokhov пишет:
Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback.
Причем без них работает все гораздо быстрей.
И при этом графики в терминале не открыты.
Это "ошибка" в реализации QLua? Или все же так и должно быть?

Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
 
Цитата
Дмитрий пишет:
И при этом графики в терминале не открыты.
А Вы до этого их открывали?
 
Цитата
Дмитрий пишет:
Цитата
Sergey Gorokhov пишет:
Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback.
Причем без них работает все гораздо быстрей.
И при этом графики в терминале не открыты.
Это "ошибка" в реализации QLua? Или все же так и должно быть?

Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
да, работать будет и без открытия графика, но лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться. Одну строчку прописать легко. Спасибо, команде поддержки Квика.
 
Нет, с самого утра не открывал и исторические данные за прошлые дни (файлы *.dat из подкаталога archive) при этом тоже тоже все удалены.
 
Цитата
Сергей Радченко пишет:
лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений.
А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов.
В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
 
Цитата
Дмитрий пишет:
Цитата
Сергей Радченко пишет:
лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений.
А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов.
В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
благодоря использованию колбека можно не только обновить данные, но для меня самое важное проверить их. У меня массив инструментов в цикле и время тоже важно ,но еще важнее получить данные. А вдруг задержки в 100 будет мало. Мне тоже не приятно использовать слип и обновлять данные без необходимости. Это все только для того ,чтоб получить правильные и полные данные.
В моем случае с точки зрения логики CreateDataSource должен был получить массив свечей и только после этого перейти дальше по коду. А он это не сделал и побежал дальше. Я это увидел при тесте не поверив частично нулевым данным. Колбек это способ увидеть нули и проверить данные еще раз. Да плата за это время. У меня наверно теперь час будет индюк рассчитываться :)
 
Цитата
Сергей Радченко пишет:
Колбек это способ увидеть нули и проверить данные еще раз
А вы знаете способ как определить с помощью колбэка не только полное отсутствие данных, но и момент окончания их загрузки, то есть когда с сервера получена последняя свеча?
 
текущее время против ds:T(ds:Size()).hour..ds:T(ds:Size()).min
как сделать с помощью колбека не знаю.
 
Цитата
Сергей Радченко пишет:
текущее время против ds:T(ds:Size()).hour..ds:T(ds:Size()).min
А если сделки по этому инструменту происходят не каждую минуту, а раз в несколько минут, а то и реже?
В таком случае можно очень долго ждать...
 
Цитата
Дмитрий пишет:
Цитата
Сергей Радченко пишет:
текущее время против ds:T(ds:Size()).hour..ds:T(ds:Size()).min
А если сделки по этому инструменту происходят не каждую минуту, а раз в несколько минут, а то и реже?
В таком случае можно очень долго ждать..
да согласен. как по другому не знаю
 
Цитата
Дмитрий пишет:
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback.
Цитата
Sergey Gorokhov пишет:
Цитата
Дмитрий пишет:
И при этом графики в терминале не открыты.
А Вы до этого их открывали?
Так это уже обсуждалось: http://forum-archive.quik.ru/forum/lua/125655/125655/
 
Цитата
Серж пишет:
Цитата
Sergey Gorokhov пишет:
Цитата
Дмитрий пишет:
И при этом графики в терминале не открыты.
А Вы до этого их открывали?
Так это уже обсуждалось: http://forum-archive.quik.ru/forum/lua/125655/125655/
спасибо
 
Здравствуйте.
В версии 7 в ТВС появился OI
Как его получить в QLUA, не из таблицы истории а именно из ТВС?
Спасибо.
 
Цитата
PFelix пишет:
Здравствуйте.
В версии 7 в ТВС появился OI
Как его получить в QLUA, не из таблицы истории а именно из ТВС?
Спасибо.
ровно также как и любой другой параметр из ТВС. Имя параметра который требуется open_interest
 
Сергей, здравствуйте.
Не нашел в описании.
Я правильно понимаю?
В калбеке получим индекс (номер строки), с которым "идем" в таблицу обезличенных сделок?
 
Цитата
PFelix пишет:
Сергей, здравствуйте.
Не нашел в описании.
Я правильно понимаю?
Если не нашли в описании значит оно у Вас устаревшей версии, или сам терминал устаревшей версии, выполните обновление.
Цитата
PFelix пишет:
В калбеке получим индекс (номер строки), с которым "идем" в таблицу обезличенных сделок?
Согласно документации, колбек OnAllTrade возвращает таблицу, а не номер строки.
 
Спасибо
 
А есть ли какая-либо приоритетность калбека, устанавливаемого SetUpdateCallback     (от CreateDataSource) и OnAllTrade?
 
Цитата
PFelix пишет:
А есть ли какая-либо приоритетность калбека, устанавливаемого SetUpdateCallback (от CreateDataSource) и OnAllTrade?
приоритетности нет
 
Сергей, здравствуйте,
Скажите, пожалуйста.
Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда
основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие),
в хранилище еще не поступили.
Спасибо.
 
Цитата
PFelix пишет:
Может ли сформироваться ситуация (при "подписке" на ликвидный инструмент, в момент какого-нибудь стопа), когда
основной поток не успевает складывать данные в хранилище, т.е. приходит калбек, а данные, переданные в предыдущий(ие),
в хранилище еще не поступили.
не понял вопроса.
Вы имеете в виду может ли быть нарушен хронологический порядок? Если так то нет.
 
Я имел ввиду большую очередь "текущих" данных/калбеков, когда quik/qlua обрабатывают калбеки (тики - OnAllTrade на RI в момент стопа),
т.е. данные пришли порцией и информацией о 50-ти (например) сделках.
И в этот момент обрабатываются калбеки не последовательно в том смысле, что калбек, следом заполнение строки в ТВС, а проходит одним чохом 50 (или меньше, но несколько) калбеков, и только потом они все одним чохом оседают в ТВС?
 
Представьте, если алгоритм программы в калбеке фиксирует только факт появления новой сделки, в этот момент ее в ТВС еще нет, а предыдущаа есть/ точно есть/есть с вероятностью в зависимости от скорости следования сделок.
 
Цитата
PFelix пишет:
одним чохом
Просьба передать информацию более понятными терминами, так как нам не понятно что такое "чохом"
 
Сергей, 50 калбеков разом/порцией.
 
Цитата
PFelix пишет:
Сергей, 50 калбеков разом/порцией.
колбэк в LUA сработает по порядку, никаких порций
 
Сергей, речь идет (принципиально) о двух вариантах
Если в одном пакете в quik пришла информация о 50 сделках
1. сначала пройдут все 50 калбеков, а потом разом или опосредованно будут заполнены 50 строк ТВС
2. 50 сделок будут обработаны по порядку:
- вызов калбека, далее заполнение строки ТВС;
- вызов калбека, далее заполнение строки ТВС;
и так 50 раз?
Спасибо.
 
Цитата
PFelix пишет:
2. 50 сделок будут обработаны по порядку:
- вызов калбека, далее заполнение строки ТВС;
- вызов калбека, далее заполнение строки ТВС;
и так 50 раз
 
Еще раз, спасибо.
 
Здравствуйте, помню, вроде, вопрос поднимался.
Объясните, пожалуйста, в каком случае в калбеки, устанавливаемые SetUpdateCallback (от CreateDataSource) будут приходить все данные, в том числе пропущенные с начала сессии, а в каком только новые?
Спасибо.
 
И есть ли в этом разница для калбеков OnAllTrade?
Спасибо.
 
Цитата
PFelix написал:
И есть ли в этом разница для калбеков OnAllTrade?
Спасибо.
Все очень просто.
Приходит пакет от сервера брокера в терминал.
терминал начинает его разбирать(парсить) вытаскивает обезличенные сделки строчка за строчкой.
Потом вызывает колбек и передает ему эту строчку.
При возврате из колбека запихивает эту строчку в ТВС.
------------------------------------
Теперь можете ответить на свои вопросы сами.
все, что пришло попадет сначала в колбек.
Если это пришло раньше и уже есть в ТВС, то снова это не придет и в колбек повторно не попадет.
Т е если Вы прервали работу своего скрипта,
то при новом запуске будете принимать в колбеке  пропущенные  терминалом ( т е если был разрыв связи с сервером),
а не вашим скриптом, и новые.
 
Разницы нет
 
Не всегда это верно.
Пример тому - перезаказ данных.
www.bot4sale.ru        t.me/bot4sale
 
Цитата
s_mike@rambler.ru написал:
Не всегда это верно.
Пример тому - перезаказ данных.
согласен.
Если перезаказать, то то при этом весь архив данных стирается и осуществляется прием всех данных.
Других случаев нет.
 
Всем, здравствуйте.
Есть такая незадача.
На определенном этапе работы скрипта CreateDataSource
отказывается вызываться.
Бумаг прилично и еще под их параметры - столько же.
Итог: не хватает памяти.
Изначально для большего быстродействия таблицы были объявлены локальными.
Когда проблема вскрылась, переделал на глобальные, скрипт стал заказывать данных больше, однако, решить надежно проблему не удалось.
Что посоветуете, можно ли заказать памяти для скрипта больше или по другому как-то ей управлять ?
Заранее, спасибо.
 
PFelix,

Просьба прислать для анализа на quiksupport@arqatech.com скрипт который вызывает проблему.
И скриншот ошибки, так чтобы было видно версию терминала.
 
Спасибо, "конечно".
Скрипт - в вариациях.
И странное дело. Чем больше "размусаливешь":
- sleep добавить между вызовами CreateDataSource
- collectgarbage добавить,
-- ВСЁ мёртвому припарки.
Всё еще немного усложнено:
- разным объемом (в разрезе по бумагам) поставками данных от разных брокеров/их серверов
- сравнительной скоростью поставки данных и скоростью компа
-  объемом  инфы по запрашиваемым графикам (проблем больше на Газпроме и
Сбере, где данных МЕНЬШЕ)
- конфигурацией компа в плане его аппаратной мультизадачности.
Запрос с файлами отправил.
Заранее спасибо
 
Цитата
PFelix
Итог: не хватает памяти.
как вы это диагностировали? Не пнятно из вашего сообщения
 
Добрый день.

Подниму тему. Тоже столкнулся с пустым набром данных, если не открыт график.
Вызов SetEmptyCallback() и задержка не помогают.

Правда иногда запущу скрипт - данные появились. В другой раз нет. Закономерности нет.

Пробовал увеличить время ожидания sleep до 1000 - все одно не помогает.

Вызов данных типовой:
           
Код
DS = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL)
if DS:Size() == 0 then 
  DS:SetEmptyCallback()
  sleep(200)
end
Страницы: 1 2 След.
Читают тему (гостей: 1)
Наверх