На демо сервере junior quik не передается таблица firms при смене пользователя

Страницы: 1
RSS
На демо сервере junior quik не передается таблица firms при смене пользователя
 
На демо сервере junior quik не приходят обновления таблицы firms в колбек OnFirm при смене пользователя.
1. Запускаем скрипт.
2. Происходит подключение 1-го пользователя.
3. OnFirm - приходит.
4. Отключение 1-го пользователя.
5. Подключение 1-го пользователя.
6. OnFirm - не приходит.
Это ошибка или особенность работы? Версия квика 8.2.
 
Здравствуйте, Александр.

Функция обратного вызова OnFirm вызывается в том случае, если в рабочее место QUIK поступает запись о новой фирме, информации о которой ранее не было у терминала.
При первом подключении рабочее место получает список фирм впервые и записывает их в файл firms.dat. Список фирм обновляется редко. Соответственно, при очередном подключении рабочее место не получает информации о новых фирмах, ввиду их отсутствия и, соответственно, OnFirm не вызывается. Но если новая фирма появится - то при запущенном скрипте вызов произойдёт.
 
Цитата
Andrey Bezrukov написал:
Здравствуйте, Александр.

Функция обратного вызова OnFirm вызывается в том случае, если в рабочее место QUIK поступает запись о новой фирме, информации о которой ранее не было у терминала.
При первом подключении рабочее место получает список фирм впервые и записывает их в файл firms.dat. Список фирм обновляется редко. Соответственно, при очередном подключении рабочее место не получает информации о новых фирмах, ввиду их отсутствия и, соответственно, OnFirm не вызывается. Но если новая фирма появится - то при запущенном скрипте вызов произойдёт.
Если происходит OnCleanup, то таблицы должны быть обнулены и данные о фирме должны быть снова записаны.
В данном случае происходит событие OnCleanup, т. к. залогинился новый пользователь. Таблица firms должна быть очищена и записи обновлены в  OnFirm.
По-моему у вас должна быть такая логика?
 
Александр,

Действительно, если Вы удалите/очистите файл firms.dat, то при очередном подключении callback-функция OnFirm() будет вызвана, т.к. с сервера QUIK будет загружены фирмы, о которых рабочее место не имело ранее информации (ввиду их удаления из firms.dat).

НО:

Функция OnCleanUp вызывается терминалом QUIK в следующих случаях:
1. смена сервера QUIK внутри торговой сессии;
2. смена пользователя, которым выполняется подключение к серверу QUIK, внутри торговой сессии;
3. смена сессии.

В приведённом Вами порядке эксперимента ни одно из условий не выполнено и OnCleanUp не вызывается.

Далее, OnCleanUp() - это callback-функция, при вызове которой, по умолчанию, рабочее место ничего не удаляет и не очищает. Чтобы при вызове функции были выполнены какие-либо действия - необходимо их описать в скрипте следующим образом:
Код
function OnCleanUp()
... -- Ваш код
end

Соответственно то, будет ли удалятся файл firms.dat при вызове OnCleanUp и будет ли очищаться когда-либо вообще - зависит от того, каким образом составлен Ваш скрипт. Само по себе рабочее место не очищает этот файл, т.к. в абсолютном большинстве случаев в этом нет необходимости потому что список фирм меняется очень редко.
 
Цитата
Andrey Bezrukov написал:
В приведённом Вами порядке эксперимента ни одно из условий не выполнено и OnCleanUp не вызывается.
В моем эксперементе произошло:
2. смена пользователя, которым выполняется подключение к серверу QUIK, внутри торговой сессии;
Условие для OnCleanup выполнено.
Я не правильно написал, в шаге 5 подключение другого пользователя.
OnCleanup приходит, но таблица firms не обновляется через OnFirm.
Цитата
Andrey Bezrukov написал:
Соответственно то, будет ли удалятся файл firms.dat при вызове OnCleanUp и будет ли очищаться когда-либо вообще - зависит от того, каким образом составлен Ваш скрипт.
Причем здесь мой скрипт. Если я запущу скрипт, то обновления в OnFirm придут. Если я переключусь с другим пользователем, то обновления не будут приходить, хотя для других таблиц будут (например, таблица всех сделок будет загружаться заново).
 
Александр,

Таблица сделок - это таблица сделок, а не список фирм, и она очищается при смене пользователя, чтобы другой пользователь не получил информацию о сделках, совершённых предыдущем пользователем. Это правило не распространяется на список фирм, о чём было сказано выше.
Соответственно, ожидать что список фирм будет очищен по аналогии с таблицей сделок, при выполнения условия OnCleanUp - ошибочно.
Единственный вариант, при котором вместе с вызовом OnCleanUp очистится список фирм - это очистка/удаление firms.dat из скрипта в вызове OnCleanUp, или вручную.

