Написание автономного бота

Страницы: Пред. 1 2 3 След.
RSS
Написание автономного бота
 
Цитата
Mixa написал:
Как в этом случае будут загружаться лимиты? После запуска какого из шлюзов?

Сервер не будет отправлять пользователю лимиты по тем инструментам, которые ему недоступны.
Если инструмент есть хотя бы по одному (любому) доступному пользователю классу, то тогда лимит отправится.
Проверка доступности это отдельная история.
Например если есть два шлюза которые транслируют одинаковые инструменты, но разные фирмы, то пользователь увидит лимиты только по той фирме которая у него в правах, даже если все остальные параметры лимита идентичны.
Если же фирмы одинаковые, и инструменты одинаковые, но по первому шлюзу прав на классы нет (ни на один), а по второму есть (хотя бы на один), то даже если первый шлюз придет раньше, клиент не получит лимита пока не приедет второй шлюз.
Есть и еще куча подобных примеров "если". Все они сводятся к тому что сервер не будет отправлять пользователю лимиты по тем инструментам которые пользователь видеть не должен.
Цитата
Mixa написал:
А код клиента?
И код клиента.

Цитата
Mixa написал:
Для решения задачи этого и не требуется. Грубо говоря, нам нужно уведомление, что лимиты по конкретному рынку загружены, но, поскольку в QUIK нет такого понятия "рынок", нужно делать привязку к чему-то другому.
К чему?

Цитата
Mixa написал:
Вы же сами пишите, что сервер может транслировать не все лимиты, которые на него загружены:
Да верно, может отправить не все.
А если так:
узнать когда количество загруженных строк в таблице будет равно количеству на сервере в том состоянии которое доступно пользователю в данный момент.
 
Цитата
Sergey Gorokhov написал:
Одна бумага может быть даже на разных биржах.
Пользователь может купить бумагу на одном рынке и тут же продать ее на другом? И это будет один и тот же инструмент?

Цитата
Sergey Gorokhov написал:
Со счетом может быть еще сложнее т.к. на том же СПБ и MOEX счета могут совпадать, а фирмы нет.
Но связка фирма + торговый счет однозначно определяет рынок?

Цитата
Sergey Gorokhov написал:
Например если есть два шлюза которые транслируют одинаковые инструменты, но разные фирмы
Речь про шлюзы к одному рынку? Сервер может быть подключен к нескольким шлюзам одного рынка?

Цитата
Sergey Gorokhov написал:
А если так:
узнать когда количество загруженных строк в таблице будет равно количеству на сервере в том состоянии которое  доступно пользователю  в данный момент.
Что должен отправить сервер клиенту и как это что-то клиент должен интерпретировать? С учетом, что шлюзы могут быть запущены в разное время. Хотелось бы увидеть пример. Пока не понятно.
 
Цитата
Mixa написал:
Пользователь может купить бумагу на одном рынке и тут же продать ее на другом? И это будет один и тот же инструмент?
Да может. Но только при определенных условиях, таких как совпадение фирмы и счета.

Цитата
Mixa написал:
Речь про шлюзы к одному рынку? Сервер может быть подключен к нескольким шлюзам одного рынка?
Да сервер может быть подключен к нескольким шлюзам одного рынка. Хотя такая конфигурация предполагает промежуточный хаб объединяющий шлюзы в один.
То тут речь была не про это, а про одинаковые инструменты. На СПБ есть российские бумаги, а на MOEX есть зарубежные. И там есть одинаковые инструменты.

Цитата
Mixa написал:
Но связка фирма + торговый счет однозначно определяет рынок?
Нет, причины уже были озвучены.
Фирма может быть одна на все рынки.
Счет в большинстве рынков да разный, но не на всех, на том же СПБ и ФР они могут совпадать.
Итого, может быть ситуация когда фирма и счет одинаковы на ФР и СПБ.
Например Вы хотите торговать российскими бумагами на ФР, но Ваша функция покажет true по лимитам иностранного рынка СПБ, как быть?

Цитата
Mixa написал:
Что должен отправить сервер клиенту и как это что-то клиент должен интерпретировать? С учетом, что шлюзы могут быть запущены в разное время. Хотелось бы увидеть пример. Пока не понятно.
Сервер отправляет клиенту количество строк в таблице с лимитами, а потом отправляет сами лимиты.
Запустили еще шлюз. Сервер отправляет клиенту новое количество строк в таблице с лимитами, а потом отправляет сами новые лимиты.
 
Моя идея такова: сервер отправляет true по каждому подключенному шлюзу ПОСЛЕ всех лимитов. Причем, даже если на каком-то шлюзе для пользователя нет доступных лимитов, он должен отправить true в подтверждение, что все ноль доступных лимитов отгружены.
Теперь надо понять, к чему эти true привязывать на клиенте.
isLimitsLoaded(firm_id, trdaccid or client_code (в зависимости от рынка)) или isLimitsLoaded(firm_id, trdaccid, client_code) даст нам однозначный ответ?

Цитата
Sergey Gorokhov написал:
Сервер отправляет клиенту количество строк в таблице с лимитами, а потом отправляет сами лимиты.
Запустили еще шлюз. Сервер отправляет клиенту новое количество строк в таблице с лимитами, а потом отправляет сами новые лимиты.
Это предложение согласовано с программистами? Сам сервер в момент передачи первого лимита знает сколько всего лимитов он сейчас отправит?
Если клиент подключится к серверу, когда все шлюзы уже подключены, сколько раз сервер отправит клиенту количество строк? Один раз или столько же, сколько шлюзов?
И опять же, сервер не скажет по какому рынку он будет передавать лимиты?
Вы будете ждать лимиты по российским бумагам на ФР, а сервер передаст лимиты рынка СПБ, как быть?
 
