Антон Кыт. (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

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

Ещё раз повторю: сейчас вынужден для каждого инструмента ждать не менее 10 секунд, проверяя, что ds:Size() == 0 прежде чем прийти к выводу,
что данных нет вообще.
Если речь идет о массовой работе с малоликвидными инструментами (например, с опционами) это будет выливаться в минуты и даже в десятки минут
бессмысленного и беспощпдного ожидания.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
 
Цитата
swerg написал:
при чем тут :size

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

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

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

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

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

Как ещё один вариант, в момент создания датасорса сразу присылать по нему признак ds:ServerHasCandles()
как признак того, что по инструменту в момент подписки уже есть хоть один бар (НА СЕРВЕРЕ ИСТОРИИ!).
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
 
Цитата
swerg написал:
Может запросить информацию по инструменту?
Если его нет - то не будет и информации.
Ещё раз говорю: мы создаём датасорс. Если ds:Size() == 0 -- это ещё не значит, что в нем данных.
Это легко означает, что эти данные просто ещё не докачались.
Если по какой-то причине это важно, то приходится засекать время и хотя бы 10-20 секунд ждать изменится ли ds:Size() или так и останется нулевым.
Но тут надо понимать, что если тикеров 100 или 1000, то тупо на эти таймауты нужно тогда закладывать полчаса.
Это же ужас!
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
 
Цитата
Sergey Gorokhov написал:
Он и сейчас есть ds:Size()
Не согласен. Уточняю.
ds:Size() показывает сколько данные содержится сейчас на стороне Квика.
Если это тиковый источник, то там может быть 0, потом станет 1000, потом 5000, пока не докачается все 500 000 тиков.
(Кстати, этот процесс может занимать до 5-10 минут для высоколиквидных тикеров RIH7, SiH7)

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

Причем хотелось бы получить эту информацию СРАЗУ, не дожидаясь закачки всех данных с сервера.
Чтобы сэкономить ресурсы, предлагаю ограничить этот функционал старшими таймфреймами.
Из скрипта qlua подключится в БД mySQL
 
Квик -- только 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")

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

Спасибо.
Из скрипта qlua подключится в БД mySQL
 
Да, извините.
Я конечно имел в виду, что "разделителем между директорией и файлом должен быть бекслеш".
require "luasql\mysql"

можно также попробовать указать полный абсолютный путь (чтобы хотя бы начать двигаться дальше).
Функция 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 и если вдруг датасорс пуст, нет возможности сразу понять
это я ошибся в указании тикера, инструмент уже истек или это полный шлак с которым и разговаривать вообще не о чем.
Из скрипта qlua подключится в БД mySQL
 
Тогда, наверное, надо писать?
Код
require "luasql\luasql.mysql"


Но идея интересная =)
Страницы: 1
Наверх