[8.13] регрессия - CreateDataSource возвращает ошибку при запуске после подключения
Пользователь
Сообщений: Регистрация: 03.02.2021
09.04.2021 00:30:02
Код
if isConnected ( ) == 1 and do_cycle then
do_cycle = false
for class in getClasses ( ):gmatch ( "," ) do for sec in getClassSecurities ( ):gmatch ( "," ) do ds, err = CreateDataSource ( class, sec, INTERVAL_M1 )
В предыдущей версии работало, сейчас сыпет ошибки. Начинает работать только после перезапуска скрипта.
Приведите, пожалуйста, полный скрипт, при работе которого воспроизводится описанная проблема. О какой конкретно ошибке идет речь?
Пользователь
Сообщений: Регистрация: 03.02.2021
09.04.2021 17:44:25
Код
local classes = {
'TQBR',
'SPBXM',
}
local intervals = {
INTERVAL_M1,
INTERVAL_M2,
}
function main ( )
while isConnected ( ) == 0 do sleep ( 10000 ) end
local list = { }
for _, int in ipairs ( intervals ) do
for _, class in ipairs ( classes ) do
for sec in getClassSecurities ( class ):gmatch ( "([^,]+)") do
table.insert ( list, { class = class, sec = sec, int = int } )
end
end
end
local sources = { }
for _, entry in pairs ( list ) do
local source, error = CreateDataSource ( entry.class, entry.sec, intervals[ entry.int ] )
if source then
source:SetEmptyCallback ( )
table.insert ( sources, source )
else
message ( string.format ( "Failed to create data source: %s\n%s %s %s" , error, entry.class, entry.sec, entry.int ) )
end
end
for _, source in ipairs ( sources ) do
...
end
end
Скрипт висит запущеный. При подключении сыпет ошибки что не указанный инструмент не существует. При перезапуске скрипта, работает как положено.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.04.2021 23:40:57
Просто наблюдение: сначала isConnected() меняется на 1, затем через некоторое время вызывается OnConnected. Если в это время вызвать CreateDataSource, то он завершится неудачей. Есть подозрение, что так было и в предыдущих версиях, просто вместо ошибки возвращалась пустая DataSource. Можете проверить их Size().
Кстати, обнаружилась ещё одна неприятность: В 8.13 даже если CreateDataSource, вызванный в момент подключения до OnConnected(), не вернул ошибку, то Size так и останется нулевым. Suport, обратите внимание.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 03.02.2021
10.04.2021 00:32:48
Старатель, в предыдущих версиях возвращался рабочий DataSource. В коде который разгребает открытые источники там как раз есть ожидание по длине данных, раньше работало.
Пользователь
Сообщений: Регистрация: 03.02.2021
10.04.2021 00:43:32
Старатель,я приклеил патч к isConnected(), теперь работает. Спасибо.
К разработчикам просьба починить, чтобы isConnected() не возвращал истину до того как был вызван колбек OnConnected().
Пользователь
Сообщений: Регистрация: 03.02.2021
10.04.2021 00:46:17
Код
if error then message ( string.format ( "Failed to create data source: %s\n%s %s %s" , error, class, sec, int ) ) end
Вы заблуждаетесь. У вас стоит 10-секундное ожидание после подключения, поэтому часть DataSource может быть запрошена уже после OnConnected. Ещё если графики были открыты до запуска скрипта, то DataSource по ним сразу будут иметь ненулевой размер (при наличии свечей, естественно). Вот специально написал демонстрационный скрипт:
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
function main()
while isConnected() ~= 1 and run do sleep(1) end
local n = 0
local m = 0
local sources = {}
local list = ""
for sec in getClassSecurities(class):gmatch("([^,]+)") do
if not run then break end
local ds, err = CreateDataSource(class, sec, INTERVAL_M1)
if ds then
ds:SetEmptyCallback()
n = n + 1
sources[n] = {ds, sec}
list = list .. sec .. ","
else
message(string.format("Failed to create data source: %s\n%s %s", err, class, sec))
m = m + 1
end
end
message(string.format("OK: %u, ERROR: %u\n%s", n, m, list))
while n > 0 and run do
for i = n, 1, -1 do
local source = sources[i]
local size = source[1]:Size()
if size > 0 then
n = n - 1
message(string.format("%s: %u\n%u", source[2], size, n))
source[1]:Close()
table.remove(sources, i)
end
end
sleep(500)
end
end
Запускаем при установленном соединении - работает нормально.
Если запустить при неустановленном соединении а затем подключиться, то скрипт так и будет висеть в ожидании. Кроме того, если после этого открыть диаграмму с графиком из списка list (если не был открыт до запуска скрипта), то график будет пустой. Свечи появятся только после разрыва соединения.
Проверялось в 8.13 и 8.1
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 03.02.2021
10.04.2021 18:53:49
Старатель, во-первых если раньше с этим кодом каждый раз работало а теперь каждый раз отказы, то не в коде проблема. Во-вторых выбросить пять тысяч сообщений занимает несколько минут так что если просто в ожидании было дело то их бы там было гораздо меньше. И в-третьих это демонстрационный код, в реальном коде ожидание подключения стоит в другом месте - суть от этого не меняется.
Пользователь
Сообщений: Регистрация: 03.02.2021
10.04.2021 18:57:00
Точнее сказать, ожидания подключения там вообще нет.
Цитата
Старатель написал: У вас стоит 10-секундное ожидание после подключения
Перед подключением. Ну и для поста на форуме я нулей от балды бахнул просто, получилось 10 секунд. Тут суть не в этом совершенно.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
11.04.2021 00:41:22
Цитата
Старатель написал: даже если CreateDataSource, вызванный в момент подключения до OnConnected(), не вернул ошибку, то Size так и останется нулевым.
Цитата
Старатель написал: в предыдущих версиях, просто вместо ошибки возвращалась пустая DataSource.
Вместо тысячи слов:
Скрытый текст
Код
local class = "TQBR"
local sec = "SBER"
local run = true
function OnStop()
run = nil
end
function OnConnected()
message("OnConnected")
end
function main()
while isConnected() ~= 1 and run do sleep(1) end
local ds, err = CreateDataSource(class, sec, INTERVAL_M1)
if ds then
message("OK")
ds:SetEmptyCallback()
else
message(err, 3)
return
end
for i = 1, 1000 do
sleep(600)
if not run then break end
end
message(string.format("size: %u", ds:Size()))
ds:Close()
end
Никто не говорит, что это нормально. Просто факт: отсутствие ошибки ещё не гарантирует удачный заказ графика.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 03.02.2021
11.04.2021 00:54:59
Старатель, у меня там стоял таймаут на пустые источники. Все данные приходили исправно на все заказаные источники.