Цитата
Mixa написал:
Моя идея такова: сервер отправляет true по каждому подключенному шлюзу ПОСЛЕ всех лимитов. Причем, даже если на каком-то шлюзе для пользователя нет доступных лимитов, он должен отправить true в подтверждение, что все ноль доступных лимитов отгружены.Теперь надо понять, к чему эти true привязывать на клиенте.isLimitsLoaded(firm_id, trdaccid or client_code (в зависимости от рынка)) или isLimitsLoaded(firm_id, trdaccid, client_code) даст нам однозначный ответ?

Еще раз.
На ФР и СПБ, МОГУТ быть одинаковая фирма счет и код клиента.
Как этот факт может дать однозначный ответ? Конечно никак.

Цитата
Mixa написал:
Это предложение согласовано с программистами? Сам сервер в момент передачи первого лимита знает сколько всего лимитов он сейчас отправит?
Конечно нет и не будет никакого согласования, пока мы (поддержка) не зарегистрируем пожелание, а чтобы его зарегистрировать требуется четкое понимание что требуется.

Цитата
Mixa написал:
Если клиент подключится к серверу, когда все шлюзы уже подключены, сколько раз сервер отправит клиенту количество строк? Один раз или столько же, сколько шлюзов?
Один раз, что вот столько то лимитов для клиента есть прямо сейчас.

Цитата
Mixa написал:
И опять же, сервер не скажет по какому рынку он будет передавать лимиты?
Только в разрезе таблиц, что для фьючерсов столько, для остальных столько.

Цитата
Mixa написал:
Вы будете ждать лимиты по российским бумагам на ФР, а сервер передаст лимиты рынка СПБ, как быть?

Просто, если строк в лимитах ровно столько сколько на сервере, значит на сервере больше НЕТ лимитов. НЕ нулевые, а именно вообще больше нет.
Будут ли? никто не знает, и не может знать в принципе.
Но, косвенно можно судить по наличию класса, если нужный Вам класс есть, а лимитов нет, значит их и не будет.
Если лимитов нет и класса нет, значит возможно будут когда появится класс.
 
Цитата
Sergey Gorokhov написал:
Если инструмент есть хотя бы по одному (любому) доступному пользователю классу, то тогда лимит отправится.
Вот же решение: сервер должен отправить клиенту список классов, по которым он только что отгрузил лимиты.
Самое простое решение - без разбивки по фирмам: isLimitsLoaded(class_code) покажет true для всех классов с этого шлюза.

Цитата
Sergey Gorokhov написал:
если есть два шлюза которые транслируют одинаковые инструменты, но разные фирмы, то пользователь увидит лимиты только по той фирме которая у него в правах
Решение посложнее - с фильтром по фирмам: isLimitsLoaded(firmid, class_code) покажет true только по той фирме, которая в правах у пользователя
 
Цитата
Mixa написал:
сервер должен отправить клиенту список классов, по которым он только что отгрузил лимиты.
Не должен.
Потому что:
Цитата
Sergey Gorokhov написал:
Это не будет работать по простой причине, лимиты не привязаны к классу.
Цитата
Mixa написал:
Решение посложнее - с фильтром по фирмам: isLimitsLoaded(firmid, class_code) покажет true только по той фирме, которая в правах у пользователя

И про это тоже, было сказано:
Цитата
Sergey Gorokhov написал:
Сделать задуманное означает реализовать/создать привязку лимита к классам. Проще говоря, чтобы по каждому лимиту, где то хранился список классов.Как уже было сказано сейчас такой привязки просто нет, ни в сервере ни в терминале, и никогда не было. Хранить где-то такой список ради одной функции явно выглядит нецелесообразным.
 
Sergey Gorokhov, здесь не нужна привязка конкретного лимита S к классу C.
Сервер знает, по каким классам он загружает лимиты, т.к.
Цитата
Sergey Gorokhov написал:
Если инструмент есть хотя бы по одному (любому) доступному пользователю классу, то тогда лимит отправится.
Это тот же самый список классов, который сервер получил со шлюза. Этот список он и должен отправить клиенту.
 
Цитата
Mixa написал:
Сервер знает, по каким классам он загружает лимиты, т.к.
Не знает он, было сказано же что доступность определяется по первому попавшемуся.  Никаких гарантий что конкретный лимит всегда будет грузиться по конкретному классу.
 
Цитата
Mixa написал:
Это тот же самый список классов, который сервер получил со шлюза. Этот список он и должен отправить клиенту.
Еще пример, есть класс EQRP_INFO, и есть классы TQBR, SMAL, во всех трех классах есть одинаковые инструменты.
НО, класс EQRP_INFO транслируется отдельным шлюзом. По Вашей логике, сервер должен отправить Вам только класс EQRP_INFO, а про TQBR, SMAL вообще ничего не сказать.
Так? И что Вам это даст? Вы же торговать явно не в EQRP_INFO будете.
Еще пример. Сегодня брокер загрузил EQRP_INFO раньше TQBR, SMAL, и Вы в коде напишите isLimitsLoaded(firmid, "EQRP_INFO") и оно сработает. А завтра брокер возьмет и поменяет расписание запуска шлюзов (а почему нет) и Ваш код сломается.
 
Цитата
Sergey Gorokhov написал:
Еще пример. Сегодня брокер загрузил EQRP_INFO раньше TQBR, SMAL, и Вы в коде напишите isLimitsLoaded(firmid, "EQRP_INFO") и оно сработает. А завтра брокер возьмет и поменяет расписание запуска шлюзов (а почему нет) и Ваш код сломается.

