OnQuote вешает квик

Страницы: 1
RSS
OnQuote вешает квик
 
Здравствуйте. Последние дни на рынке паника. Активность резко возросла. Я в КВИКе подписываюсь на стаканы 5 фьючерсов и 50 акций. Обрабатываю их в OnQuote. В июне-июле не было никаких проблем из за вялого рынка. Но в среду-четверг-пятницу пошла жесть. КВИК подвисает намертво. Пришлось отказаться от акций, оставил два фьючерса Si и RTS, но даже их пришлось разнести по разным КВИКам. Два фьючерса в одном скрипте в одном КВИке всё равно вешали КВИК. Сейчас на 1 квик у меня по 1 скрипту, в котором 1 инструмент. Благодаря этому удалось вернуться к работе.
---
Прошу дать совет, как решить эту проблему.
1. Я уже перенёс из OnQuote много функций, которые теперь обрабатываются в main, но там по прежнему остаётся обработка таблиц, несколько циклов и немного математики. Время, за которое проходит одна итерация внутри OnQuote около 20 миллисекунд.
2. На виртуалке поставил более быстрые ядра. Сейчас конфигурация такая:

Обидно, что даже в моменты пиковой нагрузки загрузка процессора даже близко не подходила к 100%, то есть были свободные ядра. При этом более быстрые ядра не решили проблему, квик всё равно подвисал.
3. Работает сборщик мусора луа, проблем с памятью не наблюдалось.
---
Можно ли OnQuote направлять на разные ядра процессора? например с помощью модуля многопоточности луа LuaLanes?
---
Можно ли запустить в одном скипте несколько OnQuote? В один принимать фьючерсы, в другой акции например?
---
Буду благодарен за любые советы и подсказки.
 
Добрый день.

Не нужно внутри колбека делать       вычисления, потому как это тормозит основной поток терминала. Нужно       выставить сигнал о том, что данные изменились (возможно отложить их       куда-то) и покинуть колбэк, а в майне уже делать нужные дела.
 
Цитата
Alexey Ivannikov написал:
Добрый день.

Не нужно внутри колбека делать       вычисления, потому как это тормозит основной поток терминала. Нужно       выставить сигнал о том, что данные изменились (возможно отложить их       куда-то) и покинуть колбэк, а в майне уже делать нужные дела.
Я постепенно делаю это, но всё равно кое-что придётся оставить в колбеке. Я же не могу крутить main в диком безостановочном цикле, который постоянно будет ловить новые изменения. Если сделать по вашему, то main при 50 инструментах не сразу обработает изменение. У меня внутри main стоит sleep(1). При 50 инструментах это довольно долгая задержка.
Поэтому интересны советы как раз по многопоточности и по разумному использованию ядер. Если надо, я куплю 10 ядер, лишь бы всё работало.
 
Цитата
Let_it_go написал:
Цитата
Alexey Ivannikov   написал:
Добрый день.

Не нужно внутри колбека делать       вычисления, потому как это тормозит основной поток терминала. Нужно       выставить сигнал о том, что данные изменились (возможно отложить их       куда-то) и покинуть колбэк, а в майне уже делать нужные дела.
Я постепенно делаю это, но всё равно кое-что придётся оставить в колбеке. Я же не могу крутить main в диком безостановочном цикле, который постоянно будет ловить новые изменения. Если сделать по вашему, то main при 50 инструментах не сразу обработает изменение. У меня внутри main стоит sleep(1). При 50 инструментах это довольно долгая задержка.
Поэтому интересны советы как раз по многопоточности и по разумному использованию ядер. Если надо, я куплю 10 ядер, лишь бы всё работало.
1. При sleep(1) на стандартных настройках Windows это выливается в 10-16  мс, т.е. для 50 инструментов, 800 мс уходит на sleep. Нужно  модифицировать скрипт чтобы использовать это время с большей пользой.

2. Все колбеки исполняются в основном потоке терминала. И если там  возникает задержка (например ожидание транзакции), то весь терминал  "висит". Изменить этого Вы не можете, это архитектурное ограничение.

