Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Sergey Gorokhov написал: Если и делать что-то подобное, то вне ds, отдельной функцией, например через транзакции, тогда возможно исключить терминал. В таком контексте устоит?
Если синтаксически это должно быть оформлено каком-то другим способом (например, отдельной функцией) мы смиренно примем любой вариант. Лишь бы этот способ существовал в принципе. С другой стороны, если уже будет реализовано любое решение данной задачи, то становится снова неясно, почему эту функцию нельзя сделать доступной через объект DataSource?..
Ещё раз повторю: сейчас вынужден для каждого инструмента ждать не менее 10 секунд, проверяя, что ds:Size() == 0 прежде чем прийти к выводу, что данных нет вообще. Если речь идет о массовой работе с малоликвидными инструментами (например, с опционами) это будет выливаться в минуты и даже в десятки минут бессмысленного и беспощпдного ожидания.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
поискать инструмент, получить его параметры(размер лота) будет понятно - существует ли он вообще
И вот зачем все эти танцы с бубнами? Делать после каждого CreateDataSource лишний вызов getParamEx? Тем более, если всё так просто, то функция должна сразу вернуть признак ошибки и мгновенно завершиться.
И второе. Говорю не только про инструменты, которых нет в природе. Говорю также про инструменты, которые в природе есть, но по ним по какой-то объективной причине вообще нет данных.
Яркий пример опционы. Допустим, Вам нужно подписаться на все опционы для RIH7 и запросить по ним данные. Это примерно 500-900 тикеров в сумме. Большая часть опционов не имеет ни одного трейда за всю историю.
Но чтобы в этом убедиться -- нужно подписываться на барную историю и ждать несколько секунд, чтобы убедиться в том, что больше ничего не пришлют. Да и то это рискованное решение на самом деле.
Как ещё один вариант, в момент создания датасорса сразу присылать по нему признак ds:ServerHasCandles() как признак того, что по инструменту в момент подписки уже есть хоть один бар (НА СЕРВЕРЕ ИСТОРИИ!).
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
swerg написал: Может запросить информацию по инструменту? Если его нет - то не будет и информации.
Ещё раз говорю: мы создаём датасорс. Если ds:Size() == 0 -- это ещё не значит, что в нем данных. Это легко означает, что эти данные просто ещё не докачались. Если по какой-то причине это важно, то приходится засекать время и хотя бы 10-20 секунд ждать изменится ли ds:Size() или так и останется нулевым. Но тут надо понимать, что если тикеров 100 или 1000, то тупо на эти таймауты нужно тогда закладывать полчаса. Это же ужас!
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Не согласен. Уточняю. ds:Size() показывает сколько данные содержится сейчасна стороне Квика. Если это тиковый источник, то там может быть 0, потом станет 1000, потом 5000, пока не докачается все 500 000 тиков. (Кстати, этот процесс может занимать до 5-10 минут для высоколиквидных тикеров RIH7, SiH7)
А я говорю про метод, который показывает именно объём данных на стороне сервера.
Причем хотелось бы получить эту информацию СРАЗУ, не дожидаясь закачки всех данных с сервера. Чтобы сэкономить ресурсы, предлагаю ограничить этот функционал старшими таймфреймами.
Квик -- только 32-битное приложение. =) Давно жду полноценную версию под 64-бита, но, видимо, у разработчиков нет полного понимания, что это действительно давно пора сделать.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Sergey Gorokhov написал: Касаемо остального, Вы сами как пользователь для себя должны определить чем лично Вам надо торговать а чем нет.
Чтобы это определить, всем пользователям QuikLUA был бы полезен метод датасорса ds:ServerSize() Его смысл в том, чтобы сразу узнать сколько всего баров данного таймфрейма имеется на сервере истории?
Тогда мы действительно могли бы отсеять неликвид типа ALSI-3.17, сверх-дальней нефти или опять же опционов.
Достаточно реализовать его для таймфремов D1, W1, MN1. Тогда передача обновленного значения этого счетчика будет происходить максимум 2 раза за сессию (после подключения + если появился новый дневной бар). Для остальных ТФ можно возвращать nil или "-1".
Связываться же с брокером смысла нет: сегодня неликвид один, завтра другой. К тому же он отрежет опционы заодно. К тому же я, например, первый раз слышу, что так вообще в принципе можно делать. Даже в голову не приходило, если честно. =)
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
С точки зрения программиста, и class_code, и sec_code, и interval -- всё это параметры этой функции. В описании не сказано, что "валидируется только (сомнительной нужности) param".
Ошибка именно в логике реализации. Пользователь может подписаться на то, чего нет в природе. И ждать каких-то баров потом. И Пользователь может подписаться на инструмент, который уже давно умер. Фьючерса SiH5 уже давно нет в списке поддерживаемых инструментов, а подписаться на него можно.
Хорошо, зарегистрируйте пожалуйста доработки - "Проверка существования бумаги в классе" - "Проверка указания правильного интервала" (В данный момент можно без проблем заказать интервал "17")
Видимо, если это будет сделано, то автоматически будет отказано в подписке на истекшие фьючерсы и облигации...
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
Функция возвращает таблицу 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.
Идет подписка на всякий шлак (невалидная секция или тикер). В ответ сразу нажно вернуть nil, "Unknown security" независимо от интервала запроса
Идет подписка на истекший фьючерс или облигацию. В ответ сразу вернуть nil, "Expired security". Для тикового интервала точно. Но для остальных интервалов тоже лучше сразу вернуть ошибку. Это будет логично и консистентно.
Если по инструменту нет ни одной единицы данных (например, по фьючерсу ALSI-3.17 или по дальним опционам), то хотелось бы тоже получить сообщение об ошибке. nil, "There is no data in the security".По крайней мере для дневных, недельных и месячных интервалов нет никакой проблемы сразу определить, что инструмент -- шлак -- и не морочить людям голову с попытками выкачать из него бары.
Из-за озвученной проблемы мне пришлось внедрить в код получения баров 20-секундный таймаут. Потому что априорно нет никаких гарантий, что бары придут (или должны приходить) быстрее. То есть грубо говоря выполняется подписка на инструмент, я проверяю ему ds:Size() > 0 и если вдруг датасорс пуст, нет возможности сразу понять это я ошибся в указании тикера, инструмент уже истек или это полный шлак с которым и разговаривать вообще не о чем.