Добрый день, Как известно, обращаться к тикам можно двояко. Во-первых , в колбеке onAllTrade Во-вторых, в колбеке CreateDataSource ----------------- вопросы к знатокам: 1) В чем отличие обработки этих колбеков. 2) Какой колбек вызывается раньше. 3) как во втором случае получить всю информацию первого. Спасибо
Все необходимые тики собираю через onAllTrade, пока не требовалось использовать 2-й вариант, но, если рассуждая логически, то 2-й вариант должен быть быстрее, потомучто на экране, как минимум, нет окна всех сделок, т. е. нет доп. вывода в окно текстовой информации. Надо измерить время.
Фёдор Сухов написал: Все необходимые тики собираю через onAllTrade, пока не требовалось использовать 2-й вариант, но, если рассуждая логически, то 2-й вариант должен быть быстрее, потомучто на экране, как минимум, нет окна всех сделок, т. е. нет доп. вывода в окно текстовой информации. Надо измерить время.
Как выяснилось ранее, для onAllTrade не надо открывать ТВС на экране (по крайней мере так утверждают разработчики для версии 7) Хотелось бы услышать начальника транспортного цеха.
Николай Камынин написал: 1) В чем отличие обработки этих колбеков.
OnAllTrade - в первую очередь колбек таблицы а SetUpdateCallback создает колбек на график. Это значит что во втором случае Вы можете получить только ту информацию которая есть на графиках (в данном случае речь тиковом графике).
Николай Камынин написал: Во-вторых, в колбеке CreateDataSource
могу ошибаться, конечно (не работаю с CreateDataSource ввиду его "сырости") - под него, если не изменяет память (читал где-то) - заводится отдельный поток ОС. Поэтому - сравнивать его с OnAllTrade - было бы неверно.
Николай Камынин написал: Во-вторых, в колбеке CreateDataSource
могу ошибаться, конечно (не работаю с CreateDataSource ввиду его "сырости") - под него, если не изменяет память (читал где-то) - заводится отдельный поток ОС. Поэтому - сравнивать его с OnAllTrade - было бы неверно.
Поясните Вашу мысль. почему не верно. Оба механизма создаются для получения информации о сделках. Полагаю, что так как получается однотипная информация то сравнивать вполне возможно. ------------------------------ По аналогии, можно сравнивать лапшу и кашу. Но нельзя сравнивать кислое и синее. В данном случае - это лапша и каша.
Николай Камынин написал: 1) В чем отличие обработки этих колбеков.
OnAllTrade - в первую очередь колбек таблицы а SetUpdateCallback создает колбек на график. Это значит что во втором случае Вы можете получить только ту информацию которая есть на графиках (в данном случае речь тиковом графике).
Цитата
Николай Камынин написал: 2) Какой колбек вызывается раньше.
Очередность нигде не прописана.
Цитата
Николай Камынин написал: 3) как во втором случае получить всю информацию первого.
Вы можете обратиться к любому элементу data_source по номеру.
Поясните плиз тогда следующее. Ранее на мой вопрос было сообщение что для работы onAllTrade не требуется открывать ТВС а можно лишь подписаться на источник тиков data_source. Верно? но тогда не понятно, каким образом onAllTrade работает без ТВС если оно для ТВС. А колбек data_source для графиков если график из тиков не рисуем. Спасибо
поясняю: возможно... есть 2 потока: главный поток квика и обработка коллбека OnAllTrade и.. возможно, ещё один поток cratedatasource
таким образом, вы никогда не узнаете и не сможете гарантировать, какой из них быстрее сработает и обработает долгожданный коллбек. Бо как помимо потоков - есть ещё и системный планировщик, а также целас система (ОС), которая всё переиграет так - как ей это будет нужно - в данный момент
поясняю: возможно... есть 2 потока: главный поток квика и обработка коллбека OnAllTrade и.. возможно, ещё один поток cratedatasource
таким образом, вы никогда не узнаете и не сможете гарантировать, какой из них быстрее сработает и обработает долгожданный коллбек. Бо как помимо потоков - есть ещё и системный планировщик, а также целас система (ОС), которая всё переиграет так - как ей это будет нужно - в данный момент
Попробую объяснить свое понимание. 1) Поток - это в общем случае просто вычислитель. Какой вычислитель из имеющихся в системе будет задействован не имеет значение. 2) есть две функции OnAllTrade и колбек cratedatasource. Каждая из них вызывается по приходу запрошенной с сервера информации. Если для работы OnAllTrade достаточно сделать cratedatasource, то это означает, что обе функции из п 2 работают с одной и той же информацией. Если это не так, то для работы OnAllTrade требовалось бы еще какие-то настройки. 3) Таким образом, будут ли эти функции вызываться в разных потоках или в одном не имеет значение. Вопрос лишь в том в какой последовательности они вызываются. Примерно так.
Николай Камынин написал: Таким образом, будут ли эти функции вызываться в разных потоках или в одном не имеет значение. Вопрос лишь в том в какой последовательности они вызываются.
вот только всё дело в том, что потоки могут выбыть приостановлены и вызваны в любой момент на усмотрение планировщика. Всё зависит от их текущих приоритетов. И даже, если он у них - одинаковый - то, вовсе не значит, что первым - выдаст колбек именно тот поток, который, как Вам кажется должен.
про потоки я знаю все или почти все. ---------------------------- Но дело в том, что в QUIK все колбеки On... вызываются в одном потоке друг за другом. Сомневаюсь, что для колбека cratedatasource нагородили что-то особенное. -------------------------------------------------- Но хотелось бы по данному вопросу послушать начальника транспортного цеха.
очень слабая статья. В ней пытаются ускорить выполнение задачи с использованием потоков на одноядерном железе. как я уже заметил раньше поток - это вычислитель т е процессор или ядро как модно называть. многопоточность на одном ядре - это виртульное создание вычислителей на которых запускаются исполняемые фрагменты кода по очереди. Для интересующего меня вопроса не имеет значение есть потоки или нет. Информация о тиках одна и та же для обоих колбеков. Вопрос ,в том она отправляется с сервера один раз или два и кому раньше. Но так как начальник транспортного цеха молчит, пусть эти вопросы останутся открытыми.
Николай Камынин написал: Информация о тиках одна и та же для обоих колбеков.
как-то уже упоминалось, что получение данных с помощью createdatasource - идёт отдельным запросом на сервер. Возможно это было сделано для того, чтоб разгрузить и разделить очереди сообщений с сервера. А если так - то, опять же, получается, - что раньше сработает onaalltrade или createdatasource- , будет зависеть от ещё более многих факторов: от того - насколько занята очередь основных данных для основных коллбеков и от того - как быстро обработает запрос на получение инфы по createdatasource - сервер.
____________
я думаю, нет смысла обсуждать этот вопрос - "ЧТО быстрее". Нам остаётся лишь оптимизировать свои алгоритмы таким образом, - чтоб минимизировать возможныенегативные последствия - т.е. убрать фактор очерёдности. вообще же, - как уже говорил - нет смысла писать и пользоваться стандартными коллбеками на QLUA - это слишком низкоуровневые операции. Есть смысл абстрагироваться от всего этого - но, для этого, придётся писать свой торговый движок (или как сейчас модно говорить - Framework) - и... уже потом, и на него и под него - писать плагины/скрипты на LUA. Как-раз именно этим - и занимаюсь.
Добрый день. По поводу функций OnAllTrade() и колбека заданного DataSource методом SetUpdateCallback() могу сказать следующее: 1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок. Сделать это можно вручную, проставив галочки на необходимых классах и отфильтровав инструменты, если это необходимо, или же непосредственно из скрипта Lua создав ТИКОВЫЙ источник данных для обезличенных сделок функцией CreateDataSource() и заказать их трансляцию выполнив метод SetEmptyCallback() для созданного источника данных. 2) Если создавать источник данных функцией CreateDataSource() НЕ по тиковому интервалу, а например по минутному, заказ обезличенных сделок не выполняется, т.к. с сервера QUIK заказываются непосредственно свечки; 3) Если создавать источник данных для обезличенных сделок функцией CreateDataSource() по тиковому интервалу и при этом задать для него конкретный колбек методом SetUpdateCallback(), например SetUpdateCallback(ds_Callback), то будут срабатывать и OnAllTrade() и ds_Callback() при этом очередность не регламентируется, но из собственного исследования, могу сказать, что OnAllTrade() срабатывает первым, ds_Callback() как и OnAllTrade() обрабатывается в основном потоке терминала QUIK.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Довольно обстоятельный ответ, спасибо. И, как водится, не от сотрудника техподдержки Могу добавить, что то, какой колбэк выбрать, зависит от конкретной задачи. ds_Callback можно назначить на конкретную бумагу, но в нём отсутствуют большинство параметров обезличенных сделок. В OnAllTrade() же отсутствует параметр count – количество тиковых интервалов в секунду.
Хоть OnAllTrade() срабатывает первым, но оба колбэка приходят в одну миллисекунду. Поэтому можно говорить об одновременном их срабатывании. Полагаю, что данные для этих колбэков используются одни и те же. Просто терминал на месте их уже разделяет на два "потока".
Надо делать так, как надо. А как не надо - делать не надо.
Старатель написал: В OnAllTrade() же отсутствует параметр count – количество тиковых интервалов в секунду.
В OnAllTrade() параметр count и не нужен, т.к. на структуре обезличенной сделки транслируется время до микросекунд (datetime.mcs), там и так видно какая обезличенная сделка пришла первой если в конкретную секунду их было несколько. А на структуре времени свечки которую возвращает DataSource:T(indx) время транслируется до миллисекунд, там тоже можно увидеть какая из обезличенных сделок пришла первой в конкретную секунду. А параметр параметр count для обезличенных сделок не используется, т.к. он предназначен для источника данных по параметру таблицы текущих торгов, т.к. параметры данной таблицы транслируются с точностью до секунд, и там как раз и помогает count разобраться какое изменение свечки было раньше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Старатель написал: Если нужно сопоставить сделку из ТВС с тиком на графике (например, для индикатора), то параметр count был бы как раз кстати.
Можно ведь сопоставить по AllTrade.datetime.ms и DataSource:T(indx).ms, не думаю что какая-то торговая система регистрирует две обезличенные сделки в одну микросекунду.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Если тиковый источник данных построен не по параметру торгов, то для него используются обезличенные сделки (все сделки). Какую задачу Вы решаете пытаясь сопоставить конкретную сделку тику в источнике данных?
Nikolay Pavlov написал: Добрый день. По поводу функций OnAllTrade() и колбека заданного DataSource методом SetUpdateCallback() могу сказать следующее: 1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок. Сделать это можно вручную, проставив галочки на необходимых классах и отфильтровав инструменты, если это необходимо...
Добрый день, Николай! Вы про какую сейчас версию Квика пишете? В 6-й версии при закрытии таблицы OnAllTrade() у меня всё останавливалось, хотя я всё делал как Вы пишете со всеми птичками-галочками, и всё оживало как только я вновь открывал "Таблицу всех сделок"
И вообще, кто-то есть весьма довольный на форуме 7-й версией, как пользователь-эксплуататор роботов?
Фёдор Сухов написал: Вы про какую сейчас версию Квика пишете?
Добрый день. Речь шла о 7 версии терминала и выше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Николай Камынин написал: про потоки я знаю все или почти все.
остаётся, лишь только добавить...: "если ты такой умный - то, почему такой бедный?"
или ещё:
"должны ж быть у талантов - меха и бруллианты!?..."
можно добавить еще "Если ты такой богатый, то почему такой глупый?" ---------------------- Но если ты богатый и умный, то будь скромным. ----------------------- Вот я и скромный.
Nikolay Pavlov написал: Добрый день. По поводу функций OnAllTrade() и колбека заданного DataSource методом SetUpdateCallback() могу сказать следующее: 1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок. Сделать это можно вручную, проставив галочки на необходимых классах и отфильтровав инструменты, если это необходимо, или же непосредственно из скрипта Lua создав ТИКОВЫЙ источник данных для обезличенных сделок функцией CreateDataSource() и заказать их трансляцию выполнив метод SetEmptyCallback() для созданного источника данных. 2) Если создавать источник данных функцией CreateDataSource() НЕ по тиковому интервалу, а например по минутному, заказ обезличенных сделок не выполняется, т.к. с сервера QUIK заказываются непосредственно свечки; 3) Если создавать источник данных для обезличенных сделок функцией CreateDataSource() по тиковому интервалу и при этом задать для него конкретный колбек методом SetUpdateCallback(), например SetUpdateCallback(ds_Callback), то будут срабатывать и OnAllTrade() и ds_Callback() при этом очередность не регламентируется, но из собственного исследования, могу сказать, что OnAllTrade() срабатывает первым, ds_Callback() как и OnAllTrade() обрабатывается в основном потоке терминала QUIK.
Цитата
Старатель написал: Довольно обстоятельный ответ, спасибо. И, как водится, не от сотрудника техподдержки
- так и есть. Похоже это один из разработчиков.... уж больно он эрудирован для просто клиент/техсуппорта...
Фёдор Сухов написал: Вы про какую сейчас версию Квика пишете?
Добрый день. Речь шла о 7 версии терминала и выше.
Попробовал 7.4.0.79, правда на демо, может на реальном счёте иначе будет. Вот скрипт
Код
local stopped = false
local f = io.open(getScriptPath() .. "\\alltrades.log", "w")
function OnAllTrade(trade)
f:write(trade.trade_num .. "\n")
end
function OnStop(signal)
stopped = true
end
function main()
while not stopped do
sleep(100)
end
end
если все остальные скрипты остановлены и ТВС закрыта - в файле alltrades.log ничего не появляется. При этом в настройках "Получение данных" выбрано "С учётом настроек лалала". В "Система/Заказ данных" для котировок и сделок выбраны все инструменты.
Но стоит открыть ТВС хоть для одного инструмента - в файле начинают появляться записи.
тот самый написал: ЦитатаСтаратель написал: Довольно обстоятельный ответ, спасибо. И, как водится, не от сотрудника техподдержки - так и есть. Похоже это один из разработчиков.... уж больно он эрудирован для просто клиент/техсуппорта...
Максим написал: Но стоит открыть ТВС хоть для одного инструмента - в файле начинают появляться записи.
Здравствуйте, Чтобы в OnAllTrade что-то поехало, нужно инициировать заказ таблицы обезличенных сделок. Это делается либо путем открытия таблицы в терминале, либо через CreateDataSource с тиковым интервалом.
Sergey Gorokhov написал: Это делается либо путем открытия таблицы в терминале
Цитата
Nikolay Pavlov написал: 1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок.
Sergey Gorokhov написал: Это делается либо путем открытия таблицы в терминале
Цитата
Nikolay Pavlov написал: 1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок.
Добрый день. Да, действительно, первоначально был не учтен момент, что при ручном выставлении фильтров для обезличенных сделок в меню "Система/Заказ данных/Поток обезличенных сделок" инициацией заказа данных будет именно открытие таблицы обезличенных сделок.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Sergey Gorokhov написал: Чтобы в OnAllTrade что-то поехало, нужно инициировать заказ таблицы обезличенных сделок. Это делается либо путем открытия таблицы в терминале, либо через CreateDataSource с тиковым интервалом.
function onAllTrade (alltrade) --Функция вызывается терминалом QUIK при получении обезличенной сделки. print_perem("alltrade.price",alltrade.price) end
В настройках Заказ данных все включено.
Даже таблица обезличенных сделок по этому инструменту открыта и в нее данные поступают. Но почему-то onAllTrade все равно не срабатывает.
Ну и к слову, работает, даже если CreateDataSource(param.classcode, param.code_bumagi, INTERVAL_TICK) не делать. Но у меня таблица обезличенных сделок открыта.