про тики

Страницы: 1
RSS
про тики
 
Добрый день,
Как известно, обращаться к тикам можно двояко.
Во-первых , в колбеке onAllTrade
Во-вторых,  в колбеке CreateDataSource
-----------------
вопросы к знатокам:
1) В чем отличие обработки этих колбеков.
2) Какой колбек вызывается раньше.
3) как во втором случае получить всю информацию первого.
Спасибо
 
Все необходимые тики собираю через onAllTrade, пока не требовалось использовать 2-й вариант, но, если рассуждая логически,
то 2-й вариант должен быть быстрее, потомучто на экране, как минимум, нет окна всех сделок, т. е. нет доп. вывода в окно текстовой информации.
Надо измерить время.
 
Цитата
Фёдор Сухов написал:
Все необходимые тики собираю через onAllTrade, пока не требовалось использовать 2-й вариант, но, если рассуждая логически,
то 2-й вариант должен быть быстрее, потомучто на экране, как минимум, нет окна всех сделок, т. е. нет доп. вывода в окно текстовой информации.
Надо измерить время.
Как выяснилось ранее, для onAllTrade не надо открывать ТВС на экране (по крайней мере так утверждают разработчики для версии 7)
Хотелось бы услышать начальника транспортного цеха.
 
Цитата
Николай Камынин написал:
1) В чем отличие обработки этих колбеков.

OnAllTrade - в первую очередь колбек таблицы
а SetUpdateCallback создает колбек на график.
Это значит что во втором случае Вы можете получить только ту информацию которая есть на графиках (в данном случае речь тиковом графике).

Цитата
Николай Камынин написал:
2) Какой колбек вызывается раньше.

Очередность нигде не прописана.

Цитата
Николай Камынин написал:
3) как во втором случае получить всю информацию первого.

Вы можете обратиться к любому элементу data_source по номеру.
 
Цитата
Николай Камынин написал:
Во-вторых,  в колбеке CreateDataSource
могу ошибаться, конечно (не работаю с CreateDataSource ввиду его "сырости") - под него, если не изменяет память (читал где-то) - заводится отдельный поток ОС. Поэтому - сравнивать его с OnAllTrade - было бы неверно.
 
Цитата
тот самый написал:
Цитата
Николай  Камынин   написал:
Во-вторых,  в колбеке CreateDataSource
могу ошибаться, конечно (не работаю с CreateDataSource ввиду его "сырости") - под него, если не изменяет память (читал где-то) - заводится отдельный поток ОС. Поэтому - сравнивать его с OnAllTrade - было бы неверно.
Поясните Вашу мысль.
почему не верно.
Оба механизма создаются для получения информации о сделках.
Полагаю, что так как получается однотипная информация то сравнивать вполне возможно.
------------------------------
По аналогии, можно сравнивать лапшу и кашу. Но нельзя сравнивать кислое и синее.
В данном случае - это лапша и каша.
 
Цитата
Sergey Gorokhov написал:
Цитата
Николай  Камынин   написал:
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) Таким образом, будут ли эти функции вызываться в разных потоках или в одном не имеет значение. Вопрос лишь в том в какой последовательности они вызываются.
Примерно так.
 
Цитата
Николай Камынин написал:
Таким образом, будут ли эти функции вызываться в разных потоках или в одном не имеет значение. Вопрос лишь в том в какой последовательности они вызываются.
вот только всё дело в том, что потоки могут выбыть приостановлены и вызваны в любой момент на усмотрение планировщика. Всё зависит от их текущих приоритетов. И даже, если он у них - одинаковый - то, вовсе не значит, что первым - выдаст колбек именно тот поток, который, как Вам кажется должен.
 
вот здесь, вроде толково написано. так.. на досуге...
www.dtf.ru/articles/read.php?id=39888&page=2
 
Цитата
тот самый написал:
вот здесь, вроде толково написано. так.. на досуге...
www.dtf.ru/articles/read.php?id=39888&page=2
про потоки я знаю все или почти все.
----------------------------
Но дело в том, что  в QUIK все колбеки On... вызываются в  одном потоке друг за другом.  
Сомневаюсь, что для колбека  cratedatasource  нагородили что-то особенное.
--------------------------------------------------
Но хотелось бы по данному вопросу послушать начальника транспортного цеха.
 
Цитата
тот самый написал:
вот здесь, вроде толково написано. так.. на досуге...
www.dtf.ru/articles/read.php?id=39888&page=2
очень слабая статья.
В ней пытаются ускорить выполнение задачи с использованием потоков на одноядерном железе.
как я уже заметил раньше поток - это вычислитель т е процессор или ядро как модно называть.
многопоточность на одном ядре - это виртульное создание вычислителей на которых запускаются исполняемые фрагменты кода по очереди.
Для интересующего меня вопроса не имеет значение есть потоки или нет.
Информация о тиках одна и та же для обоих колбеков.
Вопрос ,в том она отправляется с сервера один раз или два  и кому раньше.
Но так как начальник транспортного цеха молчит, пусть эти вопросы останутся открытыми.
 
