На демо сервере junior quik не приходят обновления таблицы firms в колбек OnFirm при смене пользователя. 1. Запускаем скрипт. 2. Происходит подключение 1-го пользователя. 3. OnFirm - приходит. 4. Отключение 1-го пользователя. 5. Подключение 1-го пользователя. 6. OnFirm - не приходит. Это ошибка или особенность работы? Версия квика 8.2.
Функция обратного вызова OnFirm вызывается в том случае, если в рабочее место QUIK поступает запись о новой фирме, информации о которой ранее не было у терминала. При первом подключении рабочее место получает список фирм впервые и записывает их в файл firms.dat. Список фирм обновляется редко. Соответственно, при очередном подключении рабочее место не получает информации о новых фирмах, ввиду их отсутствия и, соответственно, OnFirm не вызывается. Но если новая фирма появится - то при запущенном скрипте вызов произойдёт.
Функция обратного вызова 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.
Таблица сделок - это таблица сделок, а не список фирм, и она очищается при смене пользователя, чтобы другой пользователь не получил информацию о сделках, совершённых предыдущем пользователем. Это правило не распространяется на список фирм, о чём было сказано выше. Соответственно, ожидать что список фирм будет очищен по аналогии с таблицей сделок, при выполнения условия OnCleanUp - ошибочно. Единственный вариант, при котором вместе с вызовом OnCleanUp очистится список фирм - это очистка/удаление firms.dat из скрипта в вызове OnCleanUp, или вручную.
Соответственно, подключаетесь одним пользователем - получаете список фирм, отключаетесь, меняете пользователя, подключаетесь, очищаются различные таблички, firms.dat не очищается, фронт получает список фирм, не находит в нём новых и не вызывает OnFirm.
Как-то не совсем так. На боевом сервере (СБЕР 8.3.2.4) при начале торговой сессии каждый раз приходит 2000+ коллбэков OnFirm, файл firms.dat никак не очищается, ни скриптом, ни вручную. Значит либо терминал этот файл сам чистит (тогда в каких случаях?), либо процедура не совсем такая, как вы описали.
Выше обсуждается смена пользователя в середине торговой сессии, сопровождаемая вызовом callback-функции OnCleanUp().
Вы даёте новые вводные и рассматриваете случай смены торговой сессии и первого подключения в новый торговый день. При смене торговой сессии список фирм очищается рабочим местом и загружается по новой при первом подключении.
После OnConnected проверяем позицию по инструменту - она 0. И через несколько секунд уже корректная.
Раз уж мы поняли, что актуальность данных мы не можем получить:
Я вижу колбек OnCleanUp (судя по описанию и времени это смена сессии), но только потом OnConnected. Как-то странно для смены сессии. По какому признаку мне понять, что пока рано идти и смотреть позицию в таблице futures_client_holding?
Кроме идеи дождаться первого OnFuturesClientHolding в голову ничего не приходит.
В продолжении вопрос: Если у клиента подключен счет для срочной секции (в том числе единый счет) можно ли утверждать, что таблица futures_client_limits всегда заполнена (по аналогии с money_limits для фондовой секции)?
Доступность сервера для подключений в новый торговый день, точное время смены сессии на сервере QUIK, а также доступность данных по позициям зависят от регламента обслуживания сервера QUIK на стороне брокера. Рекомендуем обратиться к нему и уточнить расписание, возможно Вы сможете использовать эти данные для работы. Альтернативное решение, предложенное Вами, ожидать первого OnFuturesClientHolding - также может быть использовано для решения Вашей задачи.
Касательно таблицы futures_client_limits - здесь также наличие данных в таблице зависит от регламента обслуживания сервера QUIK Вашим брокером, как было отмечено выше. Единственный комментарий - в случае, если речь о единой денежной позиции - то ограничения по клиентским счетам, т.е. "деньги" - отображаются в виде денежных позиций в таблице "Позиции по деньгам".
Ну да, я поэтому и спросил про другой способ. Проверим как это будет жить.
В целом, ответы типовые - все к брокеру. Может, все же, мы вернемся к вопросу старта Квика и к понятию "Я все с сервера загрузил после очистки таблиц". Тогда и вопросы все отпадут. А то ведь у своего брокера я могу еще спросить, а чужого уже никак.
Старатель, Скрипт может "узнать" о заявке / сделках / позициях благодаря функциям обратного вызова QLUA OnOrder, OnTrade и др. или в результате обращения к таблицам заявок, сделок, позициями, ограничениям с использованием функций getItem, getOrderByNumber, getNumberOf, SearchItems.
Nikolay написал: "Я все с сервера загрузил после очистки таблиц"
В QLUA нет индикации того, всё ли Вы загрузили после подключения или не всё. Выполнение этого критерия зависит от самого пользователя - что он считает необходимой и достаточной информацией для работы: кому-то достаточно чтобы после очистки загрузились окна и таблицы (выглядит как более общий и универсальный), кому-то нужна дополнительная информация для работы, при этом получение этой информации зависит от регламента работы сервера на стороне брокера, а отсутствие этих данных в терминале не мешает его полноценной работе. В первом случае - можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки, например. Во втором случае решить задачу можно имеющимся, упомянутым выше набором функций обратного вызова и обращений к соответствующим таблицам. Если нужно строгое понимание того, когда и как появляются позиции, открытые в прошлую сессию - надо уточнять у брокера, у каждого брокера своё расписание и точно сказать какой брокер когда и как загружает позиции мы не можем. Если речь идёт о позициях, которых у Вас ещё нет, но которые Вы планируете открыть - то отслеживать эти события выставления заявок, совершения сделок, открытия и изменения позиций также можно уже имеющимся функционалом.
Если не совсем верно поняли суть Вашего вопроса/задачи/проблемы - просьба подробнее их описать.
Andrey Bezrukov написал: Скрипт может "узнать" о заявке / сделках / позициях благодаря функциям обратного вызова QLUA OnOrder, OnTrade и др. или в результате обращения к таблицам заявок, сделок, позициями, ограничениям с использованием функций getItem, getOrderByNumber, getNumberOf, SearchItems.
Я в курсе. Но если getNumberOf возвращает 0, это не значит, что позиции не открыты. Это также может означать, что клиент ещё не получил ни одной записи о позициях.
Цитата
Andrey Bezrukov написал: можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки
Что имеется ввиду под "необходимые для отображения таблиц данные"?
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: Что имеется ввиду под "необходимые для отображения таблиц данные"?
Речь идёт о минимальном наборе данных справочников по классам, транзакциям, фирмам, счетам, которые хранятся *.dat-файлах программы, без которых терминал не может отобразить окна корректно. Например, достаточно типовая ситуация - Вы по какой-либо причине удалили все *.dat файлы, например, в них имела место критичная для работы программы ошибка. При запуске терминала до подключения к серверу - Вы получите сообщение "Справочники отсутствуют. Конфигурация окон будет загружена после подключения к серверу.", окна и вкладки при этом не загрузятся до подключения к серверу. После подключения к серверу программа получает с сервера необходимые описания и успешно загружает настройки.
Приносим извинения, возникла не большая путаница, в связи с чем сообщили не вполне корректную информацию по позициям на срочном рынке. В действительности, позиции по инструментам по счетам на срочном рынке загружаются торговой системой биржи. В случае, если речь идёт о раздельной денежной позиции - ограничения по счетам на срочном, деньги - также загружаются торговой системой биржи. Тем не менее, фактическая возможность получения этих данных в терминал после подключения к серверу, а также время их получения в терминале зависит от регламента обслуживания сервера брокером и в частности от расписания его подключения к Торговой системе срочного рынка, т.е. когда сам сервер эти данные получит и сможет их разослать в терминале. В случае наличия единой денежной позиции - позиции по деньгам загружаются самим брокером.
Nikolay написал: По какому признаку мне понять, что пока рано идти и смотреть позицию в таблице futures_client_holding?
Цитата
Andrey Bezrukov написал: можем зарегистрировать пожелание на индикацию в скрипте о том, что необходимые для отображения таблиц данные были получены с сервера после очистки
Может, будет полезно добавить трансляцию таблицы sys_events со шлюза?
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: Может, будет полезно добавить трансляцию таблицы sys_events со шлюза?
Ваше пожелание зарегистрировано, мы постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.