ParamRequest и getParamEx2

Страницы: 1
RSS
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Начну из далека.
При заказе таблицы котировок используем
Код
Subscribe_Level_II_Quotes(class, sec)  -- Для заказа котировок с сервера
getQuoteLevel2(class, sec)  -- Для получения котировок
Мы либо получаем актуальные котировки, если стакан открыт, либо незаполненную таблицу, если стакан закрыт или котировки ещё не подгрузились с сервера.
Если закрыть стакан (отменить заказ на получение котировок с сервера), то getQuoteLevel2 вернёт незаполненную таблицу.
Т.о., мы понимаем, что, если getQuoteLevel2 вернул данные, то они актуальны.
Использование простое:
Код
function main()
  Subscribe_Level_II_Quotes(class, sec)
  -- Получаем актуальные котировки, если они есть:
  Quotes = getQuoteLevel2(class, sec)
end
-- Дальнейшие изменения в стакане можно ловить в OnQuote:
function OnQuote(class, sec)
  Quotes = getQuoteLevel2(class, sec)
end


С getParamEx2 намного сложнее. Если getParamEx2 вернул данные, то они актуальные или старые? Может, пять часов назад их заказывали, потом подписку отменили, а данные остались в кеше.
Если же брать парамтры только в OnParam, то по неликвидному инструменту их можно ждать бесконечно долго.
 
Здравствуйте, Старатель!
Если речь идет исключительно об актуальности данных, то рекомендуем перед тем, как вызывать getParamEx (getParamEx2), сначала вызывать ParamRequest.
Таким образом, после вызова getParamEx (getParamEx2) отобразятся только актуальные данные.
QUIK clients support
 
Цитата
Alexander Kopyatkevich написал:
Если речь идет исключительно об актуальности данных, то рекомендуем перед тем, как вызывать getParamEx (getParamEx2), сначала вызывать ParamRequest.Таким образом, после вызова getParamEx (getParamEx2) отобразятся только актуальные данные.
Вы уверены в том, что вы пишите?
Актуальные данные клиент покажет только после того, как они попадут с сервера на клиента. И когда это будет нам неведомо. А до тех пор getParamEx2 может показывать что угодно.
Цитата
Старатель написал:
Если getParamEx2 вернул данные, то они актуальные или старые? Может, пять часов назад их заказывали, потом подписку отменили, а данные остались в кеше.
 
Именно для этого и нужно предварительно выполнить подписку на получение определенного параметра через ParamRequest.
После выполнения подписки с сервера QUIK отправятся последние данные, которые и будут являться актуальными.
QUIK clients support
 
Alexander Kopyatkevich, можете написать код для получения параметров через getParamEx2?
С getQuoteLevel2 всё просто:

Код
if isConnected() ~= 1 then return end
function main()
  -- Заказываем получение котировок:
  Subscribe_Level_II_Quotes(class, sec)
  -- Получаем актуальные котировки, если они есть:
  Quotes = getQuoteLevel2(class, sec)
  -- Если открыт стакан или котировки были раннее заказаны другим скриптом, то сразу получим актуальные данные
  -- В противном случае в Quotes будет незаполненная таблица
  ...
end
-- Дальнейшие изменения в стакане можно ловить в OnQuote
function OnQuote(class_code, sec_code)
  if sec_code == sec and class_code == class then
    Quotes = getQuoteLevel2(class, sec)
   ...
  end
end
Я уверен, что в Quotes будут актуальные котировки или незаполненная таблица. Таблицы с неактульными котировками не будет.
Причём, даже если стакан по инструменту изменяется раз в час, получу текущие котировки, не дожидаясь следущего обновления стакана.

С getParamEx2 так не получается.
Можете написать для следующего кейса:
Получить зачение параметра для неликвидного инструмента с учётом того, что неизвестно был ли заказан параметр до запуска скрипта.
 
Здравствуйте!
Пример (для любого инструмента):
Код
function main()
 if ParamRequest(p_classcode, p_seccode, "bid")==true then
 bid = getParamEx2(p_classcode, p_seccode, "bid")
 message(bid.param_value,1)
end
end
QUIK clients support
 