Это можно исправить только если сервер будет помнить для каждого лимита весь список классов. Чтобы можно было в функции указать любой класс. Не так ли.
Еще раз цитата:
Цитата
Sergey Gorokhov написал:
Сделать задуманное означает реализовать/создать привязку лимита к классам. Проще говоря, чтобы по каждому лимиту, где то хранился список классов.Как уже было сказано сейчас такой привязки просто нет, ни в сервере ни в терминале, и никогда не было. Хранить где-то такой список ради одной функции явно выглядит нецелесообразным.
 
Цитата
Sergey Gorokhov написал:
Никаких гарантий что конкретный лимит всегда будет грузиться по конкретному классу.
Было сказано же
Цитата
Mixa написал:
не нужна привязка конкретного лимита S к классу C.

Цитата
Sergey Gorokhov написал:
Еще пример, есть класс EQRP_INFO, и есть классы TQBR, SMAL, во всех трех классах есть одинаковые инструменты.
НО, класс EQRP_INFO транслируется отдельным шлюзом. По Вашей логике, сервер должен отправить Вам только класс EQRP_INFO, а про TQBR, SMAL вообще ничего не сказать.
Когда запустится шлюз с классом EQRP_INFO сервер отправит клиенту его. А когда запустится шлюз с классами TQBR и SMAL, шлюз отправит их.

Цитата
Sergey Gorokhov написал:
Вы же торговать явно не в EQRP_INFO будете.
Я буду ждать isLimitsLoaded(firmid, "TQBR") == true

Цитата
Sergey Gorokhov написал:
А завтра брокер возьмет и поменяет расписание запуска шлюзов
isLimitsLoaded(firmid, "TQBR") == true сработает именно после запуска шлюза с классом TQBR.
 
Цитата
Mixa написал:
isLimitsLoaded(firmid, "TQBR") == true сработает именно после запуска шлюза с классом TQBR.

Не сработает, потому что лимиты уже были отправлены при появлении EQRP_INFO
 
Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
isLimitsLoaded(firmid, "TQBR") == true сработает именно после запуска шлюза с классом TQBR.
Не сработает, потому что лимиты  уже  были отправлены при появлении EQRP_INFO

Сейчас сервер не проверяет те лимиты которые уже были отправлены.
Если делать по Вашему, то серверу придется при появлении каждого инструмента по каждому классу проверять все ранее отправленные лимиты. Такая нагрузка потенциально увеличит время готовности сервера в разы.
 
Цитата
Sergey Gorokhov написал:
серверу придется при появлении каждого инструмента по каждому классу проверять все ранее отправленные лимиты
Нет.
Серверу достаточно сверить для каких фирм какие классы транслирует шлюз и отправить клиенту true для каждой такой связки firmid - class_code.
 
Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
isLimitsLoaded(firmid, "TQBR") == true сработает именно после запуска шлюза с классом TQBR.
Не сработает, потому что лимиты  уже  были отправлены при появлении EQRP_INFO

Сработает, потому что связки firmid - "TQBR" еще не было.
 
Цитата
Mixa написал:
Серверу достаточно сверить для каких фирм какие классы транслирует шлюз и отправить клиенту true для каждой такой связки firmid - class_code.
Еще раз.
Лимиты не привязаны к классам.
Есть лимит, в нем фирма и инструмент, класса нет.
Как по Вашему, сервер должен понять по  firmid + class_code что например лимит по LKOH из TQBR должен вернуть true, при условии что лимит уже был отправлен в EQRP_INFO?
Допустим, для первого класса EQRP_INFO все понятно, сервер может его запомнить при первой отправке и функция сработает.
Но как он должен понять что по TQBR тоже должен вернуть true? только если залезет в "отправленные" и еще раз проверит лимит по LKOH на доступность.
"Доступность" это ведь не только фирма и класс, но и инструмент же. Если какой то инструмент снимут с торгов (со всех классов), сервер не отправит лимит.
Получается серверу придется выполнить одну работу уже два раза. А у брокера миллионы, десятки миллионов, лимитов по 236 классам и это только ФР. Представьте как север будет их все проверять.
 
Цитата
Sergey Gorokhov написал:
только если залезет в "отправленные" и еще раз проверит лимит по LKOH на доступность.
Еще раз.
Не в "отправленные", а в права для пользователя и сверить firmid + class_code. А есть ли в лимитах или классах LKOH серверу по барабану. Он сообщит клиенту только, что загрузил связку firmid + class_code

Цитата
Sergey Gorokhov написал:
сервер может его запомнить при первой отправке и функция сработает
И функция сработает на клиенте! Это клиент запоминает, какие классы он получил!

Цитата
Sergey Gorokhov написал:
"Доступность" это ведь не только фирма и класс, но и инструмент же. Если какой то инструмент снимут с торгов (со всех классов), сервер не отправит лимит.
Я не говорю про конкретные инструменты. Сервер отправит уведомление, что лимиты "firmid + class_code загружены". Даже если в этой связке было загружено ноль лимитов.
 
Цитата
Mixa написал:
Я не говорю про конкретные инструменты. Сервер отправит уведомление, что лимиты "firmid + class_code загружены". Даже если в этой связке было загружено ноль лимитов.

Тогда смысл в чем? Смотрите колбек OnFirm или таблицу firms, там правда нет класса, есть торговая площадка (по сути рынок). Вот Вам и isLimitsLoaded
 
Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
Я не говорю про конкретные инструменты. Сервер отправит уведомление, что лимиты "firmid + class_code загружены". Даже если в этой связке было загружено ноль лимитов.
Тогда смысл в чем? Смотрите колбек OnFirm или таблицу firms, там правда нет класса, есть торговая площадка (по сути рынок). Вот Вам и isLimitsLoaded

Нет, лучше trade_accounts (Торговые счета), там есть связка фирма+счет+список классов
 