Соответственно, подключаетесь одним пользователем - получаете список фирм, отключаетесь, меняете пользователя, подключаетесь, очищаются различные таблички, firms.dat не очищается, фронт получает список фирм, не находит в нём новых и не вызывает OnFirm.
 
Цитата
Andrey Bezrukov написал:
Александр,

Таблица сделок - это таблица сделок, а не список фирм, и она очищается при смене пользователя, чтобы другой пользователь не получил информацию о сделках, совершённых предыдущем пользователем. Это правило не распространяется на список фирм, о чём было сказано выше.
Соответственно, ожидать что список фирм будет очищен по аналогии с таблицей сделок, при выполнения условия OnCleanUp - ошибочно.
Единственный вариант, при котором вместе с вызовом OnCleanUp очистится список фирм - это очистка/удаление firms.dat из скрипта в вызове OnCleanUp, или вручную.

Соответственно, подключаетесь одним пользователем - получаете список фирм, отключаетесь, меняете пользователя, подключаетесь, очищаются различные таблички, firms.dat не очищается, фронт получает список фирм, не находит в нём новых и не вызывает OnFirm.
Как-то не совсем так. На боевом сервере (СБЕР 8.3.2.4) при начале торговой сессии каждый раз приходит 2000+ коллбэков OnFirm, файл firms.dat никак не очищается, ни скриптом, ни вручную. Значит либо терминал этот файл сам чистит (тогда в каких случаях?), либо процедура не совсем такая, как вы описали.
 
Здравствуйте, Сергей.

Выше обсуждается смена пользователя в середине торговой сессии, сопровождаемая вызовом callback-функции OnCleanUp().

Вы даёте новые вводные и рассматриваете случай смены торговой сессии и первого подключения в новый торговый день. При смене торговой сессии список фирм очищается рабочим местом и загружается по новой при первом подключении.
 
Подниму вопрос. Терминал работает круглые сутки, не выключаясь. У одного брокера регулярно утром происходит какая-то...

[INFO  2020-10-23 08:15:17] :           OnDisconnected
[INFO  2020-10-23 10:00:05] :           OnCleanUp
[INFO  2020-10-23 10:00:11] :           OnConnected flag true

После OnConnected проверяем позицию по инструменту - она 0.
И через несколько секунд уже корректная.

Раз уж мы поняли, что актуальность данных мы не можем получить:

Я вижу колбек OnCleanUp (судя по описанию и времени это смена сессии), но только потом OnConnected. Как-то странно для смены сессии. По какому признаку мне понять, что пока рано идти и смотреть позицию в таблице futures_client_holding?

Кроме идеи дождаться первого OnFuturesClientHolding в голову ничего не приходит.
 
В продолжении вопрос:
Если у клиента подключен счет для срочной секции (в том числе единый счет) можно ли утверждать, что таблица futures_client_limits всегда заполнена (по аналогии с  money_limits для фондовой секции)?
 
Здравствуйте, Nikolay.

Доступность сервера для подключений в новый торговый день, точное время смены сессии на сервере QUIK, а также доступность данных по позициям зависят от регламента обслуживания сервера QUIK на стороне брокера. Рекомендуем обратиться к нему и уточнить расписание, возможно Вы сможете использовать эти данные для работы. Альтернативное решение, предложенное Вами, ожидать первого OnFuturesClientHolding - также может быть использовано для решения Вашей задачи.

Касательно таблицы futures_client_limits - здесь также наличие данных в таблице зависит от регламента обслуживания сервера QUIK Вашим брокером, как было отмечено выше. Единственный комментарий - в случае, если речь о единой денежной позиции - то ограничения по клиентским счетам, т.е. "деньги" - отображаются в виде денежных позиций в таблице "Позиции по деньгам".
 
Цитата
Andrey Bezrukov написал:
ожидать первого OnFuturesClientHolding - также может быть использовано
Великолепный ответ!
Только если позиции по фьючерсам не открыты, будете ждать вечно.
Надо делать так, как надо. А как не надо - делать не надо.
 
Ну да, я поэтому и спросил про другой способ. Проверим как это будет жить.

В целом, ответы типовые - все к брокеру. Может, все же, мы вернемся к вопросу старта Квика и к понятию "Я все с сервера загрузил после очистки таблиц". Тогда и вопросы все отпадут. А то ведь у своего брокера я могу еще спросить, а чужого уже никак.
 
Цитата
Старатель написал:
Цитата
Andrey Bezrukov написал:
ожидать первого OnFuturesClientHolding - также может быть использовано
Великолепный ответ!
Только если позиции по фьючерсам не открыты, будете ждать вечно.
Вы же знаете, открывали вы сделки или нет.
 
