Функция CreateDataSource никогда не возвращает ошибку

Страницы: 1
RSS
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
 
Смотрим документацию к функции 3.10.4. CreateDataSource:
Цитата
TABLE data_source, STRING error_desc CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, [, STRING param])
Описание результата выполнения функции:
Цитата
Функция возвращает таблицу data_source в случае успешного завершения. Если указан
неверный код класса или параметр, то возвращается «nil». При этом error_desc содержит
описание ошибки.
Несложный скрипт для проверки этого утверждения, показывает что это не так.
То есть имеется ошибка в реализации данной функции!
Прошу исправить.

Код скрипта:
Код
function main()

    local class = "SPBFUT"
    local sec = "SiU6"
    local interval = 0
    
    local is_error = false
    local ds, error_descr = CreateDataSource(class, sec, interval)
    if (error_descr ~= nil) then
      is_error = true
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval) .. " Error: " .. error_descr
    end
    
    if (ds == nil) then
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval)
      is_error = true
    end

    if is_error then
        message(sec .. ": Error subscription. Message: " .. tostring(error_descr))
    else
        message(sec .. ": Subscription OK. ds:Size()==" .. tostring(ds:Size()))        
    end
    
    
    
    
    
    sec = "SiH5"
    ds, error_descr = CreateDataSource(class, sec, interval)
    if (error_descr ~= nil) then
      is_error = true
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval) .. " Error: " .. error_descr
    end
    
    if (ds == nil) then
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval)
      is_error = true
    end

    if is_error then
        message(sec .. ": Error subscription. Message: " .. tostring(error_descr))
    else
        message(sec .. ": Subscription OK. ds:Size()==" .. tostring(ds:Size()))        
    end
    
    
    
    
    
    
    
    sec = "GARB"
    ds, error_descr = CreateDataSource(class, sec, interval)
    if (error_descr ~= nil) then
      is_error = true
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval) .. " Error: " .. error_descr
    end
    
    if (ds == nil) then
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval)
      is_error = true
    end

    if is_error then
        message(sec .. ": Error subscription. Message: " .. tostring(error_descr))
    else
        message(sec .. ": Subscription OK. ds:Size()==" .. tostring(ds:Size()))        
    end
    
    
    
    
    
    sec = "SiM7"
    ds, error_descr = CreateDataSource(class, sec, interval)
    if (error_descr ~= nil) then
      is_error = true
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval) .. " Error: " .. error_descr
    end
    
    if (ds == nil) then
      error_descr = "Can't create data source for " .. class .. ", " .. sec .. ", " .. tostring(interval)
      is_error = true
    end

    if is_error then
        message(sec .. ": Error subscription. Message: " .. tostring(error_descr))
    else
        message(sec .. ": Subscription OK. ds:Size()==" .. tostring(ds:Size()))        
    end
end


При выполнении этого скрипта я бы хотел получить 3 ошибки из четырех.
Потому что делаю подписку на два фьючерса, которые давно истекли.
+ подписываюсь на полнейший треш (тикера GARB в секции SPBFUT нет и надеюсь не будет)

Но на самом деле мне создаю 4 датасорса ( ds ~= nil ) и конечно нет никаких указаний на ошибку ( error_descr == nil ).
Это очень сильно мешает жить!

Сценариев вижу 3 и в каждом из них хотелось бы получить внятное сообщение об ошибке СРАЗУ после завершения функции CreateDataSource.
  1. Идет подписка на всякий шлак (невалидная секция или тикер). В ответ сразу нажно вернуть nil, "Unknown security" независимо от интервала запроса

  2. Идет подписка на истекший фьючерс или облигацию. В ответ сразу вернуть nil, "Expired security". Для тикового интервала точно.
    Но для остальных интервалов тоже лучше сразу вернуть ошибку. Это будет логично и консистентно.
  3. Если по инструменту нет ни одной единицы данных (например, по фьючерсу ALSI-3.17 или по дальним опционам),
    то хотелось бы тоже получить сообщение об ошибке. nil, "There is no data in the security". По крайней мере для дневных,
    недельных и месячных интервалов нет никакой проблемы сразу определить, что инструмент -- шлак -- и не морочить людям голову с попытками выкачать из него бары.