Цитата
Sergey Gorokhov написал:
Смотрите колбек OnFirm или таблицу firms
Этот колбек нам что-то говорит о загрузке лимитов?
 
Sergey Gorokhov, вы куда-то ушли от темы.
 
Цитата
Mixa написал:
Sergey Gorokhov , вы куда-то ушли от темы.

От чего же, Вы хотели
Цитата
Mixa написал:
лимиты "firmid + class_code загружены". Даже если в этой связке было загружено ноль лимитов.
таблица trade_accounts ровно это и покажет.
Да она не показывает именно лимиты, но Вы сами же сказали что это и не требуется
Ок, смотрите trade_accounts
Если там нет нужной "firmid + class_code" значит и лимитов по ним нет. И это точно.
Если есть, значит лимиты есть, потому что запись там не появится пока не будет получен лимит по любой бумаге связывающей фирму+счет+код клиента.
 
Цитата
Sergey Gorokhov написал:
запись там не появится пока не будет получен лимит по любой бумаге связывающей фирму+счет+код клиента.
Вот именно, "по любой", т.е. лимиты могут находиться еще в процессе загрузки.
А нужно уведомление, что получены все лимиты (для данных firmid + class_code).
 
Цитата
Mixa написал:
А нужно уведомление, что получены все лимиты (для данных firmid + class_code).
К сожалению разговор уже идет по кругу.
Никак нельзя определить что лимиты загружены по firmid + class_code.
Просто нет и все.
Дорабатывать как то сервер ради этого нецелесообразно, значит работать только с тем что есть.
А того что есть недостаточно, альтернативный вариант Вас не устраивает.
Итого задача не решаема а значит считается закрытой.
Ок?
 
Цитата
Sergey Gorokhov написал:
Никак нельзя определить что лимиты загружены по firmid + class_code.
Капец!
Вы сами пишите:
Цитата
Sergey Gorokhov написал:
Если инструмент есть хотя бы по одному (любому) доступному пользователю классу, то тогда лимит отправится.
Цитата
Sergey Gorokhov написал:
пользователь увидит лимиты только по той фирме которая у него в правах
Цитата
Sergey Gorokhov написал:
Если же фирмы одинаковые, и инструменты одинаковые, но по первому шлюзу прав на классы нет (ни на один), а по второму есть (хотя бы на один), то даже если первый шлюз придет раньше, клиент не получит лимита пока не приедет второй шлюз.
Я вам пишу, что сами лимиты грузить повторно не надо.
Надо только сверить права на firmid + class_code с теми, что дает шлюз. Если они есть, значит отправляем клиенту уведомление.

Цитата
Sergey Gorokhov написал:
Ок?
Не ОК.
Давайте я буду общаться с программистом на уровне кода, раз вы не понимаете.
 
Цитата
Mixa написал:
Я вам пишу, что сами лимиты грузить повторно не надо.
Никто не говорил про повторную загрузку.
Говорилось про проверку доступности, а не загрузку. Это не одно и то же.

Цитата
Mixa написал:
Надо только сверить права на firmid + class_code с теми, что дает шлюз. Если они есть, значит отправляем клиенту уведомление.
По сути это и есть "повторная проверка доступности", разве нет?
И как уже было сказано, trade_accounts это как раз и есть проверка прав по firmid + class_code и Вы сами сказали что задачу это не решает.

Цитата
Mixa написал:
Давайте я буду общаться с программистом на уровне кода, раз вы не понимаете.
К сожалению, наш внутренний регламент не разрешает связь клиента с разработчиком.
 
Цитата
Sergey Gorokhov написал:
К сожалению, наш внутренний регламент не разрешает связь клиента с разработчиком.

Ну а как по другому, если для вас приходится "разжевывать"
Цитата
Mixa написал:
"таблица еще не загрузилась" и "таблица пустая и позиции нулевые" - это принципиально разные состояния.

И после всех объяснений, вы бьете себя пяткой в грудь и кричите: "задача не решаема, закрываем!"
Это что за самоуправство такое?!
Форум называется "Программирование на языке Lua". Если чего-то не поняли, ну проконсультируйтесь с программистом. Это-то ваш регламент разрешает?

Цитата
Sergey Gorokhov написал:
Никто не говорил про повторную загрузку.
Тогда при чем здесь "десятки миллионов лимитов"?

Цитата
Sergey Gorokhov написал:
По сути это и есть "повторная проверка доступности"
Но не по лимитам же.
Допустим, получил сервер со шлюза классы "class1,class2,class3" для firmid. Их же он и проверяет в правах (не в лимитах!) пользователей.
И это можно использовать для оптимизации: если для пользователя в правах нет ни одного доступного "firmid + class_code" с этого шлюза, то в лимиты можно уже не смотреть.
 
Цитата
Mixa написал:
И после всех объяснений, вы бьете себя пяткой в грудь и кричите: "задача не решаема, закрываем!"
Задача не решаема в том контексте который Вы просите. Ранее Вам предлагался признак загрузки всех строк в таблице лимитов - такое пожелание возможно.
Цитата
Mixa написал:
Тогда при чем здесь "десятки миллионов лимитов"?
Как уже было сказано, в предложенном варианте, серверу понадобится проверить ранее отправленные лимиты, сверив их с поступившим набором инструментов. Чтобы убедиться что отправка действительно была. Иначе вариант с правами не надежен.

Цитата
Mixa написал:
Допустим, получил сервер со шлюза классы "class1,class2,class3" для firmid. Их же он и проверяет в правах (не в лимитах!) пользователей.

Да, сервер проверяет права на классе. Фирма счет (код клиента) и отправляет клиенту те лимиты которые им удовлетворяют.
Что это даст не понятно.
Например на СПБ американские бумаги, на ФР российские, права одинаковые, лимиты разные. В результате только проверки прав недостаточно.

