написал: Когда пользователь закрывает терминал при запущенном скрипте, завершать работу скрипта не нужно, она должна продолжаться автоматом при следующем запуске терминала.
Код
while _RUN_ do
---Тело основного цикла скрипта --
end
if TBL_QUIK then -- Если используются таблицы QUIK
-- #### Задержка sleep нужна чтобы установился признак запуска скрипта при перезапуске QUIK.
-- Иначе при перезапуске QUIK не будет перезапущен скрипт.--
-- При нормальном завершении QUIK, если есть таблицы QUIK, они удаляются (и вызываются коллбеки QTABLE_CLOSE)
-- Если при этом нет задержки, то скрипт завершается и не выставляется признак необходимости его перезапуска
-- при запуске QUIK. Признак TBL_QUIK устанавливается в основной пользовательской таблице QUIK.
-- Длительность задержки выбрана экспериментально.
sleep ( 1000 )
end
Идея понятна.
поменять местами во времени реакцию на колбеки qtable_close и onstop, чтобы они обрабатывались в нормальном порядке. Именно в том, как они реально возникли. Ну как должно быть у нормальных людей.
Хорошая мысль и при этом простая.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 01.02.2025
07.02.2026 16:34:36
Всем спасибо я подожду, возможно техподдержка этого терминала сможет мне ответить
специально для Nikolz: Не нужно ничего больше писать. Большое тебе спасибо.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 01.02.2025
07.02.2026 13:03:25
Цитата
Nikolay написал: DestroyTable нельзя вызывать в колбеке окна - это отражено в документации. Вызывать OnStop руками, тем более в колбеке окна - тоже не надо.
Не ясна суть проблемы. Колбек окна - это транслятор команд в поток main, где все команды и надо обрабатывать. В окне перехватили событие - передали в main, там обработали. Если вызван OnClose, то в нем производите проверки, устанавливаете состояние скрипта (или флаг) в остановлен и поток main уже проверяет это состояние, чтобы не вызывать ничего, т.к. в процессе остановки, а, наоборот, необходимо успеть выполнить процедуры корректного завершения - закрыть окна, закрыть, сохранить открытие файлы. Если в процессе ожидания OnStop не было ошибок выполнения, то скрипт прекрасно запустится вместе с терминалом. А если нет, значит и была ошибка, приведшая к падению main и остановке скрипта до завершения процесса остановки.
это все понятно что и очевидно. Техника разделения по потокам исполнения очевидна и не является вопросом.
Вопрос в надёжном способе интерпретации сигналов о действиях пользователя.
ситуация, когда разные события генерируют одну ту же реакцию (qtable_close) и только потом через неопределенное время приходит уточняющий сигнал (onstop) является скажем так, странной. такая архитектура приводит к тому, .что нормальное человеческое событийное программирование придется разбавлять невнятным винегретом из каких то переменных и непонятных таймаутов с потолка.
спасибо всем за участие. Подожду ответ от разработчиков, если им будет что сказать видимо, придется на лету добавить в терминал ещё один метод ))))
написал: если задать при помощи этой функции окну колбек на закрытие, то он вызывается и при закрытии этого окна мышкой и при закрытии терминала.
Вызывается при закрытии терминала??? У меня так: Колбек окна:
Код
local function event_callback (mw_id, msg, row, col)
if msg = = QTABLE_CLOSE then
w_top, w_left, w_bottom, w_right = GetWindowRect (mw_id)
DestroyTable (x2_id)
DestroyTable (mw_id)
OnStop()
end
-- Другие события
end
SetTableNotificationCallback (mw_id, event_callback)
И в OnStop:
Код
function OnStop (c) -- 1-Остановка скрипта, 2-Закрытие QUIK.
if mw_id and c = = 1 then
w_top, w_left, w_bottom, w_right = GetWindowRect (mw_id)
DestroyTable (mw_id)
DestroyTable (x2_id)
end
end
OnClose вообще не используется.
Ok. Будем двигаться медленно и печально.
забудьте про onclose
смотрим на ваш пример
вставьте между строками
if msg = = QTABLE_CLOSE then w_top, w_left, w_bottom, w_right = GetWindowRect (mw_id)
вывод уведомления PrintDbgStr("QTABLE_CLOSE")
а первым оператором функции onstop PrintDbgStr("ONSTOP")
запустите скрипт, debugview и закройте терминал
смотрите в debugview.
там будут строки в таком порядке QTABLE_CLOSE ONSTOP
желающие могут проверить. Я не пробовал и буду рад ошибиться
А теперь сделаем так, чтобы в колбеке QTABLE_CLOSE работа скрипта завершалась. Это нормальное привычное поведение. Закрытие главного окна текстового редактора, майкрософт ворда или самомго терминала квик приводит к прекращению работы программы, а не к продолжению ее работы втихую. Это нормально и привычно везде и всюду, в Windows, Linux и даже, прости господи, macos. Но не в гордости российского программирования от ARQA.
когда мы это сделаем (я не могу предложить код, не знаю как у вас реализован функционал останова скрипта. Но закрытие должно быть немедленным) окажется, что
и при закрытии скрипта и при закрытии терминала мы увидим в debugview только QTABLE_CLOSE и не увидим ONSTOP.
Значит, onstop приходит позже QTABLE_CLOSE. Получается, что действия пользователя неразличимы в момент срабатывания колбека QTABLE_CLOSE, а решения о реакции нужно принимать в нем.
Вот и встаёт вопрос. Как отличить действия пользователя (закрыто окно скрипта или закрыт терминал/завершен сеанс windows) и как по закрытию окна завершить скрипт, а по завершению работы терминала ничего не делать?
я могу, конечно, поставить хук на закрытие окна терминала, но богородицу от этого неудержимо мутит.
OnClose - не колбек окна. Функция SetTableNotificationCallback задает колбек для окна.
да, верно. Именно об этом я и писал.
если задать при помощи этой функции окну колбек на закрытие, то он вызывается и при закрытии этого окна мышкой и при закрытии терминала. Причем до вызова onstop.
не понимаю, как распознать действия пользователя.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 01.02.2025
07.02.2026 09:15:51
В Спарте дефективных младенцев скидывали со скалы. По крайней мере такова легенда.
но у вас, Николоэз, есть возможность прочитать исходное сообщение несколько раз. Медленно, чтобы попытаться понять его смысл. Попробуйте.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 01.02.2025
06.02.2026 22:59:15
А если я не ошибаюсь, то как мне отличить эти два события? посмотреть состояние главного окна quik? Там будут какие то еще приколы или все стандартно?
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 01.02.2025
06.02.2026 22:48:14
Я пробовал искать по форуму, но ничего не нашел
у меня квик 12.8.3.4
запущен пользовательский скрипт, создающий окно. У окна есть колбек OnClose. Когда пользователь мышкой закрывает окно, нужно завершить работу скрипта. Нет проблем, завершаем.
Когда пользователь закрывает терминал при запущенном скрипте, завершать работу скрипта не нужно, она должна продолжаться автоматом при следующем запуске терминала.
Мне кажется, что такое поведение скрипта не является чем-то необычным и не должно требовать каких то сверхусилий.
Но нихрена! При закрытии терминала первым делом в окно скрипта сразу же приходит колбек OnClose - скрипт его обрабатывает и завершает скрипт. До OnStop дело не доходит даже, этот колбек будет вызван когда то позже.
Получается, что при вызове колбека onclose невозможно понять, что произошло - завершили скрипт или закрыли терминал.
Я чего то не понимаю или ВСЕ НА САМОМ ДЕЛЕ ТАК И ЕСТЬ?
Мир устроен так, что интересы каждого конкретного индивидуума никого не волнуют. Точно также не волнуют интересы низкоресурсных слоев социума, коими являются трейдеры-любители из среды наемной рабочей силы.
Ответ именно это вам и демонстрирует, хотя скорее всего она понятия не имеет о всех этих материях
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
01.05.2025 20:44:40
То что вы пишете про рыночный ордер справедливо к площадке срочного рынка.
для спота Московской биржи это не так, механизм другой.
да и труба - это сомнительная абстракция с учётом факта существования шлюзов.
Ладно, ввязался я во все это дерьмо, надо доделать и забыть весь этот квик как страшный сон. Изверги, надо же слепить такой Франкенштейн...
onDepolimit, Формат данных, возвращаемых onDepoLimit
Получается, чтобы писать нормальный текст, а не песни Болливуда, нужно после отправки транзакции, получения ответа ontransreply со статусом 3 в процессе ожидания колбеков onorder еще асинхронно проверять состояние заявки на предмет снятия. и если приехал бит снятия в заявке, прекращать ожидание сделок по заявке.
Охренеть можно.
Я, кстати, бывал в Мумбае. Больше никогда.
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
30.04.2025 19:45:45
И вопрос к здравому смыслу. Если терминал знает, что заявка была снята (он ведь эту информацию дает) почему бы ему не вернуть не 3 в статусе а 333? Это же нормально и логично. Он же возвращает статусы типа Транзакция не прошла контроль дополнительных ограничений, или Кросс-сделка, а чем наш случай принципиально отличается? В чем разница между Зитой и Гитой?
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
30.04.2025 19:35:29
Цитата
nikolz написал: Предположу следующее транзакция выполнена - это правда, так как заявка доставлена без ошибок в ней и принята биржей но заявка не выполнена и причина указана в ответе. Что не так?
Судя по вашему ответу, вдобавок к статусу = 3 необходимо читать текст сообщения.
Ну ок, давайте подумаем.
1. а какие еще могут быть текстовые ответы, кроме "нет встречных котировок", чтобы понять, что ждать исполнения не нужно? В камасутре я ничего даже похожего не нашел
2. Я тут видел, что терминал знает русский и английский языки (но почему то не знает хинди). Получается, нужен еще список ответов на английском?
3. А как узнать, на каком языке сейчас трудится это чудо? Я не нашел камасутре по этому поводу ничего. grep нашел в каких-то файлах терминала ключ Language, но всему должна быть мера
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
30.04.2025 18:49:48
В общем и целом, утверждение, что depolimit с максимальным номером limit_kind дает общее количество лоток/контрактов, выглядит верным. А вот когда нужно смотреть что у нас там в T0,T1,... то начинается мазохизм с разборками "а это новый или старый вариант depolimit? Старый? Тогда вызываем обработчик1. Новый - тогда делаем обработчик2". И страшный нерешаемый геморрой с торговыми датами, когда накладываются выходные и особенно праздники, так как календаря праздников и тем более переноса рабочих дней в доступе нет. Индусы среди нас, без вариантов.
Пока ковырял весь этот варёный рис, нарвался на ситуацию. Отправляю транзакцию на установку рыночного ордера. Получаю ответ
17:10:11.497 > Ответ на транзакцию: {result_msg="(161) Заявка N 9560658713 зарегистрирована и снята из-за отсутствия встречных котировок",date_time={day=30,week_day=3,min=10,hour=16,month=4,ms=601,mcs=601153,sec=10,year=2025},quantity=4,price=0,first_order num=0,got_local_time={day=30,week_day=3,min=10,hour=13,month=4,ms=497,mcs=497542,sec=11,year=2025},uid=3765,flags=2490369,firm_id ="NC0011100000",sec_code="AGRO",time=161010,sent_local_time={day=30,week_day=3,min=10,hour=13,month=4,ms=433,mcs=433926,sec=11,ye ar=2025},error_source=0,exchange_code="",class_code="QJSIM",trans_id=103070188,error_code=0,client_code="qtest658",account="NL001 1100043",gate_reply_time={day=1,week_day=1,min=0,hour=0,month=1,ms=0,mcs=0,sec=0,year=1601},balance=0,order_flags=4,status=3,orde r_num=9560658713,brokerref="qtest658//",server_trans_id=26}
Что мы тут видим? status = 3, что в руководстве по камасутре означает
«3» – транзакция выполнена;
Ну раз выполнена, то ждем исполнения рыночного ордера. Но исполнения, понятное дело, нет.
Существует ли нормальный вариант отследить эту ситуацию? Чтение текстовой диагностики или священные танцы, пожалуйста, не предлагайте.
Спасибо.
onDepolimit, Формат данных, возвращаемых onDepoLimit
на вопрос, почему в разных терминалах мы видим разные представления данных, ответа не нашел.
Там же написан ответ:
Ожидается, что в будущем на эту схему перейдет большинство брокерских компаний.
Получается, что программист должен располагать информацией, к какому брокеру подключен терминал, обновила ли эта брокерская компания схему подачи данных и предусмотреть разную их обработку.
Как минимум, удивлен. А вообще - такой восторг я испытываю, когда разбираюсь в шедеврах от индусов
Nikolay, спасибо. Проверю подход с поиском максимального limit_kind
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
28.04.2025 15:35:37
Существует ли какая-нибудь внятная документация, где сформулировано, что есть дата расчета, откуда она берется, по каким правилам формируется, что такое Тх и все остальное? Чтобы не бродить впотьмах, а просто понять.
Мне нужно следующее. Терминал, в нем происходят сделки. Нужно в колбеке ondepolimit в момент изменения позиции по инструменту найти ПОЛНУЮ позицию по этому инструменту без каких либо дат расчета и скажем, вывести ее не экран.
Есть ли какой нибудь разумный алгоритм, который позволит это сделать и у втб-подобного брокера, и у тех, кто уже исполнил перестройку и гласность?
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
28.04.2025 15:21:11
Спасибо, прочел.
на вопрос, почему в разных терминалах мы видим разные представления данных, ответа не нашел.
onDepolimit, Формат данных, возвращаемых onDepoLimit
Пользователь
Сообщений: Регистрация: 01.02.2025
28.04.2025 14:08:49
Два квика. 1 : игровой сервер Quik ip 91.209.122.220 версия терминала 12.2.2.8 Lua 5.4 2: боевой ВТБ ip 78.41.199.16 версия терминала 12.2.2.8 Lua 5.4
Смотрим, что отдается по колбеку onndepolimit, интересует поле likin_kind
как видно, на игровом сервере limit_kind закодирован датой расчета. В моем случае они бывают 20250426, 20250427, 20250428 и так далее на боевом сервере limit_kind изменяется от 0 до 3.
Соответственно, скрипт, работающий на демо, разваливается на боевом.
Вопросы.
1. Как понять ситуацию, когда разные терминалы одной версии дают данные в разных форматах? 2. Как написать скрипт, чтобы он нормально работал везде сейчас и в дальнейшем? Мне нужно получить позицию по инструменту, разбивка по датам расчета не нужна
Спасибо.
утилита для выгрузки котировок, необходимо создать утилиту для выгрузки котировок