Из-за озвученной проблемы мне пришлось внедрить в код получения баров 20-секундный таймаут. Потому что априорно нет никаких гарантий,
что бары придут (или должны приходить) быстрее.
То есть грубо говоря выполняется подписка на инструмент, я проверяю ему ds:Size() > 0 и если вдруг датасорс пуст, нет возможности сразу понять
это я ошибся в указании тикера, инструмент уже истек или это полный шлак с которым и разговаривать вообще не о чем.
 
Здравствуйте,

Цитата
Антон Кыт. написал:
То есть имеется ошибка в реализации данной функции!
Прошу исправить.

Не видим ошибки в функции. Так как в документации четко сказано
Цитата
Если указан
неверный код класса или параметр, то возвращается «nil». При этом error_desc содержит
описание ошибки.
Вы же, экспериментируете с кодом инструмента.

Касаемо остального, Вы сами как пользователь для себя должны определить чем лично Вам надо торговать а чем нет. Программа в этом месте даже больший враг чем Вы.
Либо попросите Вашего брокера настроить блокировку на те инструменты которые он посчитает неликвидом.

С нашей стороны, можем только предложить зарегистрировать от Вас пожелание на проверку существования бумаги в классе.
 
С точки зрения программиста, и class_code, и sec_code, и interval -- всё это параметры этой функции.
В описании не сказано, что "валидируется только (сомнительной нужности) param".

Ошибка именно в логике реализации.
Пользователь может подписаться на то, чего нет в природе. И ждать каких-то баров потом.
И Пользователь может подписаться на инструмент, который уже давно умер.
Фьючерса SiH5 уже давно нет в списке поддерживаемых инструментов, а подписаться на него можно.

Хорошо, зарегистрируйте пожалуйста доработки
- "Проверка существования бумаги в классе"
- "Проверка указания правильного интервала" (В данный момент можно без проблем заказать интервал "17")

Видимо, если это будет сделано, то автоматически будет отказано в подписке на истекшие фьючерсы и облигации...

Спасибо.
 
Цитата
Sergey Gorokhov написал:
Касаемо остального, Вы сами как пользователь для себя должны определить чем лично Вам надо торговать а чем нет.
Чтобы это определить, всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize()
Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории?

Тогда мы действительно могли бы отсеять неликвид типа ALSI-3.17, сверх-дальней нефти или опять же опционов.

Достаточно реализовать его для таймфремов D1, W1, MN1.
Тогда передача обновленного значения этого счетчика будет происходить максимум 2 раза за сессию
(после подключения + если появился новый дневной бар).
Для остальных ТФ можно возвращать nil или "-1".

Связываться же с брокером смысла нет: сегодня неликвид один, завтра другой. К тому же он отрежет опционы заодно.
К тому же я, например, первый раз слышу, что так вообще в принципе можно делать.
Даже в голову не приходило, если честно. =)
 
Может запросить информацию по инструменту?
Если его нет - то не будет и информации.
 
Цитата
Антон Кыт. написал:
Хорошо, зарегистрируйте пожалуйста доработки
- "Проверка существования бумаги в классе"
- "Проверка указания правильного интервала" (В данный момент можно без проблем заказать интервал "17")

Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.

Цитата
Антон Кыт. написал:
метод датасорса ds:ServerSize()

Он и сейчас есть ds:Size()
 
Цитата
Антон Кыт. написал:
Чтобы это определить, всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize()
Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории?

Цитата
Sergey Gorokhov написал:
Цитата
Антон Кыт.   написал:
метод датасорса ds:ServerSize()
Он и сейчас есть ds:Size()
Так ли это?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Sergey Gorokhov написал:
Он и сейчас есть ds:Size()
Не согласен. Уточняю.
ds:Size() показывает сколько данные содержится сейчас на стороне Квика.
Если это тиковый источник, то там может быть 0, потом станет 1000, потом 5000, пока не докачается все 500 000 тиков.
(Кстати, этот процесс может занимать до 5-10 минут для высоколиквидных тикеров RIH7, SiH7)

А я говорю про метод, который показывает именно объём данных на стороне сервера.

Причем хотелось бы получить эту информацию СРАЗУ, не дожидаясь закачки всех данных с сервера.
Чтобы сэкономить ресурсы, предлагаю ограничить этот функционал старшими таймфреймами.
 
