Подскажите, пож-та, если кто знает, где можно раздобыть исторические тики FORTS, с миллисекундами, номерами сделок и открытым интересом, т.е. такие как в Квике. Сразу, про Финам знаю, но там не то, время урезано, ОИ нет, внебиржевых нет, спредов нет.
Нужно именно как в Квике, всего несколько дней не хватает из 2019 и 2020 года, но весь FORTS, по всем инструментам FUT и OPT. Может у кого свой архив есть, но тоже не все данные, могу поменяться.
Подскажите, пож-та, если кто знает, где можно раздобыть исторические тики FORTS, с миллисекундами, номерами сделок и открытым интересом, т.е. такие как в Квике. Сразу, про Финам знаю, но там не то, время урезано, ОИ нет, внебиржевых нет, спредов нет.
Нужно именно как в Квике, всего несколько дней не хватает из 2019 и 2020 года, но весь FORTS, по всем инструментам FUT и OPT. Может у кого свой архив есть, но тоже не все данные, могу поменяться.
Anton написал: Там никаких потоков и нет, поток для мейна любезно qlua.dll нам создает. То есть будет один поток квика, что достигается и в луа, если в мейне ничего не делать, окромя периодической проверки флага выхода. Немножко синхронизации и заполнения (да, иногда ненужных) луа-табличек погоды не делают, там счет на сотни наносекунд на круг. По одной ягодки сам квик вытаскивает из очереди своей и тут же незамедлительно колбек и дергает, если он определен, и, как тысячу раз нам говорили, никогда, НИКОГДА воробьянинов не протягивал руки он не будет ничего откладывать и пересортировывать. Что действительно очень правильно и хорошо.
Это понятно. У меня итак есть QLuaNet.dll , которая просто ловит данные и раздает их в своих потоках, и квик не тормозит и мейн там не нужен, месяцами работает не выключаясь. Хоть итак все шустро и стабильно, но просто профилирование показало, что относительно много тратится квиком на перекладывание примитивов с стек луа. Моя система по TCP тики и прочие данные передает быстрее, чем квик с луа стеком взаимодействует. А когда несколько брокеров и на каждом брокере по несколько квиков, то возникает мысль может это дело еще можно ускорить.
Latrop написал: квику эта участь похоже не грозит. В России это называется - адаптация. Что явно разрешено даже по закону, если
Всегда обожал слушать адептов "цивилизованного рынка", которые уже в во втором предложении пишут "но воровать можно, если не поймают".
Не ну зачем так? Обожать слушать это может и хорошо, но еще лучше и читать, читать законы. Кто говорит про воровать? Наше законодательство в этой части, кстати, довольно таки либеральное. Хоть в eula квика (и любой другой программы) может быть и прописан запрет на декомпиляцию, но, вы удивитесь, закон явно разрешает проводить декомпиляцию в целях изучения и реализации взаимодействия с другой программой пользователя. Поэтому на эту часть eula можно смело смотреть (и не только смотреть) в высокой колокольни. А то, что квик по своим убеждениям не делает доступной информацию по плагинам, так это также дает явное право на декомпиляцию в силу закона.
А воруете вы свое время, занимаясь каким-то, простите за сугубо личное мнение, колхозом с этими callback/main/sleep и т.п.
Latrop написал: почему вы до сих пор не раскрутили этот qlua.dll и не написали свой плагин qapi.dll
Потому что это нарушение eula? Тем более что и смысла нет. Все почему-то думают, что "у квике усе есть, это злая qlua.dll целенаправленно гадит". Ничего там радикально другого нет, без луа будут ровно те же колбеки дергаться ровно в том же порядке.
eula - это ж для цивилизованных рынков, квику эта участь похоже не грозит. В России это называется - адаптация. Что явно разрешено даже по закону, если это не продавать. Понятно, что функционал там тот же, только без проблем с потоками и преобразованиями данных. Ягоды, как говорится, всегда ж проще и вкуснее складывать сразу в рот, а не выкладывать их сначала по одной в ряд на жердочку, которая того и гляди опрокинется :)
C такими способностями, как у вас, удивляюсь, почему вы до сих пор не раскрутили этот qlua.dll и не написали свой плагин qapi.dll c api для обработки событий и получения данных, без lua-посредника...
1. Система/Заказ данных/Поток котировок... нужные параметры и инструменты на классе А где вообще хранятся все эти настройки?
2. И как их можно вручную сохранить/загрузить, ибо они регулярно и непредсказуемо сбрасываются? (функционал через меню "сохранить настройки в файл/загрузить из файла" на эти настройки не влияет)
Nikolay Pavlov написал: 1. Руками, выбрав в Система/Заказ данных/Поток котировок... нужные параметры и инструменты на классе;
А где вообще хранятся все эти настройки?
И как их можно вручную сохранить/загрузить, ибо они регулярно и непредсказуемо сбрасываются? (сохранить настройки в файл/загрузить из файла на эти настройки не влияет)
Николай Камынин написал: 2) значение n может переполниться когда-нибудь
Это комплимент Квику, что скрипт сможет отработать безостановочно тысячи лет подряд Мир будет на квантовых компьютерах с инопланетянами торговать, а в России будет... Квик
function OnAllTrade(tick)
end
mainRun = false
function OnStop(flag)
message("OnStop")
mainRun = false
return 3000;
end
function main()
mainRun = true
message("main run...")
while mainRun do
local ticksNum = getNumberOf("all_trades")
local tick = getItem("all_trades", ticksNum-1)
sleep(1)
end
message("main exit")
end
Anton написал: Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.
Имелось ввиду не "Получить заново данные по сделкам", а "Перезаказать данные" - там перезапуск всего Квика происходит. Хотя не суть. Вообще, этот сахар с сообщениями добавлен для наглядности, какой момент упадет.
В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..
Вот очень простой скрипт, который рушит Квик во время торгов. Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков. Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт. Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.
Код
local ticksIn = 0
function OnAllTrade(tick)
if (math.fmod(ticksIn, 5000)==0) then
message("OnAllTrade " .. ticksIn .. " tick: " .. tostring(tick.trade_num))
end
ticksIn = ticksIn + 1
end
mainRun = false
function OnStop(flag)
message("OnStop")
mainRun = false
return 3000;
end
function main()
mainRun = true
message("main run...")
local n = 0
while mainRun do
local ticksNum = getNumberOf("all_trades")
if (ticksNum > 0) then
local tick = getItem("all_trades", ticksNum - 1);
if (math.fmod(n, 1000) == 0) then
message("AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num))
end
end
n = n + 1
sleep(1)
end
message("main exit")
end
Anton написал: А вообще господин Иерусалимский говорит следующее ...
Господин, должно быть, имел ввиду код на lua , а не dll Хотя звучит немного пафосно, видимо он очень любит lua, и не видел скриптов, когда в циклах собираются строки через плюсик :)
Для dll можно, наверное, попробовать сделать lua-макрос, и дергать его, чтоб строки не слать.
Кстати, а как так можно заранее напихать, и чтоб lua не стыковал строки со своим реестром при работе через lua_getfield и т.п.? Такое возможно?
Запускаю первый раз скрипт, пишу ячейки в файл: 9 3 48 14 4 480 2020 22 480334 минуты - деньнедели- секунды - часы - месяц - мсек - год - число - мксек
Запускаю второй раз, этот же самый тик: 14 480 4 2020 480334 3 22 48 9
Anton написал: Это же нормальное явление для луа, полагаться на какой-то порядок полей было изначально ошибкой.
Тем не менее, обращаться по индексу - самый эффективный способ. Квик и без всяких сортировок и поиску по ключу тормозит сильно
Любопытно. Это заключение на основе чего сделано?
В lua все строки имеют абсолютный индекс. table["key"] (как и table.key) - это всегда доступ по индексу строки, никакого сравнения строк (парсинга, вычисления хэшей и т.п.) по содержимому строки в lua тут не происходит. Потому lua со строковыми ключами таблиц работает максимально шустро.
А вот конкатенация строк - это в противовес самое тормозное в lua.
Latrop написал: Critical error ACCESS_VIOLATION in script
Это теперь так ошибки обрабатываются ) Надеюсь, поправят скоро.
А по существу - должна по идее какая-то ошибка случаться, но воспроизвести не удалось, перезаказал твс, догрузилась до текущего момента и ничего не упало. Вот таким вот образом пробовал
Огромный респект за проверку! Дало повод не грешить на lua, а разобраться глубже и найти проблему. Это сборщик мусора мою функцию прибирал таким образом.
Latrop написал: Примитивная dll в OnAllTrade просто дергать напр getInfoParam("VERSION") и больше вообще ничего, никаких эксепшенов, но после коннекта и получения прим 50-100 тыс тиков валится:
Critical error ACCESS_VIOLATION in script...
Что это за беда такая может быть?...
Если в OnAllTrade вообще ничего не делать, пустышка, то не падает. Но такой способ обхода проблемы не очень подходит :)
Здравствуйте! Проблема изучается. Постараемся в ближайшее время дать ответ.
Одна "Проблема изучается" минус. По этой части можно уже не изучать :)
Примитивная dll в OnAllTrade просто дергать напр getInfoParam("VERSION") и больше вообще ничего, никаких эксепшенов, но после коннекта и получения прим 50-100 тыс тиков валится:
Critical error ACCESS_VIOLATION in script...
Что это за беда такая может быть?...
Если в OnAllTrade вообще ничего не делать, пустышка, то не падает. Но такой способ обхода проблемы не очень подходит :)
Александр М написал: увидел, что там 2 dll и версии lua 5.1 и версии 5.3 Какая основная
Можно предположить, что 5.1 оставили для какой-то там совместимости, 5.3 экспортирует все то же самое (с поправкой на версию луа). Пока не обнаружил, чтобы что-нибудь крэшнулось без 5.1 (просто убрал ее).
Что касается совместимости с 5.1 (видимо для этого там lua5.1.dll), то она несовместимая пока получается.
Например, Квик просто весь падает при попытке запустить Lua Socket (версия для lua51, x64 отлично работавшая под Quik 8.4). Копия lua5.1.dll в lua51.dll (необходимая для станд сборки Lua Socket) делалась.
Stanislav Tvorogov написал: Добрый день, Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что реализация пожелания признана потенциально целесообразной. Если по результатам дальнейшего анализа, включающего юридические аспекты, анализ на непротиворечивость с общей политикой компании, никаких возражений не возникнет, мы постараемся включить Ваше пожелание в план доработок при выпуске одной из следующих версий нашего ПО.
Ув. разработчики, есть какие новости по данной теме?
Мы рассмотрели Ваше пожелание и вынуждены отказать в его реализации. В настоящий момент мы не готовы раскрывать внутренние межкомпонентные API нашей системы.
С уважением Начальник отдела разработки ПО QUIK Данил Бабурин
Не передумали, случаем?
Уж столько лет прошло, приоритеты должны же как-то эволюционировать (в сторону открытости, хочется надеяться)...
М-да, странности. Если dll исходно на С++, то норм высвобождается, а если на C#, то нет
Код
[DllExport("luaopen_MyModule", CallingConvention = CallingConvention.Cdecl)]
public static int luaopen_MyModule(IntPtr L) {
return 0;
}
Ошибок не выдает, и даже такая пустышка не хочет выгружаться, хотя норм загружается, отладчик норм в метод заходит и выходит, lua тоже норм все отрабатывает, по OnStop корректно завершается. OnInit не используется.
Видимо DllExport что-то там не того. Тут мои компетенции как бы все.
Указанным способом модуль после использования вроде бы и выгружается (в списке package.loaded его нет), но фактически же dll-файл Квиком не освобождается. Если нужно перекомпилировать и перезапустить dll-модуль, то только через перезапуск Квика.
Может есть какой-то способ высвобождать dll (используемую в скрипте через require) без перезапуска всего терминала?
Кстати! Уважаемые разработчики Квика! У вас же всяко-разно есть уже бета (или может даже релиз-кандидат) 8.5 версии с этими доработками.
Учитывая, так сказать, текущую конъюнктуру биржевых (и не только) реалий, почему бы вам не выложить предварительную версию (на ftp), разумеется с соответствующей декларацией-предупреждением (ну как это обычно делается). Проявить, так сказать, заботу о своих дорогих пользователях, дав им больше времени на проверку и адаптацию своих систем. Заодно получить обратную связь по апробации всего этого дела.
Понятно, что вам захочется сразу в ответ дать категоричное Нет. Но, большая просьба, попытаться донести это предложение до принимающих такие решения. Нормальная же, современная практика. Глядишь, и будет позитив... :)
новичок написал: такое часто дает сигнал игнорировать вопрос. шарпеи не в почете у системщиков. ткчт аккуратнее с такими каминг-аутами в правильных сообществах. (имо)
Как начинавший еще с ASM на Z80, позволю себе снисходительно отнестись к такой дискриминации по языковому признаку :)))
Anton написал: Если бумага возвращена из getClassSecurities, она есть в листинге сегодня, разве нет?
У меня скрипт тупо синхронизирует просто всю таблицу securities, ну да, верно, по этой части можно просто брать getTradeDate квика, если бумага есть в списке getClassSecurities, спасибо.
Цитата
Anton написал: А что из них вытаскивать? ТВС? Дык вон оно все на финаме лежит даром, качать не перекачать.
В финаме же урезанные данные, ни точного времени, ни открытого интереса, ни адресных сделок, ни еще чего-то нужного, так, побаловаться только :)
Anton написал: а мешать домохозяйкам использовать покупные/заказные скрипты - идея плохая, они завалят и разработчика скрипта, и этот форум вопросами "куда все пропало".
Так таким домохозяйкам итак нужно инструкцию, как напр включить поток сделок, отключенный у брокера. Что мешает также указать что должен быть включен умный заказ тиков, либо указать какие потоки включить, либо еще как-то через апи скрипт сможет рулить. Тут же вопрос, как полно и грамотно будет реализован функционал управления потоками данных.
Цитата
Anton написал: Это единственная альтернатива счетчику ссылок у каждой галки. Либо так, либо как есть, либо переделывать весь функционал с нуля, на что арка вряд ли пойдет.
Почему единственная? Можно просто пробежать по всем метаданным открытых таблиц тиков и сложить имеющиеся фильтры. Хотя отлично понятно суть предложений, по "не уменьшению" фильтра, но блин, все затыкать одну проблему :)
Anton написал: Как насчет вывести тип бумаги из имеющихся параметров от getSecurityInfo? Наличие базового актива -> дериватив, наличие страйка -> опцион и т.д.
Тип/подтип бумаги косвенно определить не сложно, что и реализовано, хотелось упростить. На фонде и валютах там правда сложнее (типы облигации например).
Более того, наличие SECTYPESTATIC (или TRADE_DATE_CODE и т.п.) было также нужно, если честно, чтобы надежно определить, есть ли бумага в листинге текущей сессии или нет.
Цитата
Anton написал: Вот в этом я не уверен, мне неизвестно соответствующее поле в sec.dat
Кстати, любопытно, зачем приходится разбирать нутро dat-файлов квика? Какая там есть полезная инфа, которая недоступна в скриптах? И можно где-то раздобыть уже готовые парсеры этих dat-файлов, на C# напр ? А то накопились ежедневные копии квиков за кучу лет, руки не доходят слить из них все данные для истории и удалить наконец :)
Старатель написал: Ломать, тем более автоматику не нужно.
Почему ломать? Добавить возможность отключения это автоматики "для домохозяек" :) Если же, занимаясь созданием систем и алгоритмов для торговли, то очень странно судить о работе своих алгоритмов по трафику на роутере и делать оттуда какие-то выводы, возможно и ложные :)
Так и я про то. Квик очевидно заказывает всегда весь листинг. Там же в Квик приходит и тот же SECTYPESTATIC, но получить его в скрипте никак, пока не закажешь любой другой совсем ненужный биржевой параметр.
Разботчики: Можно SECTYPESTATIC в виде кода, а также прочие static параметры выдавать через метаданные бумаги (getSecurityInfo) ?
Дмитрий написал: Проблема такая - запускаю таблицу обезличенных сделок и Quik просто уничтожается, еле-еле откликается даже на отрисовку курсора мыши (на графике). Компьютер в порядке, достаточно мощный. Запускал раньше такую же таблицу (около месяца назад) и всё было хорошо. В чём может быть проблема? Может что-то не то (не ту галочку) прожал в настройках?
Andrey Bezrukov написал: Ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
Что по доработкам потока обезличенных сделок (тиков) скажете?
Современные скорости интернета и объемы памяти/дисков позволяют упростить это дело. Существуют вполне выраженные группы пользователей, кому тики нужны, и кому тики не нужны.
1. Предлагается оставить только настройки получения тиков по классам, без фильтров по инструментам. Настройки эти задаются явно в диалоге заказа данных.
Автоматических заказов тиков по открытым таблицам или графикам быть не должно по умолчанию. Этот функционал для продвинутых пользователей и автоматика тут только вредит и приводит к целом ряду непредсказуемостей и тормозам в получении потока тиков, как клиента, так и сервера.
Если нужно сохранить "умный" заказ тиков, то вынести его вкл/выкл в настройки, по умолчанию выключен.
У некоторых брокеров поток тиков часто также по умолчанию выключен на стороне сервера. А где он по умолчанию включен (напр у Сбера), вот толпа домохозяек, при малейших тормозах начинает судорожно кликать "умный" интерфейс и в итоге окончательно хоронит сервера.
2. Также хорошо бы также доработать сервер, чтобы он слал потоки только по заказанным клиентом классам, такой дополнительной гибкости будет более чем достаточно для оптимизации трафика и нагрузки.
Latrop написал: Как удалось разобраться, если заказано получение тиков хоть одного инструмента, то на клиент льется вообще весь поток всех(!) тиков. Фильтр по отдельным инструментам никакой экономии трафика не дает
Не соглашусь, при использовании фильтров трафик уменьшается.
На чем основано данное несогласие? :)
Сами же разработчики Квика предупреждают: Поток обезличенных сделок используется при отображении данных в одноименной таблице, экспорте тиков во внешние системы технического анализа и при построении в QUIK тиковых графиков. При использовании любого функционала из перечисленных - с сервера QUIK будут заказаны все сделки по всем инструментам, на получение информации по которым у терминала есть права. Заказ полного набора всех сделок происходит все зависимости от установленных в таблице обезличенных сделок фильтров или открытого тикового графика по конкретному инструменту.
Старатель написал: QUIK не умеет фильтровать заказанные параметры внутри класса и будет слать все заказанные явно или неявно параметры для одного класса.
Тоже так думаю, но вот тех.поддержка иное заявляет:
Цитата
Sergey Gorokhov написал: умеет заказывать такие "частные" параметры в разрезе инструментов
Если заказать ParamRequest(class1, sec1, par1) и ParamRequest(class1, sec2, par2)
Т.е. для разных инструментов одного и того же класса будут заказаны разные параметры. То фактически терминал что сделает? Будет неявно заказывать оба параметра для обоих инструментов, или он умеет заказывать такие "частные" параметры в разрезе инструментов? Просто такое через диалог заказа параметров настроить невозможно - понять как устроен заказ данных.
Если явно заказаны только конкретные инструменты (т.е. задан фильтр по инструментам), то каким образом можно узнать, какие есть еще активные инструменты в текущей сессии для заказа данных?
Т.е. если, напр, из большой целочисленной переменной вычесть другую переменную, которая нечаянно окажется double, то результат будет тоже double и в итоге потеря точности?