local is_run = true
local date_time= ""
function OnAllTrade(alltrade)
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time)
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
Действия: Запускаю простенький тестовый скрипт и... вижу, что время перепрыгивает назад и потом возвращается. Но, всё бы ничего - да только отключение галочки "Получать пропущенные данные" - не спасает.
local act_time = 0
local prev_time = 0
local counter = 0
local is_run = true
local date_time= ""
function OnAllTrade(alltrade)
act_time = tonumber(alltrade.datetime.sec)
if act_time == prev_time then
counter=counter+1
else
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time .. " " .. tostring(counter))
counter = 0
prev_time = tonumber(alltrade.datetime.sec)
end
end
--[[
function OnAllTrade(alltrade)
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time)
end
--]]
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
Предложение: У нас уже есть раздел в меню: Свзязь->Списки. По идее, этого должно быть достаточного для квика, чтоб он понял, какие данные пользователю действительно нужны (на которые он каГбе "подписан"). Зачем было делать ещё привязку к открытым таблицам ТВС и их количеству, а также, делать малоработоспособнй галочку "Получать пропущенные данные"?
описываю подробно: я хочу измерять общее количество сделок в секунду (с позиции серверного времени разумеется) приходящих с биржи. Из-за "флешбеков" - индикатор местами выдаёт "остатки" от предыдущего таймстампа. Если я буду делать принудительную промежуточную сортировку на "боевом потоке" - убью квик. - Он просто зависнет.
и как уже писал выше - на показания счётчика не должно влиять количество открытых ТВС, всякие createdatasource, а только то, что отмечено в меню Связь->Списки.
в общем, Михаил, у меня к Вам, как самому компетентному разработчику 2 описанных выше вопроса. Хотелось бы получить на них ответы с примерами правильного QLUA-кода.
и ещё, при всём уважении к Вам - ответ "сложно" - не принимается. Именно поэтому, если Вы уже заметили - я не задаю/засоряю форум действительно простыми вещами.
Дополнительная информация: Чуть изменил скрипт, чтоб отслеживал только один тикер:
Скрытый текст
Код
local act_time = 0
local prev_time = 0
local counter = 0
local is_run = true
local date_time= ""
function OnAllTrade(alltrade)
if alltrade.class_code == "SPBFUT" and alltrade.sec_code == "SiM5" then
act_time = tonumber(alltrade.datetime.sec)
if act_time == prev_time then
counter=counter+1
else
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time .. " " .. tostring(counter))
counter = 0
prev_time = tonumber(alltrade.datetime.sec)
end
end
end
--[[
function OnAllTrade(alltrade)
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time)
end
--]]
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
тестовый 5-минутный прогон - показал:
"флешбеки" (нарушение временной последовательности распространения данных - прекратились).
Заглянул в ТВС - там полная "дискотека" - в рамках одного тикера - последовательность данных сохраняется, а между разными - полный хаос.
Скрипт считает сделки - неправильно. Пока непонятно в чём причина.
позволю предложить следующий алгоритм (так cделал бы сам): ------------------- 1) По спискам формируем таблицу играющих инструментов (критерий на ваш вкус) 2) если я ожидаю, что будут запаздывающие данные, то задаю таблицу неопределенности (т е таблицу памяти N секунд, которые могут корректироваться опоздавшими данными. 3) В колбеке считаем распределение числа сделок по N последним секундам. ------------------------------------ Ну а далее думаю - и зачем я это все посчитал???
Николай Камынин пишет: позволю предложить следующий алгоритм (так cделал бы сам): ------------------- 1) По спискам формируем таблицу играющих инструментов (критерий на ваш вкус) 2) если я ожидаю, что будут запаздывающие данные, то задаю таблицу неопределенности (т е таблицу памяти N секунд, которые могут корректироваться опоздавшими данными. 3) В колбеке считаем распределение числа сделок по N последним секундам. ------------------------------------ Ну а далее думаю - и зачем я это все посчитал???
я уже смотрел в эту сторону - но, как уже написал выше - квик будет виснуть.
Цитата
Ну а далее думаю - и зачем я это все посчитал???
а вы не думайте - я уже подумал. Вы главное, код здесь приведите.
sam063rus пишет: У нас уже есть раздел в меню: Свзязь->Списки. По идее, этого должно быть достаточного для квика, чтоб он понял, какие данные пользователю действительно нужны (на которые он каГбе "подписан"). Зачем было делать ещё привязку к открытым таблицам ТВС
Этот раздел влияет на получаемые параметры (которые отображаются, например, в Текущей таблице параметров). Список инструментов, по которым происходит получение обезличенных сделок, задается в пункте меню "Связь / Заказ всех сделок". В свою очередь настройки, которые отображаются при выборе этого пункта меню, могут меняться в зависимости от настроек открытых на текущий момент ТВС и тиковых графиков.
Цитата
sam063rus пишет: Таблица всех сделок пуста НО!!! приходит куча колбеков аж со вчерашней вечерней сессии и заканчивая сегодняшней.
Проверьте настройки в "Связь / Заказ всех сделок" - возможно, там включено получение сделок по классам Фьючерсы или Опционы FORTS (дополнительная сессия). Также название этих классов может содержать в скобках слова "история пред. вечерней сессии".
Дмитрий пишет: Проверьте настройки в "Связь / Заказ всех сделок" - возможно, там включено получение сделок по классам Фьючерсы или Опционы FORTS (дополнительная сессия). Также название этих классов может содержать в скобках слова "история пред. вечерней сессии".
я к тому, что одно дело когда они (сделки/данные) приходят для всяких таблиц и совершенно другое когда вдобавок это ещё влияет на приход коллбеков, что мне совершенно не нужно.
к тому же, я не в той ситуации когда могу отключить приход данных за вчерашнюю сессию не нарушив тем самым функционал других своих скриптов. таким образом, мне надо "и то и это" НО!!! в разных целях и без ущерба.
sam063rus пишет: я к тому, что одно дело когда они (сделки/данные) приходят для всяких таблиц и совершенно другое когда вдобавок это ещё влияет на приход коллбеков, что мне совершенно не нужно.
Ну, как бэ, да. Приход новых данных (в т.ч. и сделок) вызывает колбек. Во всех скриптах, где он (колбек) используется. Так было всегда. Если колбек не нужен в конкретном скрипте, просто игнорируйте его или не используйте функцию колбека.
Надо делать так, как надо. А как не надо - делать не надо.
act_time = 0
deal_time = 0
counter = 0
is_run = true
function OnAllTrade(alltrade)
if alltrade.class_code == "SPBFUT" and alltrade.sec_code == "SiM5" then
act_time =tonumber(string.sub(getInfoParam("SERVERTIME"), 7, 8))
if act_time == deal_time then
counter=counter+1
else
do
message(act_time .. " " .. tostring(counter))
counter = 0
deal_time = tonumber(alltrade.datetime.sec)
end
end
end
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
стало только хуже бо как время сервера и время из таблицы невсегда совпадает.
sam063rus, правильно я понимаю, что вас интересует количество сделок за последнюю минуту? Если так, то сбрасывайте счётчик только, когда время сделки увеличивается. Правда, и в этом случае, могут быть сбои, потому как время сделок на разных секциях может отличаться на секунды.
Надо делать так, как надо. А как не надо - делать не надо.
Следует читать так: sam063rus, правильно я понимаю, что вас интересует количество сделок за последнюю секунду? Если так, то сбрасывайте счётчик только, когда секунды в сделке увеличиваются. Если пришла сделка с сильным запаздыванием - просто проигнорируйте её.
Надо делать так, как надо. А как не надо - делать не надо.
Серж, Дмитрий - спасибо за ссылки. Почитаю. Почти решил проблему - считает но, с декрементом на единицу. Думаю, добью впоследствии. Но, в любом случае, рад новым идеям.
sam063rus пишет: Хотелось бы получить на них ответы с примерами правильного QLUA-кода.
Добрый день. В общем виде нет корректного решения задачи, которую Вы поставили. Либо надо подробнее формулировать задачу, либо принимать во внимание возможные ограничения и допущения и упрощать алгоритм. Лично я бы использовал в качестве счетчика таблицу, в которой ключами являются строки из кода класса, бумаги и времени на сделке с точностью до секунд. И при получении сделки накручивал значение в нужном поле.
Лично я бы использовал в качестве счетчика таблицу, в которой ключами являются строки из кода класса, бумаги и времени на сделке с точностью до секунд. И при получении сделки накручивал значение в нужном поле.
dofile(getScriptPath() .."\\persistence.lua")
stat={}
local fmt = string.format
function OnAllTrade(t)
local key = fmt("%s_%s_%02d%02d%02d", t.class_code, t.sec_code, t.datetime.hour, t.datetime.min, t.datetime.sec)
stat[key] = 1+(stat[key] or 0)
end
stopped = false
function OnStop(s)
stopped = true
return 10000
end
function main()
while not stopped do
sleep(100)
end
persistence.store(getScriptPath() .. "\\result.lua", stat)
end
результат примерно такой:
Скрытый текст
Код
-- Persistent Data
local multiRefObjects = {
} -- multiRefObjects
local obj1 = {
["TEST_Sec1_071921"] = 3081; -- количество сделок в секунду по бумаге
["TEST_Sec1_071922"] = 1207;
}
return obj1
По поводу вопроса о вчерашних сделках Надо проверить из какого класса они к Вам попадают. Так же надо учесть, что на ФОРТС новая торговая сессия начинается сразу после вечернего клиринга и утром она просто продолжается. Так что вчерашние сделки формально относятся к одной торговой сессии.
про вечерние сделки могу сказать следующее ( наблюдал это уже давно возможно что-то изменилось) Они приходят потому, что на следующий день у них меняется класс т е они становятся как бы новыми сделками и сервер их обязательно передает в терминал. Когда сортировал все сделки на лету тоже поначалу в этом застрял. Потом поставил фильтр и все стало ОК