act_numTrades = 0
last_numTrades = 0
lastTime = 0
actTime = 0
is_run = true
function OnParam(class_code, sec_code)
if class_code == "SPBFUT" and sec_code == "SiM5" then
act_numTrades = getParamEx(class_code, sec_code, "NUMTRADES").param_value
actTime = getParamEx(class_code, sec_code, "TIME").param_value
if act_numTrades == last_numTrades and actTime == lastTime then do return nil end
else message(tostring(act_numTrades - last_numTrades) .. " " .. tostring(actTime)) end
last_numTrades = act_numTrades
lastTime = actTime
end
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
В общем, бывают моменты - когда он в течении продолжительного времени вполне стабильно и правильно считает, но потом - "всё портится". Такое ощущение, что это как-то связано с кешированием или докачкой данных. если бы код "был неправильным" - он бы даже частично правильно не считал.
в общем, пока приходит на ум, что одно из: "время" или "число сделок" - уже изменилось, а другое - соответственно - нет. В таком случае, как задать правильно условие (с учётом специфики OnParam)?
Я являюсь последовательным сторонником того, что скрипт должен сам решать и управлять потоком нужных ему данных, а не так как щас - непонятно в какой последовательности и в каком количестве понаставлено куча галок, да ещё и забыта половина. Это не работа.
Скорей всего изредка приходят опоздавшие обновления ТТП, в которых время или количество сделок отстали от текущих значений. Попробуйте сделать проверку - если число сделок стало меньше, чем было в предыдущий раз, и время меньше предыдущего или равно ему - то просто не учитывайте пришедшие значения.
sam063rus пишет: в общем, пока приходит на ум, что одно и з: "время" или "число сделок" - уже изменилось, а другое - соответственно - нет. В таком случае, как задать правильно условие (с учётом специфики OnParam)?
Дмитрий пишет: Скорей всего изредка приходят опоздавшие обновления ТТП, в которых время или количество сделок отстали от текущих значений. Попробуйте сделать проверку - если число сделок стало меньше, чем было в предыдущий раз, и время меньше предыдущего или равно ему - то просто не учитывайте пришедшие значения.
act_numTrades = 0
last_numTrades = 0
lastTime = 0
actTime = 0
is_run = true
function OnParam(class_code, sec_code)
if class_code == "SPBFUT" and sec_code == "SiM5" then
act_numTrades = tonumber(getParamEx(class_code, sec_code, "NUMTRADES").param_value)
actTime = tonumber(getParamEx(class_code, sec_code, "TIME").param_value)
if act_numTrades <= last_numTrades and actTime <= lastTime then do return nil end end
message(tostring(act_numTrades - last_numTrades) .. " " .. tostring(actTime))
last_numTrades = act_numTrades
lastTime = actTime
end
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
как уже писал ранее - это всего лишь "винтик". никаким "граалем" тут и не пахнет. Впоследствии, как удастся наладить стабильную реализацию с помощью коллбека - буду пытаться реализовать тоже самое без коллбеков. Что-нибудь на основе CreateDataSource etc.
sam063rus пишет: имелось ввиду, что проще было это всё смотреть и анализировать у себя в квике - на то скрипт и дан, а не через форум.
Что анализировать-то? Вы можете привести листинг со строками, где "всё портится"? Сидеть с запущенным скриптом перед терминалом и часами ждать неизвестно чего, как-то не хочется.
Надо делать так, как надо. А как не надо - делать не надо.
Что значит портится? Число сделок уменьшается? Или еще какие-то несоответствия, которые можно описать формально? Тогда выведя в эксель таблицу, которую вы поместили тут в виде картинки, легко можно найти с помощью простой формулы среди множества строк именно те, где видна такая ситуация.
в разные промежутки времени, число сделок в ТВС и число сделок в скрипте - не соответствует по времени времени (ни на инкремент по времени ни на декремент)
Это нормально, т.к. в скрипте берутся данные из ТТП, а они представляют всего лишь временные срезы информации о числе сделок и прочих параметрах, которые формируются через определенные промежутки времени. А сделки в ТВС поступают в отдельном потоке, никак не синхронизированном с потоком данных ТТП.
Дмитрий пишет: Это нормально, т.к. в скрипте берутся данные из ТТП, а они представляют всего лишь временные срезы информации о числе сделок и прочих параметрах, которые формируются через определенные промежутки времени. А сделки в ТВС поступают в отдельном потоке, никак не синхронизированном с потоком данных ТТП.
с другой стороны, тут можно не согласиться - бо как за основу взято именно серверное время
Брать информацию либо из ТТП в OnParam, либо из ТВС в OnAllTrade И не пытаться сопоставлять данные из этих двух источников, тем более на лету. А если и сопоставлять, то сравнивать их с учетом какой-то заранее заданной допустимой погрешности.
чувствуется. что из всего форума к данной теме, интерес ограничивается только тремя людьми, - что печально. Хотя, анализ таких тонкостей позволил бы на порядок повысить понимание QLUA.
sam063rus пишет: с другой стороны, тут можно не согласиться - бо как за основу взято именно серверное время
Данные для ТВС и для ТТП с одним и тем же серверным временем могут фактически прийти в терминал в разное время (думаю, рассогласование в секунду, а то и больше, тут не будет редкостью). Можно пытаться сопоставлять эти данные уже потом, анализируя историю из ТВС и Таблицы изменений параметров, но все равно синхронизировать их будет весьма проблематично, т.к. время записей в Таблице изменений параметров приводится лишь с точностью до целой секунды. С учетом этого, стоило бы наверное выразить пожелание, чтобы разработчики добавили ко времени записей в Таблице изменений параметров еще и милли- или даже микросекунды.
Другими словами, между этими величинами не обязательно будеn разница ровно в 1 сек. И не обязательно они будут принадлежать к началу этих секунд, как вы делаете в OnAllTrade
Надо делать так, как надо. А как не надо - делать не надо.
Старатель пишет: sam063rus , как я помню, в OnAllTrade вы считаете количество сделок за 1 секунду. Здесь же вы считаете разницу между двумя неизвестными величинами
Код
act_numTrades - last_numTrades
где единственным условием является то, что, возможно, эти величины относятся к "временным срезам" на разных секундах.
просто именно благодаря данной особенности ТТП - я нашёл решение, как попытаться уйти от тех проблем, которые у меня были с OnAllTrade (в ТТП - уже есть счётчик сделок - оставалось только воспользоваться предоставленной возможностью его опроса через фиксированный интервал)
Старатель пишет: Другими словами, между этими величинами не обязательно будеn разница ровно в 1 сек. И не обязательно они будут принадлежать к началу этих секунд, как вы делаете в OnAllTrade
будет ровно одна секунда - т.к. в рамках одного тикера - последовательность сохраняется (что ранее было уже проверено в другой теме)
скажу по другому, думаю, у меня бы вообще не возникло проблем, используй я и дальше OnAllTrade, если бы сделки на фортс были с микросекундной точностью
код увидел. Мне читать все топики лень, поэтому я выскажусь, возможно что кто-то уже это сказал. 1) Работа через onParam - самый плохой вариант. Там и хранилище очень тяжелое и данный колбек на каждый чих срабатывает при этом если срез не пришел и не актуальный то он вообще потеряется. Т е через этот колбек Вы обязательно недосчитаетесь сделок когда-нибудь --------------------------------- 2) Поэтому данную задачу полагаю надо решать через onAllTrade По крайней мере решение через onAllTrade будет полным, но возможно что есть и более быстрое но не полное. Поэтому решение через onAllTrade должно быть базовым а остальные, если они будут быстрее надо сравнивать с базовым.
-------------------------------- Поэтому предлагаю написать вариант через onAllTrade и изложить претензии к такому решению (желательно с примерами)