Alexander Kopyatkevich, мне даже не удобно вас об этом спрашивать: полагаете ваш код покажет актуальную котировку?
А если я два часа назад добавлял параметр "BID" в ТТТ, а потом убрал его. То какую котировку мне покажет ваш код: текущую или двухчасовой давности?
 
Старатель,
А Вы проверьте.
 
Цитата
Sergey Gorokhov написал:
А Вы проверьте.
От вас, признаться, не ожидал такой некомпетентности.
В 17:07 была закрыта ТТТ
В 17:17 запущен ваш скрипт на демо. Результат ниже:
 
Старатель,
ParamRequest() это добавление в список ожидаемых заказов. Сам заказ делается раз в период. Т.е. для более-менее успешного получения заказанных параметров нужно подождать.
Для понимания что заказанный параметр начал ехать нужно ждать коллбэк OnParam(), после чего вызывать getParamEx2
 
Цитата
Sergey Gorokhov написал:
Для понимания что заказанный параметр начал ехать нужно ждать коллбэк OnParam()
С первого сообщения пытаюсь объяснить. Если параметр уже заказан (а проверить мы это никак не можем) до запуска скрипта (в ТТТ али другим скриптом), то если брать данные только в OnParam(), придётся ждать следующего обновления параметров. А для неликвидного инструмента это может быть очень не скоро. Глядишь к концу сессий чё-нить дождёмся...
А если вызывать getParamEx2 до прихода OnParam(), то нет гарантии, что там не старьё.
 
Цитата
Старатель написал:
Если параметр уже заказан (а проверить мы это никак не можем) до запуска скрипта (в ТТТ али другим скриптом), то если брать данные только в OnParam(), придётся ждать следующего обновления параметров. А для неликвидного инструмента это может быть очень не скоро. Глядишь к концу сессий чё-нить дождёмся...А если вызывать getParamEx2 до прихода OnParam(), то нет гарантии, что там не старьё.

Если параметр уже заказан, до запуска скрипта, то getParamEx2 и так получит "актуальные данные" без всяких ParamRequest и OnParam ждать нет нужды.
 
Цитата
Sergey Gorokhov написал:
Если параметр уже заказан, до запуска скрипта, то getParamEx2 и так получит "актуальные данные" без всяких ParamRequest и OnParam ждать нет нужды.
Вы поспорить или по делу? Как в скрипте узнать, что параметр уже заказан?
 
Sergey Gorokhov, сможете привести однозначный алгоритм получения параметра, который работает всегда и надёжно, и который даёт гарантированно актуальное значение, а не старые данные из кеша? И чтобы не нужно было ждать полдня, пока ожидаемый параметр поменяет своё значение.
 
Старатель,
Вам по сути нужен способ узнать включена ли подписка.
И Вы правильно заметили что
Цитата
Старатель написал:
проверить мы это никак не можем

так что предлагаем зарегистрировать от Вас пожелание на добавление такой функции
 
Цитата
Sergey Gorokhov написал:
Вам по сути нужен способ узнать включена ли подписка.
Пример с getQuoteLevel2 показателен.
Если вы про аналог функции IsSubscribed_Level_II_Quotes, то она бесполезна, т.к. показывает, что подписка включена в то время когда, данные ещё не получены.
Но дуэт Subscribe_Level_II_Quotes и getQuoteLevel2 самодостаточен и позволяет получать только актуальные данные.
PS: Обратил внимание, что после остановки скрипта, подписка на стакан не закрывается автоматически. Надо бы исправить.

Для ParamRequest и getParamEx2 хотелось бы такой же работы.
 
Скрытый текст
 
Цитата
Старатель написал:
Для ParamRequest и getParamEx2 хотелось бы такой же работы.
Поймите что стакан и ТТТ это кардинально разные таблицы которые обновляются кардинально разными способами.
Нельзя сделать в ТТТ "аналогично" как в стакане.
 
Тогда вашу функцию
Цитата
Sergey Gorokhov написал:
узнать включена ли подписка
Но чтобы она также давала информацию получен ли параметр с момента последней подписки:
nil - подписка не включена
false - подписка включена, но параметр ещё не получен
true - подписка включена, параметр получен
Или: 0, 1, 2
 
Старатель, Старатель,
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Страницы: 1
Читают тему (гостей: 1)
Наверх