stopped = false
function main()
-------------------------------------------------------
-- Создание параметризированной функции-замыкания коллбека (с дополнительными (кроме index)
-- параметрами ds и par, задаваемыми в момент создания).
-- Использование ds:SetUpdateCallback(CreateUpdateCallbackDS(func, ds, par))
-- параметр par необязателен, но если он fаlse, то тело функции не выполняется.
-- ! Исключения в функции коллбека перехватываются. Коллбек при этом отключается с выдачей сообщения об исключении.
-- Параметры:
-- func(index, ds, par) - функция обработки коллбеков (вызываемых по изменениям свечи) --
-- ds - открытый источник;
-- par - параметр (может отсутствовать) --
-- index - индекс свечи при выполнении коллбека;
-- Результат: параметризированная функция-замыкание - параметр для функции ds:SetUpdateCallback ---
local CreateUpdateCallbackDS = function(func, ds, par)
return
function(index) -- Обертка для func --
if par ~= false then
local kod, mes = pcall(func, index, ds, par) -- в защищенном режиме --
if mes then
message('Исключение в коллбеке (он отключен, его 3-й параметр : '.. tostring(par) .. '). Текст исключения: ' .. mes, 3)
par = false
end
end
end
end
--------------------------------------------------
--- Cl - класс, Sec - код бумаги, Int - таймфрейм.
--- T - ожидание поступления данных источника в сек. (по умолчанию 15 сек.)
local CreateDS = function(Cl, Sec, Int, T)
T = (T or 15) * 10
local ds, Error = CreateDataSource(Cl, Sec, Int)
for i = 1, T do
if not ((Error == "" or Error == nil) and ds:Size() == 0) then break end
if i == T then error('Не дождались DS: ' .. Sec .. '. Ошибка: ' .. tostring(Error)) end
sleep(100)
end
return ds
end
---------------------------------------------------
-- Вариант многократно используемой параметризированной заготовки для создания коллбеков в CreateUpdateCallbackDS --
local function cb_p(index, ds, sec_code)
local t = ds:T(index)
local _str = string.format("#%d of %d\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f %02d.%02d.%04d %02d:%02d:%02d.%04d\n",
index, ds:Size(),ds:O(index), ds:H(index), ds:L(index),
ds:C(index), ds:V(index),
t.day, t.month, t.year, t.hour, t.min, t.sec, t.ms)
message(sec_code .. ': ' .. _str)
end
---------
local ds
local function cb(index) -- одноразовая функция коллбека -
local t = ds:T(index)
local _str = string.format("#%d of %d\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f %02d.%02d.%04d %02d:%02d:%02d.%04d\n",
index, ds:Size(),ds:O(index), ds:H(index), ds:L(index),
ds:C(index), ds:V(index),
t.day, t.month, t.year, t.hour, t.min, t.sec, t.ms)
message(_str)
end
ds = CreateDS("QJSIM", "GAZP", INTERVAL_M1)
message('Size = ' .. ds:Size())
-- Вариант с созданием функции-замыкания, выдающей сообщение об исключениях во время ее выполнения ---
ds:SetUpdateCallback(CreateUpdateCallbackDS(cb))
-- ds:SetUpdateCallback() -- 1. #### это не помогает
-- ds:SetUpdateCallback(function() end) -- 2. #### и это не помогает
ds:Close() -- ?? После Close повторно установленные один раз коллбеки не срабатывают (
-- хотя источник открывается)
ds = CreateDS("QJSIM", "GAZP", INTERVAL_M1)
-- ds:SetUpdateCallback(function() end) -- 3. #### это тоже помогает вместо последующего ds:SetUpdateCallback(cb)
ds:SetUpdateCallback(cb) -- Обычный вариант (если в функции коллбека cb возникает исключение,
-- то коллбек перестает выполняться, но сообщения об этом нет)
ds:SetUpdateCallback(
CreateUpdateCallbackDS(cb_p, ds, "GAZP")) -- 4. #### Повторная установка параметризированного
-- коллбека. Если это закомментировать, то коллбек не запускается
-- ds:SetUpdateCallback(cb) -- 5. #### Это , вместо пункта 4, тоже проходит
while not stopped do
sleep(3000)
-- message('while Size = ' .. ds:Size())
end
end
function OnStop(row)
stopped = true
end
---
-- Резюме (смотрите комментарии, выделенные строкой ####).
--- После ds:Close(), ds = CreateDataSource(...) повторно установленный коллбек cb не срабатывает
-- (хотя источник открывается и свечи приходят).
-- Но если устанавливать два раза: ds:SetUpdateCallback(cb) ds:SetUpdateCallback(cb),то cb срабатывает --
|