Цитата
Mixa написал:
И это можно использовать для оптимизации: если для пользователя в правах нет ни одного доступного "firmid + class_code" с этого шлюза, то в лимиты можно уже не смотреть.
Cервер так и делает, было же сказано что если прав нет то и лимитов нет.
 
Цитата
Sergey Gorokhov написал:
в предложенном варианте, серверу понадобится проверить ранее отправленные лимиты, сверив их с поступившим набором инструментов. Чтобы убедиться что отправка действительно была.
Нахрена?!
Подключился шлюз. Сервер получил фирму, классы, отправил лимиты клиенту (если они есть), как и раньше. Далее
Цитата
Mixa написал:
сверить права на firmid + class_code с теми, что дает шлюз.
Цитата
Mixa написал:
Если они есть, значит отправляем клиенту уведомление.

И как я написал выше, вот это
Цитата
Mixa написал:
сверить права на firmid + class_code с теми, что дает шлюз
можно сделать первым делом. И тогда
Цитата
Mixa написал:
если для пользователя в правах нет ни одного доступного "firmid + class_code" с этого шлюза, то в лимиты можно уже не смотреть.


Цитата
Sergey Gorokhov написал:
было же сказано что если прав нет то и лимитов нет.
Ага, только вы не знаете наверняка, что сервер сначала делает:
SELECT по SQL-базе или
проверку прав, а если доступных лимитов нет, то и SELECT тогда уже не нужен


Цитата
Sergey Gorokhov написал:
Например на СПБ американские бумаги, на ФР российские, права одинаковые, лимиты разные.
И? Если загружены только лимиты по ФР МБ, то isLimitsLoaded(firmid, "TQBR") даст true, а isLimitsLoaded(firmid, "SPBXM") - false и наоборот.
 
Пример:

У пользователя есть права на классы A, B по фирме Firm1 и классы D, E по фирме Firm2.
Бумага X торгуется в классах A, C и E
Скрипт торгует бумагой X в классе E, соответственно ждет лимит по фирме Firm2: isLimitsLoaded(Firm2, E)
Сервер подключен к двум шлюзам: первый шлюз транслирует классы A, B, C по фирме Firm1; второй - классы D, E по фирме Firm2.

После подключения первого шлюза сервер сверяет транслируемые классы с правами пользователя и формирует табличку вида {Firm1 = {A, B}}
Пользователю приходят лимиты по бумагам, содержащимся в классах A и B, в т.ч. по бумаге X. Как обычно, в этой части никаких изменений не требуется!
И после загрузки всех лимитов (даже если их там было 0) сервер отправляет уведомление клиенту {Firm1 = {A, B}}.
Но isLimitsLoaded(Firm2, E) = false, поэтому скрипт ждет.

Далее запускается второй шлюз.
И клиенту транслируются лимиты по бумагам D и E. Поскольку лимиты по бумаге X уже были раннее загружены, то повторно не транслируются. Все как обычно, в этой части никаких изменений не требуется!
Затем клиенту отправляется уведомление {Firm2 = {D, E}}. Это уведомление формируется на основании прав, не лимитов!
После его получения isLimitsLoaded(Firm2, E) = true  =>  Лимиты по бумаге X загружены, можно торговать в классе E.

Так понятно?
 
Mixa,
По сути Вы хотите две разные вещи. Флаг загрузки данных (его нет) и флаг наличия прав (уже есть в trade_accounts).
Вы же всеми силами пытаясь объединить два разных флага в одну функцию по косвенным признакам. А это вызывает вопросы и примеры трудности реализации.
Проще говоря, возникает слишком много разных "если".
Предложенный пример не будет надёжно работать т.к. наличие прав не всегда равно наличию данных.

Ранее Вы сами предложили
Цитата
Mixa написал:
Посчитать количество записей в таблице на сервере и отправить число клиенту. В чем проблема?
Вам предлагалось зарегистрировать такое пожелание. А именно проверку количества строк в таблице с количеством строк доступных на сервере.
Если количество совпадает то данные загружены, если нет грузятся.
И на наш взгляд такая реализация вкупе с проверкой trade_accounts решает поставленную Вами задачу, без излишних "если".

Цитата
Mixa написал:
Пример:

У пользователя есть права на классы A, B по фирме Firm1 и классы D, E по фирме Firm2.
Бумага X торгуется в классах A, C и E
Скрипт торгует бумагой X в классе E, соответственно ждет лимит по фирме Firm2: isLimitsLoaded(Firm2, E)
Сервер подключен к двум шлюзам: первый шлюз транслирует классы A, B, C по фирме Firm1; второй - классы D, E по фирме Firm2.

После подключения первого шлюза сервер сверяет транслируемые классы с правами пользователя и формирует табличку вида {Firm1 = {A, B}}
Пользователю приходят лимиты по бумагам, содержащимся в классах A и B, в т.ч. по бумаге X. Как обычно,  в этой части никаких изменений не требуется!
И после загрузки всех лимитов (даже если их там было 0) сервер отправляет уведомление клиенту {Firm1 = {A, B}}.
Но isLimitsLoaded(Firm2, E) = false, поэтому скрипт ждет.

Далее запускается второй шлюз.
И клиенту транслируются лимиты по бумагам D и E. Поскольку лимиты по бумаге X уже были раннее загружены, то повторно не транслируются. Все как обычно,  в этой части никаких изменений не требуется!
Затем клиенту отправляется уведомление {Firm2 = {D, E}}. Это уведомление формируется на основании прав, не лимитов!
После его получения isLimitsLoaded(Firm2, E) = true  =>  Лимиты по  бумаге X  загружены, можно торговать в  классе E .

