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 )
В предыдущей версии работало, сейчас сыпет ошибки. Начинает работать только после перезапуска скрипта.
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
Скрипт висит запущеный. При подключении сыпет ошибки что не указанный инструмент не существует. При перезапуске скрипта, работает как положено.
Просто наблюдение: сначала isConnected() меняется на 1, затем через некоторое время вызывается OnConnected. Если в это время вызвать CreateDataSource, то он завершится неудачей. Есть подозрение, что так было и в предыдущих версиях, просто вместо ошибки возвращалась пустая DataSource. Можете проверить их Size().
Кстати, обнаружилась ещё одна неприятность: В 8.13 даже если CreateDataSource, вызванный в момент подключения до OnConnected(), не вернул ошибку, то Size так и останется нулевым. Suport, обратите внимание.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель, в предыдущих версиях возвращался рабочий DataSource. В коде который разгребает открытые источники там как раз есть ожидание по длине данных, раньше работало.
Вы заблуждаетесь. У вас стоит 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
Надо делать так, как надо. А как не надо - делать не надо.
Старатель, во-первых если раньше с этим кодом каждый раз работало а теперь каждый раз отказы, то не в коде проблема. Во-вторых выбросить пять тысяч сообщений занимает несколько минут так что если просто в ожидании было дело то их бы там было гораздо меньше. И в-третьих это демонстрационный код, в реальном коде ожидание подключения стоит в другом месте - суть от этого не меняется.
Старатель написал: даже если 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
Никто не говорит, что это нормально. Просто факт: отсутствие ошибки ещё не гарантирует удачный заказ графика.
Надо делать так, как надо. А как не надо - делать не надо.