Антон Кыт. (Автор тем)

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

Страницы: 1
Функция 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 и если вдруг датасорс пуст, нет возможности сразу понять
это я ошибся в указании тикера, инструмент уже истек или это полный шлак с которым и разговаривать вообще не о чем.
Страницы: 1
Наверх