В данном конкретном примере функция isLimitsLoaded вообще не нужна, и даже "Флаг загрузки данных" не обязателен, хотя его можно было бы добавить при желании:

После подключения первого шлюза сервер сверяет транслируемые классы с правами пользователя и отправляет клиенту trade_accounts в которой уже есть данные вида {Firm1 = {A, B}}
Пользователю приходят лимиты по бумагам, содержащимся в классах A и B, в т.ч. по бумаге X. Как обычно,  в этой части никаких изменений не требуется!
Пока лимиты грузятся можно было бы добавить проверку "Флаг загрузки данных".
Но в trade_accounts нет {Firm2 = {D, E}}, поэтому скрипт ждет.

Далее запускается второй шлюз.
И клиенту транслируются лимиты по бумагам D и E. Поскольку лимиты по бумаге X уже были раннее загружены, то повторно не транслируются. Все как обычно,  в этой части никаких изменений не требуется!
Клиент уже может проверить наличие {Firm2 = {D, E}} в trade_accounts
Если есть  =>  Лимиты по бумаге X  загружены (скрипт может это проверить в таблице лимитов), можно торговать в  классе E.
 
Цитата
Sergey Gorokhov написал:
И на наш взгляд такая реализация вкупе с проверкой trade_accounts решает поставленную Вами задачу

Полагаю, что не решает, потому что
Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
И опять же, сервер не скажет по какому рынку он будет передавать лимиты?
Только в разрезе таблиц, что для фьючерсов столько, для остальных столько.
Цитата
Sergey Gorokhov написал:
Но, косвенно можно судить по наличию класса
Цитата
Mixa написал:
Цитата
Sergey Gorokhov написал:
запись там не появится пока не будет получен лимит по  любой  бумаге связывающей фирму+счет+код клиента.
Вот именно, "по любой", т.е. лимиты могут находиться еще в процессе загрузки.
А нужно уведомление, что получены  все  лимиты (для данных firmid + class_code).
Это будет то же гадание, что и сейчас: загрузились/не загрузились.


Цитата
Sergey Gorokhov написал:
Флаг загрузки данных (его нет) и флаг наличия прав (уже есть в trade_accounts).
Цитата
Sergey Gorokhov написал:
наличие прав не всегда равно наличию данных.

Именно поэтому я и пишу:
Цитата
Mixa написал:
И после загрузки всех лимитов (даже если их там было 0) сервер отправляет уведомление клиенту
Если уведомление получено, а данных нет, значит их действительно нет. Это не то же самое, что сейчас, когда вы не можете определенно сказать "нулевая ли позиция" или "она ещё не получена с сервера".


Цитата
Sergey Gorokhov написал:
сервер сверяет транслируемые классы с правами пользователя и отправляет клиенту trade_accounts
ДО или ПОСЛЕ загрузки лимитов? Это ключевой момент.

Sergey Gorokhov, вы вообще понимаете разницу между состояниями 1) "загрузка еще не началась", 2) "идет процесс загрузки данных" и 3) "загрузка закончена"?
Пока вы не поймете эти базовые вещи, у вас так и будут "вопросы и примеры трудности реализации".


Цитата
Sergey Gorokhov написал:
Клиент уже может проверить наличие {Firm2 = {D, E}} в trade_accounts
Если есть  =>  Лимиты по бумаге X  загружены (скрипт может это проверить в таблице лимитов)
Как интерпретировать такую информацию: запись {Firm2 = {D, E}} в trade_accounts есть, а самого лимита по бумаге X в таблице лимитов нет?


Цитата
Sergey Gorokhov написал:
Если есть  =>  Лимиты по бумаге X  загружены
Следует ли из вашего утверждения, что описания параметров таблицы Торговые счета загружаются на клиента ПОСЛЕ загрузки лимитов по деньгам и инструментам?
Конкретизирую вопрос: следует ли из вашего утверждения, что сначала будут ПОЛНОСТЬЮ загружены лимиты по классам D и E для Firm2 и лишь затем в trade_accounts появится запись с {Firm2 = {D, E}}?
Добавьте эту информацию в официальную документацию по QLua.
 
Цитата
Mixa написал:
ДО или ПОСЛЕ загрузки лимитов? Это ключевой момент.

Определите самостоятельно, это не так трудно.

Цитата
Mixa написал:
Это будет то же гадание, что и сейчас: загрузились/не загрузились.
Еще раз. Если количество строк в таблице терминала равно количеству строк на сервере, это УЖЕ факт того что данные загрузились.
Какие данные? Вы УЖЕ можете проверить т.к. есть факт что они загрузились.

Цитата
Mixa написал:
Sergey Gorokhov , вы вообще понимаете разницу между состояниями 1) "загрузка еще не началась", 2) "идет процесс загрузки данных" и 3) "загрузка закончена"?Пока вы не поймете эти базовые вещи, у вас так и будут "вопросы и примеры трудности реализации".
А Вы понимаете, что Вам уже несколько раз было предложено?
Цитата
Mixa написал:
Если уведомление получено, а данных нет, значит их действительно нет. Это не то же самое, что сейчас, когда вы не можете определенно сказать  "нулевая ли позиция" или "она ещё не получена с сервера" .
И в чем разница:
"если количество строк в таблице = количеству на сервере, значит данные загружены, а раз нужных данных в таблице нет, значит их действительно нет.

??
Докажите что Ваше предложение хоть чем-то отличается от нашего?
разница только в том что наше в разы проще в реализации.

