Комментарии 24
Любопытства ради спрошу, а какие протоколы использует ваша биржа? Для market data, order entry итп.
Что то самодельное свое, или были взяты готовые наработки?
Есть стандартные протоколы – FIX для подачи заявок и FAST для маркет-даты. На срочном рынке для быстрой торговли есть также бинарный TWIME (про него на Хабре была отдельная подробная статья).
Также на всех рынках есть совсем свои: CGate на срочном рынке и ASTS Bridge на фондовом, валютном, денежном. Необходимость своего протокола вызвана, в частности, тем, что на рынках есть много специфичной для Московской Биржи функциональности, которой нет на других биржах и которая не предусмотрена стандартами. Например, клиринговые и позиционные данные и транзакции, переговорные режимы торгов, различные виды аукционов.
А вы ведёте какую либо статистику скорости реакции HFT участников?
Понятное дело что все, кто не пришел первым — будут сильно с задержкой обработаны, т.к. встанут в очередь, но вот по round trip времени первого агрессивного пакета, за вычетом задержки непосредственно сети, вполне можно судить.
Ну и если вы ведёте такую статистику — какая средняя сейчас скорость у HFT игроков на московской бирже. Спрашиваю т.к любопытно, насколько большая разница с тем же Eurex-ом например, где лидеры HFT гонки уже давно считают скорость реакции в десятках наносекунд… (У eurex-а очень много статистики доступно в сыром открытом виде, так что любой клиент биржа вооружившись python/pandas-ом может много этих данных вытащить несложным анализом).
Говорят у Microsoft есть такая штука, WPF, которая скоро станет кросс-платформенной
Ни один человек не потянет 50 окон, т.к. объем у внимания ограничен на порядок.
Не совсем так. Не обязательно держать в один момент времени все 50 во внимании. "одномоментно и одновременно".
По тематике сабжа, например, могут быть пара десятков окон с графиками и стаканами по инструментам и десяток индикаторов. Трейдер сосредоточен только на интересующих его в данный момент, но боковым зрением отслеживает какие-то всплески в соседних. Ну и иногда осматривая все. Делать это взглядом гораздо удобнее и быстрее, чем переключать экраны/вкладки/рабочие столы. Так что 50 одновременно открытых и отображаемых окон вполне себе нормальное и оправданное желание.
Там хотят два по 50, а всплески на втором телевизоре могут только отвлекать и рассеивать внимание человека. Не даром на КДПВ ограничились 6 графиками.
но думаю проще (дешевле) повесить для таких целей кучу (пару десятков) простых FHD мониторов (телевизоров) с мини-компами и на каждом по 5-10 окон показывать.
PS: Но относительно гуя могу выразить свою уверенность что обычные таблицы и графики на «два 4к монитора по 50 окон» потянет любой стек на нормальном (да и не очень) железе. Вопрос только в адекватности скорости обсчёта (получения) отображаемых данных. Поскольку сфера достаточно специфична, вполне нормально (берите пример с GameDev) выставить требования к железу для вашего ПО
А собственно почему и нет. У нас в компании все средства мониторинга в основном на devexpress-е реализованы, которое по сути нашлепка поверх WPF, и все прекрасно работает. Хотя я не берусь утверждать какие у нас пропорции количества мониторов к количеству серверов, т.к почти все PROD приложения запущены через citrix "где-то там" на citrix farm-е…
Кстати, небольшой совет – при выборе библиотек для корпоративных решений не забыть исследовать их совместимость с системами автотестирования. У нас, например, было долгое хождение по граблям, пока не научили их распознавать некоторые 3rd-party гуёвые контролы.
В других решениях биржи, нацеленных на более широкую аудиторию, сейчас применяем хорошо всем известный стек ныне популярных технологий – Vue.js, Kubernetes, Kafka, Camunda,…
Непосредственно перед стартом определятся максимальный размер каждой таблицы — и именно такой размер выделяется в оперативной памяти (с mlock). Это сделано для обеспечения не только минимальной задержки, но и стабильного джиттера, т.к. если в процессе работы будет увеличение размера, это приведет к небольшим паузам. Из-за особенности торгов мы каждый день перезапускаем систему и, соответственно, корректируем эти значения. Также в ходе старта происходит загрузка всех справочных данных на текущей день из SQL-базы. Можно выделить 4 класса таблиц: вспомогательные (хеши, индексы), статические данные (загружаются в отсортированном виде при старте из SQL-базы и более не меняются), динамические и динамические с реюзингом. Последний тип достаточно интересный, ~70-80 % RAM занимает таблица заявок, количество таких заявок может быть под 100 млн за день, и каждая строчка — это около ~450 байт. Хотя серверы с 1Тб+ RAM вполне доступны сейчас, но лет 6 назад этот объем был существенен, да и серверов с учетом всех гейтвеев более 100. Но самое главное — хранить их всех нет необходимости. Большая часть заявок в ходе торгового дня становится неактивна и нужна только для истории, сразу скажу, эта задача решается online-импортом в SQL-базу. Поэтому в ходе работы с этой таблицей ведется список LRU (least recently used), и когда все доступные записи таблицы использованы, начинается алгоритм реюзинга (отвязывание записей из LRU, входящих в отображения, и перевод в новый список доступных после реюзинга). Эта операция идет блочно по ~32 записи, т.е. мы освободили место под текущую транзакцию и сделали задел на будущее. Если меньше, то операции синхронизации (чтобы безопасно отвязать) на каждой транзакции будут давать замедление (производительность падает на 20 % в этом случае, по сравнению, когда реюзинга еще нет). Если делать больше то на транзакции, в которой происходит операция, будет всплеск задержки в обработки. Поэтому было найдено оптимальное значение (падение производительности ~1 %).
Все запросы пишутся тоже с нуля. Вообще говоря, в запросах сразу заложен нативный протокол Mustang и все запросы сразу формируют Mustang-пакеты без какого-либо внутреннего промежуточного представления. Собственно, по этой причине и нет сейчас «бинарного» протокола на фондовом и валютном рынке.
Данная база модифицируется всё время, пока функционирует Биржа, начиная с австралийской версии ASTS.
База на текущий момент не распределенная и все серверы имеют ее реплики на, в теории, неограниченное число серверов. Об этом расскажем в следующей части
А можно об этом поподробнее? Ведь даже если сам чип на своей шине производит переупорядочивание запросов на чтение памяти, с программной точки зрения, даже в мультипроцессорной системе, это вроде не должно быть заметно…
Эволюция архитектуры торгово-клиринговой системы Московской биржи. Часть 1