Цитата
swerg написал:
Может запросить информацию по инструменту?
Если его нет - то не будет и информации.
Ещё раз говорю: мы создаём датасорс. Если ds:Size() == 0 -- это ещё не значит, что в нем данных.
Это легко означает, что эти данные просто ещё не докачались.
Если по какой-то причине это важно, то приходится засекать время и хотя бы 10-20 секунд ждать изменится ли ds:Size() или так и останется нулевым.
Но тут надо понимать, что если тикеров 100 или 1000, то тупо на эти таймауты нужно тогда закладывать полчаса.
Это же ужас!
 
Цитата
Антон Кыт. написал:
Хорошо, зарегистрируйте пожалуйста доработки
- "Проверка существования бумаги в классе"
- "Проверка указания правильного интервала" (В данный момент можно без проблем заказать интервал "17")

Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Добрый день,

    Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам,     что реализация пожелания признана потенциально целесообразной. Если     по результатам дальнейшего анализа, включающего юридические аспекты,     анализ на непротиворечивость с общей политикой компании, никаких     возражений не возникнет, мы постараемся включить Ваше пожелание в     план доработок при выпуске одной из следующих версий нашего ПО.
 
Цитата
Антон Кыт. написал:
Цитата
swerg   написал:
Может запросить информацию по инструменту?
Если его нет - то не будет и информации.
Ещё раз говорю: мы создаём датасорс. Если ds:Size() == 0 -- это ещё не значит, что в нем данных.
Это легко означает, что эти данные просто  ещё не докачались .
Если по какой-то причине это важно, то приходится засекать время и хотя бы
при чем тут :size

поискать инструмент, получить его параметры(размер лота)
будет понятно - существует ли он вообще
 
Цитата
swerg написал:
при чем тут :size

поискать инструмент, получить его параметры(размер лота)
будет понятно - существует ли он вообще

И вот зачем все эти танцы с бубнами? Делать после каждого CreateDataSource лишний вызов getParamEx?
Тем более, если всё так просто, то функция должна сразу вернуть признак ошибки и мгновенно завершиться.

И второе. Говорю не только про инструменты, которых нет в природе.
Говорю также про инструменты, которые в природе есть, но по ним по какой-то объективной причине вообще нет данных.

Яркий пример опционы. Допустим, Вам нужно подписаться на все опционы для RIH7 и запросить по ним данные.
Это примерно 500-900 тикеров в сумме.
Большая часть опционов не имеет ни одного трейда за всю историю.

Но чтобы в этом убедиться -- нужно подписываться на барную историю и ждать несколько секунд, чтобы убедиться
в том, что больше ничего не пришлют. Да и то это рискованное решение на самом деле.

Как ещё один вариант, в момент создания датасорса сразу присылать по нему признак ds:ServerHasCandles()
как признак того, что по инструменту в момент подписки уже есть хоть один бар (НА СЕРВЕРЕ ИСТОРИИ!).
 
Цитата
Антон Кыт. написал:
всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize()
Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории

Почему это пожелание проигнорировано?
Поддерживаю его. Возможные возвращаемые значения:
натуральное число - количество свечей на сервере истории;
0 - история по заказанному инструменту на сервере отсутствует;
nil - информация о количестве свечей на сервере ещё не доступна.

Т.о., если использование цикла ожидания
Код
while ds:Size() == 0 then
небезопасно и может привести к бесконечному ожиданию, то цикл
Код
while ds:ServerSize() == nil then
в этом смысле безопасен.
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,

Вы предлагаете по сути заказывать информацию, не заказывая информацию. Так нельзя.
Если заказали информацию, то получили ее размер (через Size), если не заказали то ничего не получили.
 
Если и делать что-то подобное, то вне ds, отдельной функцией, например через транзакции, тогда возможно исключить терминал.
В таком контексте устоит?
 
Цитата
Sergey Gorokhov написал:
Вы предлагаете по сути заказывать информацию, не заказывая информацию. Так нельзя.
Если заказали информацию, то получили ее размер (через Size), если не заказали то ничего не получили.
Вы не правы. Я предлагаю возвращать корректную информацию. Если информацию с сервера не получили, то её размер не определён (nil).
Проблема как раз в том, что в текущем виде ноль невозможно интерпретировать должным образом.
В данном случае устроило бы решение в виде возврата честного нуля, тогда и только тогда, когда точно известно, что по бумаге нет сделок. Если сервер ещё ничего не прислал, то Size должен возвращать nil.