Цитата
Mixa написал:
Как интерпретировать такую информацию: запись {Firm2 = {D, E}} в trade_accounts есть, а самого лимита по бумаге X в таблице лимитов нет?
Выше было сказано, цитата:
Цитата
Sergey Gorokhov написал:
Пока лимиты грузятся можно было бы добавить проверку "Флаг загрузки данных".
Ситуация:
Запись {Firm2 = {D, E}} в trade_accounts есть, значит права есть. И это точно.
флаг, что все данные в таблице загружены получили.
Нужного лимита среди данных нет, значит его просто нет (брокер не загрузил)

Цитата
Mixa написал:
Конкретизирую вопрос: следует ли из вашего утверждения, что сначала будут ПОЛНОСТЬЮ загружены лимиты по классам D и E для Firm2 и лишь затем в trade_accounts появится запись с {Firm2 = {D, E}}?
Это легко проверить самостоятельно
Цитата
Mixa написал:
Добавьте эту информацию в официальную документацию по QLua.

У нас нигде нет никакой структуры определяющей строгость загрузки тех или иных данных.
 
Цитата
Sergey Gorokhov написал:
Определите самостоятельно, это не так трудно.
Для вас, видимо, трудно.
Я определил. И делюсь информацией: лимиты загружаются на клиента НЕ РАНЬШЕ описания параметров таблицы Торговые счета.
Утверждение
Цитата
Sergey Gorokhov написал:
Клиент уже может проверить наличие {Firm2 = {D, E}} в trade_accounts
Если есть  =>  Лимиты по бумаге X  загружены
не соответствует действительности.
Без дополнительного уведомления невозможно достоверно говорить о загруженности лимита по бумаге X.


Цитата
Sergey Gorokhov написал:
Вам предлагалось зарегистрировать такое пожелание. А именно проверку количества строк в таблице с количеством строк доступных на сервере.
Если количество совпадает то данные загружены, если нет грузятся.
И на наш взгляд такая реализация вкупе с проверкой trade_accounts решает поставленную Вами задачу, без излишних "если".
Напишите псевдокод, как это использовать.
 
Цитата
Mixa написал:
Напишите псевдокод, как это использовать.

Код
function main()

  while getServerNumberOf("depo_limits") != getNumberOf("depo_limits") do
    sleep(100)
  end

end
 
Цитата
Sergey Gorokhov написал:
Код
   function   main ()

   while  getServerNumberOf( "depo_limits" )  !  =   getNumberOf ( "depo_limits" )  do 
     sleep ( 100 )
   end 

 end   

Пусть делают.

Цитата
Sergey Gorokhov написал:
И на наш взгляд такая реализация вкупе с проверкой trade_accounts решает поставленную Вами задачу
С учетом того, что сервер должен отправить "количество строк доступных на сервере" ДО описания параметров таблицы Торговые счета.
 
Цитата
Mixa написал:
С учетом того, что сервер должен отправить "количество строк доступных на сервере" ДО описания параметров таблицы Торговые счета.

Ранее было сказано что у нас нет структуры определяющей строгость загрузки тех или иных данных.
Проще говоря, никто не следит за тем какие данные придут точно раньше, а какие точно позже.
Очередности просто нет. А значит и поменять ее нельзя.
Причина в том что данные едут разными потоками, которые между собой никак специально не синхронизируются.
Да есть некое условное представление о том что приедет раньше, а что позже, но это не вбито в коде, а просто устоявшееся поведение, которое может поменяться в любой момент.
 
Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
С учетом того, что сервер должен отправить "количество строк доступных на сервере" ДО описания параметров таблицы Торговые счета.

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

В таком случае, "ваш взгляд, что такая реализация решает поставленную задачу" неверный:
У вас выполнится условие getServerNumberOf("depo_limits") == getNumberOf("depo_limits"), когда загрузятся лимиты по любому рынку.
А запись в trade_accounts может точно появится раньше, чем загрузятся лимиты по бумаге X.
 
Mixa,
Пожелание уже было зарегистрировано (см соседнюю ветку).

Цитата
Mixa написал:
У вас выполнится условие getServerNumberOf("depo_limits") == getNumberOf("depo_limits"), когда загрузятся лимиты по любому рынку. А запись в trade_accounts может точно появится раньше, чем загрузятся лимиты по бумаге X.
И что это меняет? Пожелание было зарегистрировано с оговоркой чтобы гипотетическая функция getServerNumberOf будет работала для всех таблиц из списка getItem, в том числе и trade_accounts.
Таким образом, Вы сможете проверить наличие прав при условии что getServerNumberOf("trade_accounts") == getNumberOf("trade_accounts")
т.е. после того как (getServerNumberOf("depo_limits") == getNumberOf("depo_limits")) и (getServerNumberOf("trade_accounts") == getNumberOf("trade_accounts")), проверяем по trade_accounts наличие прав на нужный класс и ищем в depo_limits нужный лимит, уже уверенные что данные получены с сервера.
 
Цитата
Sergey Gorokhov написал:
после того как (getServerNumberOf("depo_limits") == getNumberOf("depo_limits")) и (getServerNumberOf("trade_accounts") == getNumberOf("trade_accounts")), проверяем по trade_accounts наличие прав на нужный класс

Если не гарантировать
Цитата
Mixa написал:
сервер должен отправить "количество строк доступных на сервере" ДО описания параметров таблицы Торговые счета
то оба эти условия выполнятся раньше, чем загрузится лимит.

Цитата
Sergey Gorokhov написал:
ищем в depo_limits нужный лимит, уже уверенные что данные получены с сервера
И это заблуждение.
 
Чтобы понять свое заблуждение, напишите нормальный псевдокод с проверкой наличия прав на нужный класс
 
Цитата
Mixa написал:
то оба эти условия выполнятся раньше, чем загрузится лимит.
Ошибаетесь.
Если лимит есть на сервере, но еще не загружен в терминал то условие НЕ выполнится и getNumberOf("depo_limits") покажет МЕНЬШЕ чем getServerNumberOf("depo_limits").


