s_mike@rambler.ru, Строго говоря отписку делать не обязательно, но в остальном можно рекомендовать вызов CreateDataSource всегда после успешного подключения к серверу. Но и тут есть нюанс. Дело в том что на первичную прокачку данных, в частности на получение списка инструментов, может потребоваться некоторое время. Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет. Забегая вперед, достоверно узнать когда появится инструмент и появится ли он вообще - нельзя. Можно добавить проверку, например на наличие инструмента в таблице securities, но и это не надежно, т.к. инструмент может пропасть (например случилась экспирация) или переехать в другой класс.
Sergey Gorokhov написал: s_mike@rambler.ru , Строго говоря отписку делать не обязательно, но в остальном можно рекомендовать вызов CreateDataSource всегда после успешного подключения к серверу. Но и тут есть нюанс. Дело в том что на первичную прокачку данных, в частности на получение списка инструментов, может потребоваться некоторое время. Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет. Забегая вперед, достоверно узнать когда появится инструмент и появится ли он вообще - нельзя. Можно добавить проверку, например на наличие инструмента в таблице securities, но и это не надежно, т.к. инструмент может пропасть (например случилась экспирация) или переехать в другой класс.
плюс к сказанному, еще может быть ситуация когда терминал подключился до запуска шлюза.
Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет.
Sergey Gorokhov написал: s_mike@rambler.ru , Строго говоря отписку делать не обязательно, но в остальном можно рекомендовать вызов CreateDataSource всегда после успешного подключения к серверу. Но и тут есть нюанс. Дело в том что на первичную прокачку данных, в частности на получение списка инструментов, может потребоваться некоторое время. Если вызов функции CreateDataSource произойдет до получения описания инструмента, то заказа не произойдет т.к. будет считаться что такого инструмента нет. Забегая вперед, достоверно узнать когда появится инструмент и появится ли он вообще - нельзя. Можно добавить проверку, например на наличие инструмента в таблице securities, но и это не надежно, т.к. инструмент может пропасть (например случилась экспирация) или переехать в другой класс.
плюс к сказанному, еще может быть ситуация когда терминал подключился до запуска шлюза.
Значит, лoмoвoе решение сoстoит в тoм, чтoбы делать перезаказ пo каждoму onconnected и пo каждoму oncleanup.
s_mike@rambler.ru написал: В этoм случае createdatasrc вернет oшибку, вернo?
функция вернет nil
Цитата
s_mike@rambler.ru написал: Значит, лoмoвoе решение сoстoит в тoм, чтoбы делать перезаказ пo каждoму onconnected и пo каждoму oncleanup.
Это не ломовое решение. Если сработал onconnected, значит терминал подключился к серверу, а вдруг он подключился до запуска шлюза который нужен? Если сработал oncleanup, значит сессия на сервере сменилась (или другой сервер) это не значит что нужный шлюз подключился, вдруг брокер его подключит с опозданием?
И потом, как уже говорилось, даже если на сервере всё уже есть, на загрузку данных после подключения к серверу (onconnected или oncleanup неважно) требуется время, даже с учетом того что таблица securities грузится первой, все равно оно требуется. Срабатывание oncleanup и onconnected не означает что информация получена.
s_mike@rambler.ru, Михаил, Предлагаю создать цикл while который будет вызывать CreateDataSource пока он возвращает nil, как только не nil выходим из цикла и работаем дальше. цикл делать в main(), в котором через функцию isConnected или флаг в событии OnConnected ждать появления связи, после чего запускать процесс. + к этому добавить проверку на количество попыток, скажем если после 5 попыток запустить CreateDataSource все еще возвращается nil, то выдавать ошибку и завершать скрипт. интервал ожидания между попытками на Ваше усмотрение, например sleep(1000)
напоимер, подключение шлюза после соединения с брокером. Типичный случай, когда подключена одна площадка, а вторая ещё нет (а по ней нужно получать данные).
давайте ещё попробуем. Надёжный способ обязательно должен быть!)))))))
s_mike@rambler.ru, Михаил, Надежного способа нет, т.к. брокер может вообще не запустить шлюз, например в случае аварии. надо ждать некоторое время (которое Вы сами укажите) и если за это время инструмент не появился то выдавать ошибку и останавливать скрипт. И именно об этом была речь выше.
Sergey Gorokhov написал: s_mike@rambler.ru , Михаил, Надежного способа нет, т.к. брокер может вообще не запустить шлюз, например в случае аварии. надо ждать некоторое время (которое Вы сами укажите) и если за это время инструмент не появился то выдавать ошибку и останавливать скрипт. И именно об этом была речь выше.
сергей.
мне не нужно останавливать скрипт никогда. Он получает много данных из разных классов.
Даже если сейчас один из необходимых инструментов недоступен, он может стать доступным позже. И никакой причины останавливать скрипт нет.
терминал вы ведь не останавливаетесь, верно
все-таки...
я уже утомился получать ответы на свои вопросы про Квик в стиле "надёжно это сделать нельзя".
s_mike@rambler.ru, Ну если Вы предложите способ передать в Lua информацию о том что брокер вдруг решил не запустить шлюз, или уронил чашку кофе на сервер, то можно подумать над надежным решением.
Я оперирую в том пространстве, которое описано в документации на терминал и qlua.
там нет ничего по бутерброды брокера и прочую чушь.
поэьому для меня этого не существуют. Со своими брокерами и их серверами разбирайтесь сами до тех пор, пока в документации не появятся инструменты воздействия с ними
Я извиняюсь, что приходится писать длинно, но Сергей... Сосредоточьтесь и прекратите писать чушь.
может, кто-то из сотрудников компании сможет придти на помощь Сергею? Ответы в стиле бутерброда демонстрируют отсутствие идей.
s_mike@rambler.ru, Михаил, Надежного способа нет т.к. технически нет никакой возможности его реализовать. Если Вы уверены в брокере, описанное решение можно назвать надежным.
увидеть, что подключен пока только шлюз акций, а нужно получать фьючерс, которого на акциях нет, но который станет доступным позже и по этому поводу останавливать скрипт?
вы про это решение? Это не решение а ерунда какая-то..
s_mike@rambler.ru, Решение не в том чтобы останавливать скрипт, а в том чтобы добавить цикл ожидания появления нужного инструмента. Хотите не останавливать скрипт - пожалуйста, это Ваше право.
увидеть, что подключен пока только шлюз акций, а нужно получать фьючерс, которого на акциях нет, но который станет доступным позже и по этому поводу останавливать скрипт?
вы про это решение? Это не решение а ерунда какая-то..
Представьте себе, что у Вас нет никакого скрипта, а Вы работаете вручную на Quik. Подойдя в очередной раз к компьютеру Вы с удивлением обнаруживаете, что подключены к серверу брокера, но все таблицы на экране - пустые. Что Вы будете делать? То же должен сделать и скрипт. Причем описанная ситуация - не гипотетическая, а вполне реальная, по крайней мере из-за моего "шикарного" брокера: он может дать подключиться к серверу (при этом "случится" OnCleanUp), но трансляцию данных может не начать и через 5, и через 10 минут после этого. Такое, правда, случалось только в неторговое время. И дело здесь не в неправильной работе клиентского терминала Quik, а в "такой" работе сервера брокера. Мой скрипт 1 минуту ждет старта потока данных. А затем спрашивает у пользователя, что ему делать: прекратить работу с инструментом (т.к. его, возможно, на самом деле уже нет на бирже, и я просто забыл в настройках скрипта сменить его на более поздний), ждать старта трансляции еще "заданное" время, или сменить сервер. Пока скрипт ждет моей реакции, он продолжает каждые 10 секунд проверять начало трансляции.
По OnCleanUp и OnConnected, я не перезапускаю CreateDataSource. За неполный год работы скрипта еще ни разу проблем не возникало. Если скрипт уже был успешно подключен к трансляции через CreateDataSource, то после указанных событий трансляция (вызов пользовательского колбека) сама прекрасно рестартовала с первого индекса.
Sergey Gorokhov написал: s_mike@rambler.ru , Решение не в том чтобы останавливать скрипт, а в том чтобы добавить цикл ожидания появления нужного инструмента. Хотите не останавливать скрипт - пожалуйста, это Ваше право.
я вынес следующее предположение:
по колбекам oncleanup и onconnected я отписываюсь от всех существующих подписок, жду появления таблицы securities и пробую подписаться на все что мне нужно. Если на какой-то инструмент я подписаться не смог, значиь его пока нет в наличии.
когда он появится, я снова получу один из колбеков.
так задача всегда решается или опять будут подводные камни?