Не могли бы вы мне помочь с одной проблемой, уже всю голову себе сломал.
Я пытаюсь собирать данные (OHLCV) по двум классам бумаг, чтобы записывать их в локальную базу SQL.
Для этого я написал такой код, который, работает на одной-двух бумагах, но при масштабировании на оба класса он вешает QUIK. Не могли бы вы подсказать, что мне сделать, чтобы избежать этих зависаний.
Код
classes = "TQBR,TQOB";
interval = INTERVAL_M1;
function MyCallbackForAllStocks(class, security, index)
local candle = index - 1
local Datetime = ds:T(candle).year * 10000000000+ ds:T(candle).month * 100000000 + ds:T(candle).day*100000 + ds:T(candle).hour * 10000 + ds:T(candle).min * 100 + ds:T(candle).sec; --Получаем дату и время последней закрывшейся свечки
local cOpen = ds:O(candle);
local cHigh = ds:H(candle);
local cLow = ds:L(candle);
local cClose = ds:C(candle);
local cVolume = ds:V(candle);
--Затем данные упаковываются в вектор и передаются в SQL базу.
end
end
--Создаётся обёртка
function DataSource(class,security)
ds = CreateDataSource(class, security, interval);
ds:SetUpdateCallback(function(index) MyCallbackForAllStocks(class,security,index) end)
end
--Скрипт запускается единожды вот такой конструкцией:
for class in string.gmatch(classes,"(%w+)") do
local securities = getClassSecurities(class);
for security in string.gmatch(securities,"(%w+)") do
DataSource(class, security);
end
end
Здравствуйте, Попробуйте добавить обработку в функцию main function main() for class in string.gmatch(classes,"(%w+)") do local securities = getClassSecurities(class); for security in string.gmatch(securities,"(%w+)") do DataSource(class, security); end end end
Sergey Gorokhov написал: Здравствуйте, Попробуйте добавить обработку в функцию main function main() for class in string.gmatch(classes,"(%w+)") do local securities = getClassSecurities(class); for security in string.gmatch(securities,"(%w+)") do DataSource(class, security); end end end
Пробовал не помогает. На самом деле, именно в ней у меня этот фрагмент кода и находится. У меня перед ним еще ряд условий, чтобы скрипт стартовал только раз в день, подключился к базе, обновил список бумаг в базе и т.д.
Sergey Gorokhov написал: Николай, Тогда понятно почему у нас не воспроизводится проблема. Приведите полный код, на котором проблема повторяется.
Я разобрался, по-видимому, код работает правильно, просто изначальный процесс создания источников данных занимает очень много времени. Ну и мне пришлось каждому источнику данных уникальное имя через _G[security], иначе в таблицу подгружалась какая-то мешанина.
В связи с этим вопрос, можно ли для созданных источников данных не подгружать всю историю (3000 или сколько там свечек), а получать данные только за эту сессию?
Здравствуйте, я правильно понимаю, что в последней версии QUIK (Qlua) CreateDataSource может вызываться не только из main. Или я что-то придумываю. Есть ли возможность в последней версии вызывать ее из скриптов индикаторов. Спасибо.
Как минимум в коде есть одна ошибка - в одну глобальную переменную ds присваиваются все создаваемые DataSource'ы. И соответственно данные читаются только из последнего созданного.
Надо изменить на что-то типа такого:
Код
--Создаётся обёртка
function DataSource(class,security)
local [B]ds[/B] = CreateDataSource(class, security, interval);
ds:SetUpdateCallback(function(index) MyCallbackForAllStocks(class,security[B],ds[/B],index) end)
end
interval = INTERVAL_M1
ticker_list = "AFKS,AFLT,AKRN,ALRS,AVAZP,BANE,BANEP,CHMF,DIXY,FEES,GAZP,GCHE,GMKN,GRAZ,HYDR,IRAO,KMAZ,LKOH,LNTA,LSRG,MAGN,MFON,MGNT,MOEX,MSNG,MSRS,MSTT,MTLR,MTLRP,MTSS,MVID,NLMK,NMTP,NVTK,OGKB,PHOR,PIKK,PLZL,POLY,PRTK,RASP,ROSN,RSTI,RSTIP,RTKM,RTKMP,RUALR,SBER,SBERP,SIBN,SNGS,SNGSP,SVAV,TATN,TATNP,TGKA,TRMK,TRNFP,UPRO,URKA,VTBR,VZRZ,VZRZP,YNDX"
class="TQBR"
ds={}
is_run = true
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
function main()
dofile(getWorkingFolder().."\\LuaIndicators\\MA.lua")
for sec in string.gmatch(ticker_list,"%a+") do
DataSource(class,sec,interval)
end
while is_run do
for sec in string.gmatch(ticker_list,"%a+") do
func = MA()
ma_out=func(ds[sec]:Size(), {Period=3, Metod = "EMA", VType="Close", round=2}, ds[sec])
end
end
end
MA.lua - это файл любезно выложенный разработчиками. Строчка 83:
Космонавт, Для расчета EMA требуется прогнать значения от первого до последнего. Настоятельно рекомендуем посмотреть пример, который описан в файле readme_LuaIndicators.txt
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
функция mycallbackforallstocks похоже для моих целей - лишняя. Как написать строчку