Цитата
Николай Камынин написал:
Информация о тиках одна и та же для обоих колбеков.
как-то уже упоминалось, что получение данных с помощью createdatasource - идёт отдельным запросом на сервер. Возможно это было сделано для того, чтоб разгрузить и разделить очереди сообщений с сервера. А если так - то, опять же, получается, - что раньше сработает onaalltrade или createdatasource- , будет зависеть от ещё более многих факторов:
от того - насколько занята очередь основных данных для основных коллбеков
и от того - как быстро обработает запрос на получение инфы по createdatasource - сервер.




____________

я думаю, нет смысла обсуждать этот вопрос - "ЧТО быстрее". Нам остаётся лишь оптимизировать свои алгоритмы таким образом, - чтоб минимизировать возможныенегативные последствия - т.е. убрать фактор очерёдности.
вообще же, - как уже говорил - нет смысла писать и пользоваться стандартными коллбеками на QLUA - это слишком низкоуровневые операции.
Есть смысл абстрагироваться от всего этого - но, для этого, придётся писать свой торговый движок (или как сейчас модно говорить - Framework) - и... уже потом, и на него и под него - писать плагины/скрипты на LUA.
Как-раз именно этим - и занимаюсь.
 
Цитата
Николай Камынин написал:
про потоки я знаю все или почти все.
:shock: :what: :lol: :lol: :lol:     остаётся, лишь только добавить...:
"если ты такой умный - то, почему такой бедный?"

или ещё:

"должны ж быть у талантов - меха и бруллианты!?..." :lol:
 
Добрый день.
По поводу функций 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
 
Довольно обстоятельный ответ, спасибо.
И, как водится, не от сотрудника техподдержки  :unamused:
Могу добавить, что то, какой колбэк выбрать, зависит от конкретной задачи. ds_Callback можно назначить на конкретную бумагу, но в нём отсутствуют большинство параметров обезличенных сделок. В OnAllTrade() же отсутствует параметр count – количество тиковых интервалов в секунду.

Цитата
Николай Камынин написал:
2) Какой колбек вызывается раньше.
Хоть OnAllTrade() срабатывает первым, но оба колбэка приходят в одну миллисекунду. Поэтому можно говорить об одновременном их срабатывании. Полагаю, что данные для этих колбэков используются одни и те же. Просто терминал на месте их уже разделяет на два "потока".
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
В OnAllTrade() же отсутствует параметр count – количество тиковых интервалов в секунду.
В OnAllTrade() параметр count и не нужен, т.к. на структуре обезличенной сделки транслируется время до микросекунд (datetime.mcs), там и так видно какая обезличенная сделка пришла первой если в конкретную секунду их было несколько. А на структуре времени свечки которую возвращает DataSource:T(indx) время транслируется до миллисекунд, там тоже можно увидеть какая из обезличенных сделок пришла первой в конкретную секунду. А параметр параметр count для обезличенных сделок не используется, т.к. он предназначен для источника данных по параметру таблицы текущих торгов, т.к. параметры данной таблицы транслируются с точностью до секунд, и там как раз и помогает count разобраться какое изменение свечки было раньше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Если нужно сопоставить сделку из ТВС с тиком на графике (например, для индикатора), то параметр count был бы как раз кстати.
Надо делать так, как надо. А как не надо - делать не надо.
 
Добрый день.
Это сделать невозможно.
 
Цитата
Старатель написал:
Если нужно сопоставить сделку из ТВС с тиком на графике (например, для индикатора), то параметр count был бы как раз кстати.
Можно ведь сопоставить по AllTrade.datetime.ms и DataSource:T(indx).ms, не думаю что какая-то торговая система регистрирует две обезличенные сделки в одну микросекунду.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Однозначно сопоставить можно только по номеру сделки, все остальное это примерные оценки.
 
Цитата
Michael Bulychev написал:
Однозначно сопоставить можно только по номеру сделки, все остальное это примерные оценки.
Для OnAllTrade и тикового CreateDataSource данные берутся из одного источника или из разных?
Надо делать так, как надо. А как не надо - делать не надо.
 
Если тиковый источник данных построен не по параметру торгов, то для него используются обезличенные сделки (все сделки).
Какую задачу Вы решаете пытаясь сопоставить конкретную сделку тику в источнике данных?
 
Цитата
Michael Bulychev написал:
Если тиковый источник данных построен не по параметру торгов, то для него используются обезличенные сделки (все сделки).
Т.о., ТВС с тиками на графике можно сопоставить однозначно?