3. Задействовать больше ядер можно с использованием внешней библиотеки на  с++. Но и в этом случае при вызове колбека нужно максимально быстро  отдать данные и вернуть управление, а в других потоках эти данные  обрабатывать.

Данные вопросы неоднократно обсуждались, в том числе и на этом форуме.
 
Цитата
Let_it_go написал:
Здравствуйте. Последние дни на рынке паника. Активность резко возросла. Я в КВИКе подписываюсь на стаканы 5 фьючерсов и 50 акций. Обрабатываю их в OnQuote. В июне-июле не было никаких проблем из за вялого рынка. Но в среду-четверг-пятницу пошла жесть. КВИК подвисает намертво. Пришлось отказаться от акций, оставил два фьючерса Si и RTS, но даже их пришлось разнести по разным КВИКам. Два фьючерса в одном скрипте в одном КВИке всё равно вешали КВИК. Сейчас на 1 квик у меня по 1 скрипту, в котором 1 инструмент. Благодаря этому удалось вернуться к работе.
---
Прошу дать совет, как решить эту проблему.
1. Я уже перенёс из OnQuote много функций, которые теперь обрабатываются в main, но там по прежнему остаётся обработка таблиц, несколько циклов и немного математики. Время, за которое проходит одна итерация внутри OnQuote около 20 миллисекунд.
2. На виртуалке поставил более быстрые ядра. Сейчас конфигурация такая:

Обидно, что даже в моменты пиковой нагрузки загрузка процессора даже близко не подходила к 100%, то есть были свободные ядра. При этом более быстрые ядра не решили проблему, квик всё равно подвисал.
3. Работает сборщик мусора луа, проблем с памятью не наблюдалось.
---
Можно ли OnQuote направлять на разные ядра процессора? например с помощью модуля многопоточности луа LuaLanes?
---
Можно ли запустить в одном скипте несколько OnQuote? В один принимать фьючерсы, в другой акции например?
---
Буду благодарен за любые советы и подсказки.
обработка стаканов - это самая затратная операция в КВИК.
На все ваши вопросы кратко можно ответить - Можно, но все зависит от Вашего уровня знаний
1) программирование потоков под виндой
2) владение API C для луа
3) умение программировать на СИ
------------
В качестве примера могу кратко рассказать что делал я.
1) Я реализовал каждый колбек в отдельном скрипте луа.
Это позволяет
1) использовать минимум колбеков вне зависимости от числа роботов
2) фактически запустить столько потоков (main) сколько скриптов
3) колбеки QLUA работают в одном потоке и их распараллелить невозможно. А вот дальнейшую работу с полученными данными я делаю в различных скриптах. А каждый скрипт - это отдельный поток.
4) Существенно ускорить можно если правильно организовать обработку данных. Ошибка многих любителей писать роботов в использовании циклов и постоянной обработки истории. Это надо и можно избежать.
Примерно так.
 
Николай, спасибо, за ответ.
Такой вопрос.
Два одинаковых скрипта. В одном РТС, в другом Си.
Как лучше сделать:
1. Запускать два скрипта в 1 квике?
2. Или открыть два КВИКа и включить по одному скрипту в каждом КВИКе?
 
Let_it_go,

вы не сможете решить вашу проблему теми способами, которые пытаетесь использовать. К сожалению, терминал QUIK - это терминал по большей части для нужд брокера, а не физических лиц, торгующих те или иные инструменты. Если вы хотите 100%-й адекватной вашим требованиям работы при нормальной частоте рыночных операций, вам нужно ограничиться только ОДНИМ скриптом и только по ОДНОМУ инструменту. Присоединение хотя бы еще одного скрипта или еще одного-двух тикеров моментально уменьшит вашу производительность процентов на 40.
Сам основной поток терминала в режиме "ТОЛЬКО отражение данных" - т.е. без скриптов, но, возможно, с некоторыми алгоритмами брокера выдерживает одномоментно изменения не более чем по 50 инстурментам. Именно поэтому у брокеров стоит хотя бы 2-3 терминала для отслеживания изменений по разным тикерам. Понятно, что вы не сможете решить ту задачу, которую ставите, никакими ухищрениями. Единственный способ следующий.