Цитата
Sergey Gorokhov написал:
Если и делать что-то подобное, то вне ds, отдельной функцией, например через транзакции, тогда возможно исключить терминал.
Это уже ваше дело, как реализовывать. Главное, чтобы можно было однозначно понять, стоит ли ждать чарта по бумаге или нет.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Sergey Gorokhov написал:
Если и делать что-то подобное, то вне ds, отдельной функцией, например через транзакции, тогда возможно исключить терминал.
В таком контексте устоит?
Если синтаксически это должно быть оформлено каком-то другим способом (например, отдельной функцией) мы смиренно примем любой вариант.
Лишь бы этот способ существовал в принципе.
С другой стороны, если уже будет реализовано любое решение данной задачи, то становится снова неясно, почему эту функцию нельзя сделать
доступной через объект DataSource?..

Ещё раз повторю: сейчас вынужден для каждого инструмента ждать не менее 10 секунд, проверяя, что ds:Size() == 0 прежде чем прийти к выводу,
что данных нет вообще.
Если речь идет о массовой работе с малоликвидными инструментами (например, с опционами) это будет выливаться в минуты и даже в десятки минут
бессмысленного и беспощпдного ожидания.
 
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Цитата
Старатель написал:
Это уже ваше дело, как реализовывать. Главное, чтобы можно было однозначно понять, стоит ли ждать чарта по бумаге или нет.
    Добрый день,

    Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам,     что реализация пожелания признана потенциально целесообразной. Если     по результатам дальнейшего анализа, включающего юридические аспекты,     анализ на непротиворечивость с общей политикой компании, никаких     возражений не возникнет, мы постараемся включить Ваше пожелание в     план доработок при выпуске одной из следующих версий нашего ПО.
 
Здравствуйте! Прошло 5 лет. Скажите пожалуйста, появились ли функции, позволяющие определять что данных по инструменту нет и ответа от CreateDataSource() не будет? Чтобы не ждать на каждый запрос по 20-30 секунд?
 
Цитата
Variable написал:
Здравствуйте! Прошло 5 лет. Скажите пожалуйста, появились ли функции, позволяющие определять что данных по инструменту нет и ответа от CreateDataSource() не будет? Чтобы не ждать на каждый запрос по 20-30 секунд?
Стоит ли ждать ответа?
 
Цитата
Variable написал:
Здравствуйте! Прошло 5 лет. Скажите пожалуйста, появились ли функции, позволяющие определять что данных по инструменту нет и ответа от CreateDataSource() не будет? Чтобы не ждать на каждый запрос по 20-30 секунд?
Здравствуйте.

На текущий момент функционал не реализован. Когда будет, в данной ветке форума появится соответствующее сообщение с номером версии терминала.
 
Если используете колбек, то данные получаете поэлементно.
-------------------------
Если используете DDE, то данные приходят блоками по 16384 элемента.
----------------------
Обнаружить наличие данных можно  на первом же блоке.
-------------------------
Время приема одного элемента по DDE  не более 10 мкс.
-----------------------
Время приема блока данных 16384 не более 0.1 секунды.
---------------------
Зачем ждать годами, вместо того, чтобы изучить СИ и сделать  то, что хотите.
---------------------------------
"Без труда не бывает не ... я."
 
Цитата
Daniil Pozdnyakov написал:
Цитата
Variable написал:
Здравствуйте! Прошло 5 лет. Скажите пожалуйста, появились ли функции, позволяющие определять что данных по инструменту нет и ответа от CreateDataSource() не будет? Чтобы не ждать на каждый запрос по 20-30 секунд?
Здравствуйте.