Цитата
Mixa написал:
И это заблуждение.
Ошибаетесь.
Раз данные получены с сервера, значит либо лимит есть и тогда Вы его увидите в depo_limits.
Либо лимита нет, просто нет, а не "еще не загружен".
 
Вернемся к нашему примеру.
После подключения первого шлюза:
getServerNumberOf("trade_accounts") == getNumberOf("trade_accounts") = 1
После загрузки лимитов:
getServerNumberOf("depo_limits") == getNumberOf("depo_limits") = N

Запускается второй шлюз.
Как мы выяснили:
Цитата
Mixa написал:
лимиты загружаются на клиента НЕ РАНЬШЕ описания параметров таблицы Торговые счета
Поэтому
getServerNumberOf("trade_accounts") == getNumberOf("trade_accounts") = 2  -- условие выполняется
Но и getServerNumberOf("depo_limits") == getNumberOf("depo_limits") = N  -- выполняется
Хотя лимиты со второго шлюза могут быть еще не загружены!
 
Цитата
Mixa написал:
Но и getServerNumberOf("depo_limits") == getNumberOf("depo_limits") = N  -- выполняется Хотя лимиты со второго шлюза могут быть еще не загружены!

ответ УЖЕ был:
Цитата
Sergey Gorokhov написал:
Если лимит есть на сервере, но еще не загружен в терминал то условие НЕ выполнится и getNumberOf("depo_limits") покажет МЕНЬШЕ чем getServerNumberOf("depo_limits").
 
Цитата
Sergey Gorokhov написал:
Если лимит есть на сервере, но еще не загружен в терминал то условие НЕ выполнится и getNumberOf("depo_limits") покажет МЕНЬШЕ чем getServerNumberOf("depo_limits").

Для этого надо гарантировать, что сервер отправит количество доступных на сервере лимитов ДО описания параметров таблицы Торговые счета.
В противном случае, getServerNumberOf("depo_limits") = N и getNumberOf("depo_limits") = N
 
Пока не будет получено новое значение "доступных лимитов на сервере" с нового шлюза, условие
getServerNumberOf("depo_limits") == getNumberOf("depo_limits")
будет выполняться.
 
Цитата
Mixa написал:
Для этого надо гарантировать, что сервер отправит количество доступных на сервере лимитов ДО описания параметров таблицы Торговые счета.
Мы же договорились что getServerNumberOf вернет данные в момент запроса. Хотите запрашивайте ДО описания параметров таблицы Торговые счета, хотите после. Вам уже решать

Цитата
Mixa написал:
В противном случае, getServerNumberOf("depo_limits") = N и getNumberOf("depo_limits") = N

Не доказано.
Вам уже было сказано что лимиты НЕ привязаны к классам, это можно читать так что лимиты НЕ привязаны к шлюзам (исключение только срочный рынок)

Если второй шлюз подключился, и засылает те же бумаги что и первый, с теми же фирмой и счетом, значит у пользователя УЖЕ есть нужные лимиты (получил при первом шлюзе) и условие сработает т.к. грузить просто ничего не надо.

Если фирма или счет отличаются, значит условие не сработает, значит есть еще лимиты и другого быть не может.
Нет и не может быть такой ситуации при которой по счету нет ни одного лимита. Т.к. связка между счетом и кодом клиента происходит именно через лимит по бумаге.
Так что если второй шлюз пришлет другие фирму и счет, то лимит совершенно точно будет и условие не сработает.

Если счет и фирма та же, но бумаги другие, значит либо будет лимит по новым бумагам (условие не сработает), либо лимитов вообще нет и не будет (это допустимо т.к. ранее уже был лимит с нужным счетом).
 
Цитата
Mixa написал:
Пока не будет получено новое значение "доступных лимитов на сервере" с нового шлюза, условие getServerNumberOf("depo_limits") == getNumberOf("depo_limits")будет выполняться.

Вы боитесь что сервер подсчитает сколько лимитов отправить пользователю с задержкой, т.е. пользователь получил класс и право им торговать, но сам сервер еще не одумался есть ли у пользователя лимиты? Такая ситуация невозможна, если бы она существовала то это была бы дырень в безопасности.
 
Цитата
Sergey Gorokhov написал:
getServerNumberOf вернет данные в момент запроса. Хотите запрашивайте ДО описания параметров таблицы Торговые счета, хотите после.
Но это же не прямой запрос на сервер. getServerNumberOf вернет последнее значение, полученное с сервера.
Или я вас не так понял? Синхронная функция здесь нафиг не нужна.

Цитата
Sergey Gorokhov написал:
если второй шлюз пришлет другие фирму и счет, то лимит совершенно точно будет и условие не сработает
Условие не сработает только ПОСЛЕ получения нового значения "доступных лимитов на сервере" (N + L).
А в промежуток времени между обновлением trade_accounts и получением нового значения getServerNumberOf будет возвращать старое значение с первого шлюза
getNumberOf("depo_limits") = N
И количество лимитов в это время будет getNumberOf("depo_limits") = N

Цитата
Sergey Gorokhov написал:
Цитата
Mixa написал:
В противном случае, getServerNumberOf("depo_limits") = N и getNumberOf("depo_limits") = N
Не доказано.
Доказано, см. сообщение выше и
https://forum.quik.ru/messages/forum10/message56684/topic6537/#message56684
https://forum.quik.ru/messages/forum10/message56725/topic6537/#message56725
https://forum.quik.ru/messages/forum10/message56729/topic6537/#message56729

Цитата
Mixa написал:
Чтобы понять свое заблуждение, напишите нормальный псевдокод с проверкой наличия прав на нужный класс
Страницы: Пред. 1 2 3 След.
Читают тему
Наверх