Цитата
Michael Bulychev написал:
Какую задачу Вы решаете пытаясь сопоставить конкретную сделку тику в источнике данных?
Например, такую: https://forum.quik.ru/messages/forum8/message11902/topic1318/#message11902
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Nikolay Pavlov написал:
Добрый день.
По поводу функций OnAllTrade() и колбека заданного DataSource методом SetUpdateCallback() могу сказать следующее:
1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок. Сделать это можно вручную, проставив галочки на необходимых классах и отфильтровав инструменты, если это необходимо...
Добрый день, Николай!
Вы про какую сейчас версию Квика пишете?
В 6-й версии при закрытии таблицы OnAllTrade() у меня всё останавливалось, хотя я всё делал как Вы пишете со всеми птичками-галочками,
и всё оживало как только я вновь открывал "Таблицу всех сделок"

И вообще, кто-то есть весьма довольный на форуме 7-й версией, как пользователь-эксплуататор роботов?
 
Цитата
Фёдор Сухов написал:
Вы про какую сейчас версию Квика пишете?
Добрый день.
Речь шла о 7 версии терминала и выше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
тот самый написал:
Цитата
Николай  Камынин   написал:
про потоки я знаю все или почти все.
   :lol:      остаётся, лишь только добавить...:
"если ты такой умный - то, почему такой бедный?"

или ещё:

"должны ж быть у талантов - меха и бруллианты!?..."
можно добавить еще
"Если ты такой богатый, то почему такой глупый?"
----------------------
Но если ты богатый и умный, то будь скромным.
-----------------------
Вот я и  скромный.
 
Благодарю Всех за ответы.
вопрос исчерпан.
 
Цитата
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.
Цитата
Старатель написал:
Довольно обстоятельный ответ, спасибо.
И, как водится, не от сотрудника техподдержки :unamused:  
:lol: - так и есть. Похоже это один из разработчиков.... :wink: уж больно он эрудирован для просто клиент/техсуппорта... :smile:
 
Цитата
Nikolay Pavlov написал:
Цитата
Фёдор Сухов   написал:
Вы про какую сейчас версию Квика пишете?
Добрый день.
Речь шла о 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 ничего не появляется. При этом в настройках "Получение данных" выбрано "С учётом настроек лалала". В "Система/Заказ данных" для котировок и сделок выбраны все инструменты.

Но стоит открыть ТВС хоть для одного инструмента - в файле начинают появляться записи.
 
Цитата
тот самый написал:
ЦитатаСтаратель написал:
Довольно обстоятельный ответ, спасибо.
И, как водится, не от сотрудника техподдержки      - так и есть. Похоже это один из разработчиков....  уж больно он эрудирован для просто клиент/техсуппорта...
Под псевдонимом работает )
 
Ответам разработчика я априори доверяю больше чем пользователю со стороны. Но, подобные замечания как слону дробина. https://forum.quik.ru/forum18/topic1968/
 
Мда, кто-то раз окном ошибся и потребовалось "доигрывать" плохую карту )
 
Цитата
Максим написал:
Но стоит открыть ТВС хоть для одного инструмента - в файле начинают появляться записи.

Здравствуйте,
Чтобы в 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 с тиковым интервалом.
Подскажите, пожалуйста, что я делаю не так?

Инициировал quik_price_tick = CreateDataSource(param.classcode, param.code_bumagi, INTERVAL_TICK)

Описана функция

function onAllTrade (alltrade) --Функция вызывается терминалом QUIK при получении обезличенной сделки.
print_perem("alltrade.price",alltrade.price)
end

В настройках Заказ данных все включено.

Даже таблица обезличенных сделок по этому инструменту открыта и в нее данные поступают.
Но почему-то onAllTrade все равно не срабатывает.  
 
Цитата
Sergey Denegin написал:
onAllTrade

Lua это регистрозависимый язык.
Согласно документации, функция должна называться OnAllTrade
 
Цитата
Sergey Gorokhov написал:
Lua это регистрозависимый язык.
Согласно документации, функция должна называться OnAllTrade
Блин, вот я чудик ((((((
Спасибо большое!  
 
Все заработало!  
 
Ну и к слову, работает, даже если CreateDataSource(param.classcode, param.code_bumagi, INTERVAL_TICK)  не делать.
Но у меня таблица обезличенных сделок открыта.  
 
Цитата
Nikolay Pavlov написал:
Цитата
Старатель написал:
Если нужно сопоставить сделку из ТВС с тиком на графике (например, для индикатора), то параметр count был бы как раз кстати.
...не думаю что какая-то торговая система регистрирует две обезличенные сделки в одну микросекунду.

А это что ?

Страницы: 1
Читают тему
Наверх