s_mike@rambler.ru написал: Вопрос по tradedate. В какой момент происходит ее изменение?
tradedate меняется после смены сессии на сервере. Это не тоже самое что смена астрономической даты. Смена сессии как правило происходит утром следующего дня, после рестарта сервера. Иногда делается два рестарта сервера, при этом сессия меняется только после второго рестарта. А иногда, сервер утром подымают на старых данных и сессия меняется только после подключения первого шлюза. Все зависит от нужд брокера.
На нашем демо контуре, смена сессии происходит ежедневно после первого рестарта утром, примерно в 3 часа по МСК. Судя по логам, 25го числа демо контур корректно поменял сессию примерно в 3 утра по МСК и никаких проблем с этим не было. В связи с чем объяснить почему Вы видели 24е число к сожалению не можем. Проверили сегодня, проблема не повторяется. В связи с чем можем предположить что это какая-то локальная проблема.
s_mike@rambler.ru, Если нет доверия к сказанному, увы убеждать Вас в противном никто не будет. Если есть проблема, значит с ней нужно разбираться, а не надеяться что ответ будет найден сходу. Как уже было сказано и еще раз повторим, у нас описанная ситуация не повторяется. А у Вас? И хотелось бы взглянуть на полную версию кода.
Приходится экспериментировать, так как нет внятной документации.
Приход колбека в 10 -00 был обусловлен настройками автоподключения. Время автоподключения было установлено с 10-00 до 23-00.
В момент подключения приходит колбек, в котором производится запрос getInfoParam("TRADEDATE")
Результат исполнения - либо пустой либо строка времени. Исходя из ваших разъяснений время может придти как вчерашнее так и сегодняшнее взависимости от температуры бабушки системного администратора сервера квик.
Кашамала какая-то..
Сергей.
Сможете привести однозначный алгоритм определения торговой даты, которая работает всегда и надежно, без расползающихся условностей?
Похоже что Вы запрашиваете данные через getInfoParam в момент когда в терминал эти данные еще не пришли. Колбеки срабатывают непосредственно перед тем как данные появятся в терминале. Как вариант, можно смотреть getInfoParam в main(), после того как сработает OnCleanUp Можем предложить зарегистрировать пожелание на добавление в OnCleanUp параметра, в котором будет возвращаться дата торгов.
Похоже что Вы запрашиваете данные через getInfoParam в момент когда в терминал эти данные еще не пришли. Колбеки срабатывают непосредственно перед тем как данные появятся в терминале. Как вариант, можно смотреть getInfoParam в main(), после того как сработает OnCleanUp Можем предложить зарегистрировать пожелание на добавление в OnCleanUp параметра, в котором будет возвращаться дата торгов.
Был бы толк от этих регистраций....
Я правильно понимаю, что сначала срабатывает колбек oncleanup и только потом торговая дата кладется в то место, откуда ее вынимает getInfoParam?
s_mike@rambler.ru написал: Я правильно понимаю, что сначала срабатывает колбек oncleanup и только потом торговая дата кладется в то место, откуда ее вынимает getInfoParam?
s_mike@rambler.ru написал: Я правильно понимаю, что сначала срабатывает колбек oncleanup и только потом торговая дата кладется в то место, откуда ее вынимает getInfoParam?
да
От моего имени зарегистрировано за 10 лет пара десятков пожеланий.Не было случая чтобы реализовали. Уж не знаю какой у вас толк, а для меня никакого.
"Как вариант, можно смотреть getInfoParam в main(), после того как сработает OnCleanUp "
Отлично. И насколько позже? И как узнать, что данные уже обновились, если придти может снова вчерашняя дата?
s_mike@rambler.ru написал: От моего имени зарегистрировано за 10 лет пара десятков пожеланий.Не было случая чтобы реализовали. Уж не знаю какой у вас толк, а для меня никакого.
Простите, но именно лично от Вас было зарегистрировано пожелание на добавление функций SetValue, GetValue, SetRangeValue Конкретно пост на старом форуме 19/03/2014 18:54 реализовано в версии 6.15 от 03.10.2014. Да делаем не все и не сразу, но это не значит что "толку нет".
Цитата
s_mike@rambler.ru написал: Отлично. И насколько позже? И как узнать, что данные уже обновились, если придти может снова вчерашняя дата?
Добавить флаг в OnCleanUp и следить за ним в main?
Про Setvalue я действительно когда-то писал, было. Помнится, что писало об этом уйма народу кроме меня - слишком очевидная дырка была. Ну что же, теперь можно констатировать, что толк есть. Целый один толк. )))
"Добавить флаг в OnCleanUp и следить за ним в main?"
1. Если после прихода колбека мы видим герустую торговую дату - это ГАРАНТИРОВАННО в любым случаях актуальная торговая дата, а не оставшаяся в кишках со вчерашнего дня?
Sessioniddd.
что это за зверь и каковы его своейства?
я подразумеваю, что документация этого мне не расскпжет,. Если ошибаюсь - прошу прощения
s_mike@rambler.ru написал: 1. Если после прихода колбека мы видим герустую торговую дату - это ГАРАНТИРОВАННО в любым случаях актуальная торговая дата, а не оставшаяся в кишках со вчерашнего дня?
Это некий уникальные набор букв и цифр, которые однозначно определяют торговую сессию на сервере. Если этот набор поменялся, значит на сервере поменялась сессия, ну либо это какой-то другой сервер. По этому и было сказано что лучше его использовать совместно с TRADEDATE.
Цитата
s_mike@rambler.ru написал: Актуальная торговая дата в моем понимании -это совпадающая с тем что на графиках, таблицах и прочие.
Тогда Вам лучше забыть про TRADEDATE, т.к. после перехода на полночь она не меняется.
s_mike@rambler.ru написал: 1. Если после прихода колбека мы видим герустую торговую дату - это ГАРАНТИРОВАННО в любым случаях актуальная торговая дата, а не оставшаяся в кишках со вчерашнего дня?
нет, Вы же сами про это целый пост создали.
Прошу прощения, вопрос был не так понят. Если OnCleanUp сработал именно из-за смены сессии, то да, после колбека Вы получите актуальную дату торговой сессии. Однако, OnCleanUp может сработать не только из-за смены сессии на сервере.
как же это все же тяжело.... Вроде и вопросы стараюсь делать понятно и так, чтобы из нельзя было прочесть неправильно.
сергей.
как в вашем чертовом терминале получить сигнал о смене торговой даты?
мне не нужно других сигналов, на которые срабатывает oncleanup и всего остального. Мне нужно только получить торговую дату при старте скрипта (дату, а не nil, не бум, и не бац) и получить сигнал об изменении ее со значением новой торговой даты.
если где-то можно прочитать про эти ваши нагромождения неописаннвх сущностей -скпжиье где. Если нет - не могли бы вы просто привести луа код, который будет правильно ВСЕГДА работать?
s_mike@rambler.ru, Для начала, Вам нужно определиться, для чего именно Вам нужна дата. Если для получения данных из таблиц, графиков и прочие, то как уже было сказано TRADEDATE в данном случае не подойдет. Так как TRADEDATE это дата торговой сессии, а не астрономическая дата. Получается как только пройдет полночь, дата на графиках поменяется, а TRADEDATE останется прежним. На наш взгляд, дата торговой сессии Вам не нужна. А нужна текущая астрономическая дата, т.е. компьютера.
Sergey Gorokhov написал: s_mike@rambler.ru , Для начала, Вам нужно определиться, для чего именно Вам нужна дата. Если для получения данных из таблиц, графиков и прочие, то как уже было сказано TRADEDATE в данном случае не подойдет. Так как TRADEDATE это дата торговой сессии, а не астрономическая дата. Получается как только пройдет полночь, дата на графиках поменяется, а TRADEDATE останется прежним. На наш взгляд, дата торговой сессии Вам не нужна. А нужна текущая астрономическая дата, т.е. компьютера.
Сергей, мне даже неудобно Вам на это указывать, но астрономическая дата никак не связана с содержимым таблиц терминала. Например в воскресенье, если данные в терминале не очищены с пятницы. Они будут разными отсутствии соединения с брокером и т.д.
Тем более если время в таблицах квика зависит от какой-то глубоко закопанной галочки, о которой 99% пользователей (и я в том числе) просто не имеют понятия, так как она нахрен не нужна.
Цитата
"Получается как только пройдет полночь, дата на графиках поменяется, а TRADEDATE останется прежним."
Я не уверен, что вы уверены в написанном вами.
Зачем мне требуется весь этот огород Мне нужно собирать данные из таблицы обезличенных сделок, обрабатывать их и раскладывать по файлам. Один файл - один торговый (!) день. С отсеиванием вечерней сессии.
Ээээ, да это же просто!
А вот хрен. Потому что datetime зависит от тонны условностей, о которых уже упоминалось выше. Только не надо предлагать косорылые способы. Надо нормальный и надежный. И желательно не зависящий от галочек, разбросанных по всем пыльным углам терминала.
Повторяю свою надобность
Нужна функция, которая возвращает дату текущей сессии при старте программы. Под этой датой я понимаю последнюю дату, в которую в таблицу обезличенных сделок терминала приходили сделки.
Нужен текст колбека или еще чего-то, что мне сообщит, что эта торговая дата изменена и необходимо сделать рестарт всего скрипта.
s_mike@rambler.ru написал: Сергей, мне даже неудобно Вам на это указывать, но астрономическая дата никак не связана с содержимым таблиц терминала. Например в воскресенье, если данные в терминале не очищены с пятницы. Они будут разными отсутствии соединения с брокером и т.д.
Михаил, мне даже неудобно Вам на это указывать, но если в час ночи Вы выставите заявку по какому-нибудь рынку который в это время торгуется, то увидите текущую астрономическую дату, а не дату торговой сессии.
Цитата
s_mike@rambler.ru написал: "Получается как только пройдет полночь, дата на графиках поменяется, а TRADEDATE останется прежним." Я не уверен, что вы уверены в написанном вами.
Цитата
Sergey Gorokhov написал: Если нет доверия к сказанному, увы убеждать Вас в противном никто не будет.
Цитата
s_mike@rambler.ru написал: Мне нужно собирать данные из таблицы обезличенных сделок, обрабатывать их и раскладывать по файлам. Один файл - один торговый (!) день. С отсеиванием вечерней сессии.
Есть нормальный и надежный костыль. Если дата торгов не совпадает с датой сделки, значит что это "вечерние" сделки предыдущего дня. Оба параметра есть в таблице обезличенных сделок и никакой TRADEDATE не нужен впринципе.
Пятница повторяю, чтобы не терялась основная цель, которую я преследую. Иначе все время мы уходим в сторону.
вот и сейчас вы пишете про выставление каких-то ночных заявок. Зачем мне это? Мне все равно что там будет во времени.
к меня есть терминал и в нем есть таблица обезличенных сделок.
сделки в этой таблице могут быть датированы одним днём или двумя. Больше двух дней торговых сессий я не знаю)
мне нужно отфильтровать те сделки, которые идут последним днём. После этого собрать все эти сделки, обработать и записать в файл.
последний день я определяю через tradedate.
идея просто посмотреть, за какие даты есть в таблице обезличенных сделок сделки и выбрать те, что имеют старшую дату, не проходит из-за того, что таблица обезличенных сделок может быть в процессе закачки и сделки второго дня ещё в ней могут не присутствовать.
фильтповать по астрономическому времени нельзя. Ничто не мешает запустить скрипт в воскресенье без соединения с брокером и ни одной сделки за воскоесенье в нем не найти, хотя за пятницу (tradedate) они там будут. Я об этом вам писал и мне было неудобно.
как я понимаю, кроме общих слов я добиться ничего не смогу. Если так, я прошу прощения за беспокойство, благодарю за внимание и перестаю тратить время.
s_mike@rambler.ru написал: идея просто посмотреть, за какие даты есть в таблице обезличенных сделок сделки и выбрать те, что имеют старшую дату, не проходит из-за того, что таблица обезличенных сделок может быть в процессе закачки и сделки второго дня ещё в ней могут не присутствовать.
Цитата
Sergey Gorokhov написал: Если дата торгов не совпадает с датой сделки, значит что это "вечерние" сделки предыдущего дня.
Попробую помочь в решении Вашей задачи. В документации на QLua написано: ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- OnCleanUp Функция вызывается терминалом QUIK в следующих случаях: смена сервера QUIK внутри торговой сессии; смена пользователя, которым выполняется подключение к серверу QUIK, внутри торговой сессии; смена сессии. Формат вызова: OnCleanUp() При выполнении сразу нескольких из перечисленных условий, функция OnCleanUp() вызывается терминалом QUIK для каждого из них. Под сменой сессии подразумевается изменение идентификатора сессии при подключении к серверу QUIK. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
из описания видно, что OnCleanUp никак не связан с TRADEDATE, не нужно путать сессию (SESSIONID) с датой торгов. Иными словами, OnCleanUp сработает, если при подключении к серверу терминал посчитает, что нужно почистить старые данные. Соответственно СРАЗУ после вызова OnCleanUp в терминале не будет новых данных, терминал просто информирует о том, что он почистил старые заявки, сделки и т.д. из-за смены сессии на сервере и ожидает новые данные.
Теперь к решению Вашей задачи. Чтобы получить дату торгов Вам необходимо смотреть на колбек OnConnected: ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- OnConnected Функция вызывается терминалом QUIK при установлении связи с сервером QUIK и получении терминалом описания хотя бы одного класса. Если в течение торгового дня терминал получает новый класс, то функция вызывается еще раз, при этом параметр вызова flag принимает значение «false». Формат вызова: OnConnected(BOOLEAN flag) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Соответственно из описания видно, что терминал окончательно установил связь с сервером QUIK, если он получил ХОТЯ БЫ один класс. Из описания проблемы, которую Вы указали в посте #1 предположу, что Ваш терминал подключился к серверу QUIK и не получил ни одного класса (возможно просто еще отсутствовали шлюзы на сервере). OnCleanUp сработал, потому что на сервере сменилась сессия (SESSIONID), но TRADEDATE не поменялась, она меняется когда на сервер утром подключился шлюз с новыми данными и прислал классы. Собственно все.
Итог - получайте дату торгов после вызова OnConnected.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
скрипт должен работать и без подключения к серверу.
Тогда нужно реализовывать две ветки, собственно работа скрипта оффлайт (дата торгов не поменяется точно) и работа скрипта после коннекта к серверу (только тут уже смотреть не на OnCleanUp, а на OnConnected), а там уже в зависимости от того поменялась дата торгов или нет свои алгоритмы...
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
скрипт должен работать и без подключения к серверу.
Тогда нужно реализовывать две ветки, собственно работа скрипта оффлайт (дата торгов не поменяется точно) и работа скрипта после коннекта к серверу (только тут уже смотреть не на OnCleanUp, а на OnConnected), а там уже в зависимости от того поменялась дата торгов или нет свои алгоритмы...
а вы уверены, что торговая дата всегда меняется при с разрывом связи? Я не уверен. А точно это никто не знает)
Николай Камынин написал: Михаил,а чем не устраивает дата торгов из ТТП
Николай, это еще более условная штука, чем tradedate. ТТП может быть у пользователя вовсе не открыта или этот параметр в ней не будет присутствовать. Какие в нем инструменты есть - непонятно. Да и колбек не получишь - придется долбиться в нее на каждом проходе как ошпаренному
При этом мы ничего не выигрываем: заполнение полей ТТП произойдет уж точно никак не раньше чем параметра tradedate.
s_mike@rambler.ru написал: а вы уверены, что торговая дата всегда меняется при с разрывом связи? Я не уверен. А точно это никто не знает)
Михаил, добрый день. Что Вы имеете ввиду под изменением торговой даты с разрывом связи? Давайте разберем возможные варианты: (1) При подключении к серверу сработал OnCleanUp() следовательно (=>) идентификатор сессии в терминале не совпадает с идентификатором сессии на сервере (это возможно когда действительно сменился идентификатор сессии на сервер или когда Вы подключились к другому/резервному серверу или Вы подключились другим пользователем), дальше возможны два пути: 1 - после вызова OnConnected() смотрим на дату торгов в терминале и сравниваем ее с прошлой датой торгов (например можно хранить прошлую дату торгов в файле), если новая дата торгов БОЛЬШЕ старой => дата торгов сменилась; 2 - после вызова OnConnected() смотрим на дату торгов в терминале и сравниваем ее с прошлой датой торгов, если новая дата торгов РАВНА старой => дата торгов НЕ сменилась (такое в теории возможно, например когда брокер рестартует сервер QUIK с чисткой данных среди дня => сервер поменяет идентификатор сессии, НО дата торгов после прихода шлюзов останется прежней);
(2) При подключении к серверу OnCleanUp() НЕ СРАБОТАЛ => Вы подключились к серверу QUIK в этой сессии не первый раз и идентификатор сессии на сервере и в терминале совпадают => дата торгов не поменяется, т.к. Вы уже сегодня подключались и прошли по алгоритму (1).
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Николай. Вопрос в том, будет ли приходить onconnected, если соединение с брокером не прерывалось с момента 23-50 до 10-00.
будет ли приходить onconnected в этом случае? Я не уверен. Нужно экспериментировать и проверять (вот нечем мне в жизни заниматься кроме как ставить опыты и конспектировать поведение этого чучела)
а вообще это просто феерия: получение торговой даты (базовая функция!) вызывает у нас какие-то неимоверные усилия. Вы пишете простыни на пол экрана с кучей условий. И все это ради элементарнейшей цели.
а тот факт, что разработчики а принципе не в состоянии сказать ничего внятного, вообще удручает.
Михаил, "простыни" я пишу, чтобы Вам объяснить более детально, но можно и коротко: получайте утром новую дату торгов после срабатывания цепочки OnCleanUp() -> OnConnected().
По поводу срабатывания OnConnected(), если терминал подключен с 23-50 до 10-00. Во первых, такого не может быть, т.к. брокеру для корректной работы системы необходимо выполнить рестарт сервера между сессиями, а значит будет разрыв связи терминала с сервером QUIK (исключением может быть выходные дни). Во вторых, в документации явно написано: ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- OnConnected Функция вызывается терминалом QUIK при установлении связи с сервером QUIK и получении терминалом описания хотя бы одного класса. Если в течение торгового дня терминал получает новый класс, то функция вызывается еще раз, при этом параметр вызова flag принимает значение «false». Формат вызова: OnConnected(BOOLEAN flag) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Вот и проверил. quk 7 11 1 5, демо от арка. Тест был такой:
Код
function write_log(text)
local connect = ""
if isConnected() == 1 then
connect = "Connected"
end
local f = io.open("D:\\test.log","a")
f:write(os.date() .. " " .. connect .. " " .. text .. "\n")
f:close()
end
function main()
write_log("Start " .. getInfoParam("TRADEDATE") .. " " .. getInfoParam("SERVERTIME"))
while true do
write_log(getInfoParam("TRADEDATE") .. " " .. getInfoParam("SERVERTIME"))
sleep(60000)
end
end
function OnCleanUp()
write_log("OnCleanUp " .. getInfoParam("TRADEDATE") .. " " .. getInfoParam("SERVERTIME"))
end
function OnConnected(flag)
write_log("OnConnected flag=" .. tostring(flag) .. " " .. getInfoParam("TRADEDATE") .. " " .. getInfoParam("SERVERTIME"))
end
function OnDisconnected()
write_log("OnDisonnected " .. getInfoParam("TRADEDATE") .. " " .. getInfoParam("SERVERTIME"))
end
s_mike@rambler.ru написал: Я правильно понимаю, что сначала срабатывает колбек oncleanup и только потом торговая дата кладется в то место, откуда ее вынимает getInfoParam?
да
не подтверждается.
10/02/17 03:16:26 Connected OnCleanUp 01.10.2017
Торговая дата доступна функции getInfoParam только после завершения колбека, но в непосредственно в нем самом
2. Поведение параметра tradedate отличается от параметра servertime ServerTime недоступен в отсутствии связи с брокером а также внутри колбеков OnCleanUp и OnConnected. Про иные колбеки сказать ничего о не могу. Возможно, недоступность servertime из колбеков не есть всеобщее правило и обусловлено оно стечением обстоятельств в данном случае.
3. Предположение Nikolay Pavlov о том, что oncleanUp должен сопровождаться onconnected(true) не опровергается
Толпа колбеков OnDisconnected на уже отсоединенном от сервера терминале. Откуда и что они означают - сказать трудно. При этом в 02-48-44 связь как ни в чем не бывало уже имеется и никаких onconnected и близко нет. Туманно, загадочно и волки воют.
s_mike@rambler.ru написал: Толпа колбеков OnDisconnected на уже отсоединенном от сервера терминале. Откуда и что они означают - сказать трудно. При этом в 02-48-44 связь как ни в чем не бывало уже имеется и никаких onconnected и близко нет. Туманно, загадочно и волки воют.
Михаил, добрый день. Колбеки OnDisonnected() вызывались по следующий причине:
10/02/17 в 02:16:37 Ваш терминал был отключен от сервер Quik, но из-за того, что у Вас скорее всего настроено автоматическое восстановление связи с сервером при разрыве, терминал пытался подключиться к серверу, но его отключало по таймауту и на каждый разрыв срабатывал OnDisonnected();
10/02/17 в 02:48:44 сервер QUIK был запущен и терминал подключился корректно, без отрыва по таймауту, но на сервере отсутствовали классы (т.е. ни один шлюз после рестарта сервера еще не подключился), соответственно сервер QUIK не меняет дату торгов, он ее поменяет только после прихода хотя бы одного шлюза с новой датой торгов;
10/02/17 в 03:16:26 на сервер QUIK пришел какой-то шлюз => сменилась дата торгов и сессия на сервере, в терминале сработали OnCleanUp т.к. сменился идентификатор сессии и OnConnected с flag=true т.к. терминал получил класс и дата торгов поменялась.
Все как ранее мной и было сказано.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Старатель написал: getTradeDate() в OnCleanUp всегда даёт актуальную дату торгов или это у меня так совпало?
getTradeDate возвращает дату торговой сессии. Торговая сессия это НЕ тоже самое что астрономическая дата. например если брокер дает доступ к своему серверу в субботу, то Вы увидите дату пятницы.
getTradeDate() в OnCleanUp всегда даёт актуальную дату торговой сессии или это у меня так совпало?
Скрытый текст
Чтобы не вставать два раза, поясню: В данной теме обсуждается проблема получения в OnCleanUp параметра "Дата торгов" через запрос getInfoParam("TRADEDATE"). И действительно данный запрос в OnCleanUp возвращает дату предыдущей торговой сессии. Как обстоит дело с getTradeDate()?
Надо делать так, как надо. А как не надо - делать не надо.