1. Пишете не скрипт, а DLL на С++ (можете взять за основу исходники с пакетов на GitHub), которые реализуют в Lua работу с портами  (Sockets). Ваша DLL должна делать всего одну вещь: обрабатывать вызовы OnQuote, OnParam и другие по вашему выбору и передавать содержимое их параметров через внутренний для вашего ПК порт.
2. Пишете полновесное многопоточное приложение на C++, в котором один поток принимает информацию поступившую через порт от вашей  DLL, а другие заняты распределенной обработкой данных.
3. Еще один порт задействуете для отправки терминалу QUIK вызовов sendTransaction().
4. В этом случае вы будете использовать терминал не как рабочую машину, а просто как транзитный передатчик данных. Основной поток терминала в этом случае не будет перегружаться, но я рекомендую вам уменьшить суммарное число отслеживаемых тикеров до хотя бы 48-49.
5. Альтернатива также известна. Как я уже написал выше: "один терминал - один скрипт - один рассчитываемый тикер".
 
У меня сейчас стоит windows server 2003. Он потребляет меньше всего ресурсов.
Может быть перейти на Windows server 2016? У него системные требования выше, но наверное и быстродействие выше. За 13 лет в плане скорости могли сделать большой шаг вперёд.
 
Цитата
Let_it_go написал:
У меня сейчас стоит windows server 2003. Он потребляет меньше всего ресурсов.
Может быть перейти на Windows server 2016? У него системные требования выше, но наверное и быстродействие выше. За 13 лет в плане скорости могли сделать большой шаг вперёд.
Для начала сделайте следующее.
1) уберите лишние параметры и проверьте отключение опционов.
т е в окне настройки посмотрите сколько инструментов и сколько параметров Вы выбрали (указано явно количество)
2) Выгрузите все лишние приложения и службы (проверьте сколько свободной памяти при работе квик и какая загрузка процессора)
3) Установите в параметрах КВИК минимальное время отклика (10 мс)
4) Отключите алгоритм нейгла
5) При работе КВИК делайте следующее
1) выгружайте браузер
2) не запускайте другие приложения
3) сворачивайте окна, которые не смотрите. Если хотите ускорить квик, то сверните его.
Сворачивайте стаканы если хотите ускорить их обработку.
------------------------
Не понятно почему у вас стоит сервер. Посмотрите как он загружен другими задачами.
--------------------------------
Напишите обработку данных от стакана на СИ Можно конечно и на СИ++, но для луа арi для СИ. а использовать обертки лишь замедляет работу.
-----------------------------
Можно сделать в квике лишь прием данных а обработку вынести в отдельные задачи на СИ или С++.
-----------------
В квике время обработки стакана можно уменьшить примерно в 10-100 раз если написать обработку на СИ в виде DLL.
---------------
По-возможности не используйте обращение к хранилищу КВИК, а храните все необходимые Вам данные в специально выделенных массивах.
----------------
Я например все храню в отдельных таблицах луа, либо в двоичных массивах.
===================
Но хочу заметить следующее.
КВИК - это изначально терминал для подачи поручений брокеру, а не платформа для создания HFT роботов
Поэтому априори Вы должны усвоить что на квике Вы получаете информацию которая запаздывет относительно биржи на 100-500 мс.
Ваши заявки в пики обрабатываются в очереди на сервере броккера со скоростью примерно 1000 транзакций в секунду.
Т е если у брокера на каждый сервер несколько тысяч клиентов, то Ваша хаявка будет стоять в очереди несколько секунд.
-----------------------------
Поэтому реально можно делать робота который по инструменту может послать примерно до 10 поручений в секунду с запаздыванием примерно на 0.1-0.2 секунды относительно реального времени событий на бирже (и это еще будет хорошо)
Страницы: 1
Читают тему
Наверх