Цитата
Александр написал:
Вы же знаете, открывали вы сделки или нет.
А скрипт знает?
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,
Скрипт может "узнать" о заявке / сделках / позициях благодаря функциям обратного вызова QLUA OnOrder, OnTrade и др. или в результате обращения к таблицам заявок, сделок, позициями, ограничениям с использованием функций getItem, getOrderByNumber, getNumberOf, SearchItems.

Nikolay,
Цитата
Nikolay написал:
"Я все с сервера загрузил после очистки таблиц"
В QLUA нет индикации того, всё ли Вы загрузили после подключения или не всё. Выполнение этого критерия зависит от самого пользователя - что он считает необходимой и достаточной информацией для работы: кому-то достаточно чтобы после очистки загрузились окна и таблицы (выглядит как более общий и универсальный), кому-то нужна дополнительная информация для работы, при этом получение этой информации зависит от регламента работы сервера на стороне брокера, а отсутствие этих данных в терминале не мешает его полноценной работе.
В первом случае - можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки, например. Во втором случае решить задачу можно имеющимся, упомянутым выше набором функций обратного вызова и обращений к соответствующим таблицам. Если нужно строгое понимание того, когда и как появляются позиции, открытые в прошлую сессию - надо уточнять у брокера, у каждого брокера своё расписание и точно сказать какой брокер когда и как загружает позиции мы не можем. Если речь идёт о позициях, которых у Вас ещё нет, но которые Вы планируете открыть - то отслеживать эти события выставления заявок, совершения сделок, открытия и изменения позиций также можно уже имеющимся функционалом.

Если не совсем верно поняли суть Вашего вопроса/задачи/проблемы - просьба подробнее их описать.
 
Цитата
Andrey Bezrukov написал:
Скрипт может "узнать" о заявке / сделках / позициях благодаря функциям обратного вызова QLUA OnOrder, OnTrade и др. или в результате обращения к таблицам заявок, сделок, позициями, ограничениям с использованием функций getItem, getOrderByNumber, getNumberOf, SearchItems.
Я в курсе.
Но если getNumberOf возвращает 0, это не значит, что позиции не открыты. Это также может означать, что клиент ещё не получил ни одной записи о позициях.

Цитата
Andrey Bezrukov написал:
можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки
Что имеется ввиду под "необходимые для отображения таблиц данные"?
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,
Цитата
Старатель написал:
Что имеется ввиду под "необходимые для отображения таблиц данные"?
Речь идёт о минимальном наборе данных справочников по классам, транзакциям, фирмам, счетам, которые хранятся *.dat-файлах программы, без которых терминал не может отобразить окна корректно.
Например, достаточно типовая ситуация - Вы по какой-либо причине удалили все *.dat файлы, например, в них имела место критичная для работы программы ошибка. При запуске терминала до подключения к серверу - Вы получите сообщение "Справочники отсутствуют. Конфигурация окон будет загружена после подключения к серверу.", окна и вкладки при этом не загрузятся до подключения к серверу.
После подключения к серверу программа получает с сервера необходимые описания и успешно загружает настройки.
 
Цитата
Andrey Bezrukov написал:
сказать какой брокер когда и как загружает позиции мы не можем
Напомните, утренние позиции на срочной секции ведь брокер загружает?
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,

Приносим извинения, возникла не большая путаница, в связи с чем сообщили не вполне корректную информацию по позициям на срочном рынке.
В действительности, позиции по инструментам по счетам на срочном рынке загружаются торговой системой биржи. В случае, если речь идёт о раздельной денежной позиции - ограничения по счетам на срочном, деньги - также загружаются торговой системой биржи.
Тем не менее, фактическая возможность получения этих данных в терминал после подключения к серверу, а также время их получения в терминале зависит от регламента обслуживания сервера брокером и в частности от расписания его подключения к Торговой системе срочного рынка, т.е. когда сам сервер эти данные получит и сможет их разослать в терминале.
В случае наличия единой денежной позиции - позиции по деньгам загружаются самим брокером.
 
Цитата
Nikolay написал:
По какому признаку мне понять, что пока рано идти и смотреть позицию в таблице futures_client_holding?
Цитата
Andrey Bezrukov написал:
можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки

Может, будет полезно добавить трансляцию таблицы sys_events со шлюза?
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, здравствуйте!

Цитата
Старатель написал:
Может, будет полезно добавить трансляцию таблицы sys_events со шлюза?
Ваше пожелание зарегистрировано, мы постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Страницы: 1
Читают тему
Наверх