На текущий момент функционал не реализован. Когда будет, в данной ветке форума появится соответствующее сообщение с номером версии терминала.
В современном мире попросить подождать 5 лет, а потом ещё 5 лет - это значит "никогда". :(
 
Цитата
nikolz написал:
Если используете колбек, то данные получаете поэлементно.
-------------------------
Если используете DDE, то данные приходят блоками по 16384 элемента.
----------------------
Обнаружить наличие данных можно  на первом же блоке.
-------------------------
Время приема одного элемента по DDE  не более 10 мкс.
-----------------------
Время приема блока данных 16384 не более 0.1 секунды.
---------------------
Зачем ждать годами, вместо того, чтобы изучить СИ и сделать  то, что хотите.
---------------------------------
"Без труда не бывает не ... я."
Я недавно познакомился с LUA и QUIK. Поправьте меня, если не прав. Но, насколько успел разобраться, DDE - это просто интерфейс получения данных, которые уже существуют локально, в терминале. Во всех функциях они всегда предварительно запрашиваются. А CreateDataSource() - наиболее "близкая" функция к источнику данных на сервере. Она позволяет получать данные, которых нет в уже существующих настройках, таблицах или данных. Всё остальное - "обёртки" к внутренним подпискам терминала, включая DDE.Через DDE доступно то, что уже доступно терминалу и локальные данные существуют. Проблема возникает когда запрашиваемых данных по инструменту нет не только локально, но и на сервере.  И вместо какого-либо извещения об этом - просто глухая тишина, которую неизвестно как интерпретировать, а только отбивать по таймауту.
 
поправляю.
DDE  и CreateDataSource() совершенно разное.
DDE - это способ обмена данными между приложениями . По-существу это клиент-серверный обмен внутри компьютера.
В квике этот способ обмена реализован для получения данных из любых таблиц терминала.
Например, в квике DDE это практически единственный   разумный способ получить доску опционов или всю таблицу текущих торгов .
----------------------------
CreateDataSource()  - это функция явного запроса (подписки) на данные с сервера брокера.
Если эти данные есть в какой-либо таблице или на графике, то очевидно что они уже подписаны для получения.
-------------------------
Сомневаюсь, что Вы не будете смотреть те данные, на которые подпишитесь.
следовательно, после первого  отображения и сохранения квика, они в следующий раз автоматом начнут загружаться.
-----------------------  
Непонятно, как это - данных нет на сервере, а Вы их запрашиваете.
Вы что их сами придумываете?  
 
Цитата
nikolz написал:
DDE - это способ обмена данными между приложениями . По-существу это клиент-серверный обмен внутри компьютера.
Да, собственно это и имел ввиду в своём сообщении. Знаю, как в принципе работает DDE. Но буду использовать, если не будет более удобного способа.


Цитата
nikolz написал:
Например, в квике DDE это практически единственный   разумный способ получить доску опционов или всю таблицу текущих торгов .
Для реализации своих замыслов, я написал DLL , запускаемую скриптом с парой строк. Всё остальное делается через мою DLL и моё приложение (запускаются функции квика, луа и прочее. Но вот CreateDataSource() работает некорректно, из-за чего и возникла эта тема. Печально удивился 5-летней тишине после обещаний довести функцию до ума.


Цитата
nikolz написал:
Непонятно, как это - данных нет на сервере, а Вы их запрашиваете.
В API квика есть функции получения классов инструментов и списка инструментов в каждом классе. Всего примерно тысяч 10. Но отзываются - примерно половина. Остальные - молчат. Естественно, что в ТТТ и прочих таблицах отображаются те, для которых данные всё-таки поступили, и только по ним можно что-то передать в стороннее приложение по DDE или ODBC. А вот по половине "молчащих" инструментов - совершенно неясно, почему они молчат. То ли период не тот и надо подождать ,то ли данных в принципе нет и не будет. Но всё это заканчивается замедлением работы программы ,вынужденной опрашивать и ждать таймаутов. :(
 
Цитата
Variable написал:
Цитата
nikolz написал:
DDE - это способ обмена данными между приложениями . По-существу это клиент-серверный обмен внутри компьютера.
Да, собственно это и имел ввиду в своём сообщении. Знаю, как в принципе работает DDE. Но буду использовать, если не будет более удобного способа.


Цитата
nikolz написал:
Например, в квике DDE это практически единственный   разумный способ получить доску опционов или всю таблицу текущих торгов .
Для реализации своих замыслов, я написал DLL , запускаемую скриптом с парой строк. Всё остальное делается через мою DLL и моё приложение (запускаются функции квика, луа и прочее. Но вот CreateDataSource() работает некорректно, из-за чего и возникла эта тема. Печально удивился 5-летней тишине после обещаний довести функцию до ума.


Цитата
nikolz написал:
Непонятно, как это - данных нет на сервере, а Вы их запрашиваете.
В API квика есть функции получения классов инструментов и списка инструментов в каждом классе. Всего примерно тысяч 10. Но отзываются - примерно половина. Остальные - молчат. Естественно, что в ТТТ и прочих таблицах отображаются те, для которых данные всё-таки поступили, и только по ним можно что-то передать в стороннее приложение по DDE или ODBC. А вот по половине "молчащих" инструментов - совершенно неясно, почему они молчат. То ли период не тот и надо подождать ,то ли данных в принципе нет и не будет. Но всё это заканчивается замедлением работы программы ,вынужденной опрашивать и ждать таймаутов. :(
Да классов много и инструментов много.
Но не все доступны конкретному пользователю.
------------------  
Функция CreateDataSource()  не предназначена для обнаружения запрещенных для Вас классов и инструментов.
Это все можно выявить до того как подписываться.
я так и делаю. Если подписка возможно и нужна, то подписываюсь.
проблем не испытываю.
---------------------  
Могу рекомендовать сначала проверить есть ли в желаемом вами классе доступные инструменты а потом подписываться.
 
Цитата
Да классов много и инструментов много.
Но не все доступны конкретному пользователю.
Функция CreateDataSource()  не предназначена для обнаружения запрещенных для Вас классов и инструментов.
На мой взгляд (и опыт) функция, которая так или иначе "обещает перезвонить", должна это делать, если сделана корректно и дружелюбно к пользователю.
Хотя бы потому что заранее неизвестно, по какой причине нет ответа. Запрещены какие-то классы или какие-то другие причины. Если запрещена - так и надо отвечать.


Цитата
nikolz написал:
я так и делаю. Если подписка возможно и нужна, то подписываюсь.

И как вы это делаете? Как проверяете, что подписка возможна?
 
Цитата
Variable написал:
Цитата
Да классов много и инструментов много.
Но не все доступны конкретному пользователю.
Функция CreateDataSource()  не предназначена для обнаружения запрещенных для Вас классов и инструментов.
На мой взгляд (и опыт) функция, которая так или иначе "обещает перезвонить", должна это делать, если сделана корректно и дружелюбно к пользователю.
Хотя бы потому что заранее неизвестно, по какой причине нет ответа. Запрещены какие-то классы или какие-то другие причины. Если запрещена - так и надо отвечать.


Цитата
nikolz написал:
я так и делаю. Если подписка возможно и нужна, то подписываюсь.

И как вы это делаете? Как проверяете, что подписка возможна?
Очень просто. Объясняю:
Когда квик соединяется с сервером , то с сервера приходят списки классов, число параметров и инструментов в классах и списки этих инструментов и параметров.
Все это Вы видите в терминале, когда выбираете принимаемые параметры и инструменты.
--------------------
Вы не сможете выбрать больше, чем указано справа в строчках "Классов доступно" "Инструментов доступно" "Параметров доступно"  
-------------------  
вся эта информация содержится в доступных в скриптах таблицах Классы,Инструменты .
Для корректного выполнения торговых операций в скриптах  еще надо учитывать таблицы Фирмы Торговые счета и Коды клиентов. Но сейчас не об этом.
-----------------------
Резюме:
В квике Вы имеете список всех возможных классов.
Но те классы, к которым у Вас нед доступа будут пустые по инструментам,а недоступные инструменты будут пустые по параметрам.
Вот это вы и должны проверить перед тем,  как на них подписываться.
------------------
Кроме этого, инструмент может не торговаться, т е он будет в списках, но по нему не будет изменяющейся текущей информации.
Это тоже можно проверять.
--------------
примерно так.
 
Цитата
nikolz написал:
Вы не сможете выбрать больше, чем указано справа в строчках "Классов доступно" "Инструментов доступно" "Параметров доступно"
Если создавать, к примеру, "таблицу текущих торгов" и нажать кнопки "добавить всё"(все доступные инструменты и доступные параметры) - то создаётся таблица со всеми ~10 тыс инструментами и параметрами. Т.е. получается выбрать всё.  Все классы и все инструменты. Как и в функциях getClassesList() и getClassSecurities().

Другое дело, что таблица постепенно будет заполняться тем, на что сервер брокера не "отмалчивается".
Цитата
nikolz написал:
Кроме этого, инструмент может не торговаться, т е он будет в списках, но по нему не будет изменяющейся текущей информации.Это тоже можно проверять.
К сожалению, это не "проверка", а такое же ожидание по таймауту.  А вообще ,надеялся, что подскажете способ программно проверить доступность информации, а не вручную ,через создание и менеджмент окон.

А так, пока не вижу разницы... похоже, при создании ТТТ на 10 тыс инструментов терминал подписывается на всё, а там уж какая информация придёт и заполнит соотв. строки. А почему пустая строка - пусть смотрит и думает пользователь.
 
Цитата
Variable написал:
Цитата
nikolz написал:
Вы не сможете выбрать больше, чем указано справа в строчках "Классов доступно" "Инструментов доступно" "Параметров доступно"
Если создавать, к примеру, "таблицу текущих торгов" и нажать кнопки "добавить всё"(все доступные инструменты и доступные параметры) - то создаётся таблица со всеми ~10 тыс инструментами и параметрами. Т.е. получается выбрать всё.  Все классы и все инструменты. Как и в функциях getClassesList() и getClassSecurities().

Другое дело, что таблица постепенно будет заполняться тем, на что сервер брокера не "отмалчивается".
Цитата
nikolz написал:
Кроме этого, инструмент может не торговаться, т е он будет в списках, но по нему не будет изменяющейся текущей информации.Это тоже можно проверять.
К сожалению, это не "проверка", а такое же ожидание по таймауту.  А вообще ,надеялся, что подскажете способ программно проверить доступность информации, а не вручную ,через создание и менеджмент окон.

А так, пока не вижу разницы... похоже, при создании ТТТ на 10 тыс инструментов терминал подписывается на всё, а там уж какая информация придёт и заполнит соотв. строки. А почему пустая строка - пусть смотрит и думает пользователь.
я проверяю программно.
-------------------
Разница есть, копайте глубже.
--------------------
В зависимости от начальных данных, алгоритм может отличаться .
-------------------------
То, что программно можно, сто пудов.
------------------
Не понимаю, зачем Вам 10 тысяч инструментов.  
 
и еще...
Если Вы в таблицу текущих торгов  установите
все доступные классы  и все инструменты и все параметры
то вы все доступные инструменты получите в колбеке  onParam.  
 
Цитата
nikolz написал:
и еще...
Если Вы в таблицу текущих торгов  установите
все доступные классы  и все инструменты и все параметры
то вы все доступные инструменты получите в  колбеке  onParam.      
Колбэк возникает тогда, когда поступают данные с сервера брокера. Если по инструменту брокер отмалчивается -колбэка не будет. Мне кажется вы не понимаете сути проблемы с молчанием сервера вместо отказа, и так или иначе предлагаете варианты с таймаутом. Тем не менее, благодарю за помощь, ещё раз убедился, что поддержка не зря признала проблему и обещала решение "когда-нибудь".
 
Цитата
Variable написал:
Цитата
nikolz написал:
и еще...
Если Вы в таблицу текущих торгов  установите
все доступные классы  и все инструменты и все параметры
то вы все доступные инструменты получите в  колбеке  onParam.      
Колбэк возникает тогда, когда поступают данные с сервера брокера. Если по инструменту брокер отмалчивается -колбэка не будет. Мне кажется вы не понимаете сути проблемы с молчанием сервера вместо отказа, и так или иначе предлагаете варианты с таймаутом. Тем не менее, благодарю за помощь, ещё раз убедился, что поддержка не зря признала проблему и обещала решение "когда-нибудь".
Не понял про какой тайм-аут Вы говорите.
---------------
Я определяю доступные инструменты при запуске квика (скрипта).
Нет никакого тайм-аута.
Но возможно вас не понял.
 
 
Решили ли проблему, когда CreateDataSource() тупо молчит, если в данном "классе-инструменте-интервале" на сервере нет данных? Или всё таки возвращает какой-то признак отсутствия данных?
 
Брокер же получает данные с биржи. Я не знаю, как оно там внутри устроено, но вполне возможно, что если вы первый клиент, подписывающийся на какой-то инструмент, то именно в этот момент и будет отправлен запрос на биржу. А вот есть ли в биржевых протоколах (plaza, fix/fast) возможность узнать, придут ли вообще данные?
 
Не нужны никакие таймауты. Надо просто работать по событиям. По приходу данных - свечей, сделок, котировок, ...
 
Цитата
paluke написал:
Брокер же получает данные с биржи. Я не знаю, как оно там внутри устроено, но вполне возможно, что если вы первый клиент, подписывающийся на какой-то инструмент, то именно в этот момент и будет отправлен запрос на биржу. А вот есть ли в биржевых протоколах (plaza, fix/fast) возможность узнать, придут ли вообще данные?
Объясняю как там устроено.
----------------------
Биржа рассылает общую информацию периодически в  широковещательном режиме.
Все профи ее получают вне зависимости от вашего подписания.
Когда Вы подписываетесь,
то Вас включат в список рассылок на сервере брокера  QUIK ( разработчики QUIK поправят, им виднее).
Страницы: 1
Читают тему
Наверх