Переходим к большой (около 10 статей) минисерии про AServer. Сердце любой реализации коннектора. Абстрактный класс, реализующий в себе от 50 до 80 % логики любого коннектора. Много статей будет, т.к. придётся подробно поговорить про его внутренности, которых около 2.5 тысяч строк. Чтобы делать коннекторы, нужно знать, что у AServer внутри.
AServer в проекте.
Регионы AServer.
Ниже будут представлены описания членов регионов, коротко. Рекомендую одним глазком ознакомиться. Далее, в течении следующей недели будем про них более глубоко почти про каждый разговаривать отдельно.
1. Instead of a constructor.
Регион, в котором одно свойство, в которое помещается реализация сервера для того, чтобы AServer активировался на работу. Поэтому регион и называется «Вместо конструктора».
2. GUI.
Регион, хранящий в себе работу с окном настроек.
- Открыть окно настроек конкретной реализации сервера.
- Окно настроек.
- Окно закрыто.
3.Parameters.
Регион, в котором расположены параметры сервера. Как стандартные, так и кастомные.
- Активирован ли Aserver до конца. Когда становится true, параметры могут начать сохраняться. До этого только грузятся.
- Стандартные настройки сервера.
- NeedToHideParams. Если true, стандартные парамтеры сервера не будут отображаться в окне сервера. Используется в серверах данных.
- Массив, в котором хранятся все параметры сервера.
- Методы для создания новых параметров.
- Методы сохранения / загрузки настроек параметров из файловой системы.
- Обработчики событий обновления параметров.
4. Start / Stop server – user direction.
Регион, в котором хранятся члены, отвечающие за внешнее управление коннектором со стороны пользователя.
Прямо из визуального интерфейса пользователю нельзя послать поток, который будет подключать коннектор к бирже. Поток из визуального интерфейса изменит флаг в этом регионе, а остальное будут делать внутренние потоки AServer, о которых речь пойдёт ниже.
- Статус сервера, который заказал пользователь. Connect / Disconnect.
- Публичный метод, вызываемый из внешних интерфейсов для смены желаемого статуса на Connect.
- Публичный метод, вызываемый из внешних интерфейсов для смены желаемого статуса на Disconnect.
- Событие: пользователь заказал статус Connect.
- Событие: пользователь заказал статус Disconnect.
5. Server status.
Регион, в котором хранится текущий статус сервера. Connect – полностью готов к торгам. Disconnect – не готов ни к чему.
- Текущий статус сервера. Connect / Disconnect.
- Тип сервера.
- Реализация сервера подключилась к API.
- Реализация сервера отключилась от API.
- Событие: Изменился статус сервера.
- Событие: Необходим перезапуск сервера. В основном вызывается для того, чтобы CandleConnector всех источников начали процедуру переподключения бумаг к торгам.
6. Thread1. Work with connection.
Регион, в котором работает главный поток AServer, отвечающий за статус подключения, запрашивающий Portfolios и Securities, разворачивающий CandleManager данного коннектора.
- Место работы Prime потока коннектора.
- Последнее время старта сервера.
- Запустить класс, отвечающий за сборку свечек.
- Удалить класс, отвечающий за сборку свечек.
7. Thread 2. Data forwarding flow operation.
Регион, в котором работает поток, отправляющий входящие от API данные наверх (роботам и другим подсистемам).
- Место работы потока, рассылающего данные из коннектора наверх.
- Массив с ордерами, которые нужно отправить наверх.
- Массив с массивами лент сделок, которые нужно отправить наверх.
- Массив с портфелями клиента, которые нужно отправить наверх.
- Массив с бумагами, которые нужно отправить наверх.
- Массив с трейдами по портфелям клиента, которые нужно отправить наверх.
- Массив с временем сервера, которое нужно отправить наверх.
- Массив с сериями свечек, которые нужно отправить наверх.
- Массив со стаканами котировок, которые нужно отправить наверх.
8. Server Time.
Регион, в котором хранится и обрабатывается время сервера.
- Время сервера.
- Событие: время сервера изменилось.
9.Portfolios.
Регион, в котором хранятся и обрабатываются портфели клиента.
- Массив с портфелями клиента.
- Запросить объект портфеля по его имени.
- Обработчик события обновления портфеля.
- Событие: Портфели изменились.
10. Securities.
Регион, в котором хранятся и обрабатываются бумаги по площадке.
- Массив с доступными на площадке бумагами.
- Часто запрашиваемые бумаги. Добавлено для оптимизации, чтобы не обходить верхний массив постоянно до конца из следующего метода.
- Запрос объекта бумаги по имени и классу.
- Показать бумаги на площадке в виде таблицы.
- Обработчик события обновления бумаг в источнике.
- Событие: Обновился список бумаг по площадке.
11. Subcribe to data.
Регион, в котором происходит подписка на данные по определённому инструменту. Очень нагруженное место.
- Объект класса, который собирает свечи.
- Хранилище свечей в файловую систему.
- Блокиратор многопоточного доступа к методу StartThisSecurity.
- Блокиратор многопоточного доступа к методу StartThisSecurity на старте коннектора.
- Время последней попытки старта бумаги.
- Метод для старта прослушивания бумаги.
- Метод для остановки прослушивания бумаги.
- Обработчик события обновления серии свечей.
- Событие: Обновились свечи.
12.Data upload.
Регион, в котором предоставляются методы для получения данных из коннектора.
- Блокиратор многопоточного доступа к методам региона под цифрами 2 и 3.
- Взять массив свечей на старте серии свечек. Вызывается во время активации серии свечек из CandleManager.
- Взять массив свечей для OsData.
- Взять массив трейдов для OsData.
13. Market depth.
Регион, в котором хранятся и обрабатываются стаканы котировок.
- Массив, хранящий в себе последний полученный стакан по каждой подписанной на данные бумаги.
- Блокиратор многопоточного доступа к предыдущему массиву.
- Последние значения bid и ask по каждой подписанной на данные бумаги.
- Обработчик входящего события обновления стакана. Из него вызываются следующие два метода.
- Попробовать поставить стакан на отправку наверх.
- Попробовать поставить объект, хранящий bidAsk по инструменту в очередь на отправку наверх.
- Событие: Сменился bid или ask по инструменту.
- Событие: Обновился стакан по инструменту.
14. Trades.
Регион, в котором хранятся и обрабатываются ленты сделок.
- Объект, отвечающий за хранение трейдов в файловой системе.
- Массив массивов лент сделок по инструментам.
- Блокиратор многопоточного доступа к массиву массивов лент сделок.
- Взять ленту сделок по определённому инструменту. Всё, что есть сейчас в наличии.
- Обработчик входящего события загрузки ленты сделок из файловой системы.
- Обработчик входящего события новой сделки из ServerRealization. Т.е. с рынка.
- Догрузить в трейд данные по лучшему биду и аску на данный момент.
- Событие: Обновилась лента сделок.
15.MyTrades.
Регион, в котором хранятся и обрабатываются мои сделки по портфелям клиента.
- Массив трейдов по портфелю клиента.
- Нужно ли воспроизводить звук, при событии появления нового трейда по портфелю клиента.
- Метод, воспроизводящий звук при событии появления нового трейда в портфеле клиента.
- Обработчик события появления нового трейда в портфеле клиента.
- Событие: Новый трейд по портфелю клиента.
16. Thread3. Work with orders.
Регион, в котором хранятся и обрабатываются процедуры для управления торговлей клиента. В данном регионе работает ещё один поток и очередь для приказов в сторону API.
- Место работы потока, посылающего торговые приказы в ServerRealization.
- Очередь с приказами, ожидающими отправки в ServerRealization.
- Механизм доступа к переменной, которая определяет время ожидания от того, как сервер перейдёт в режим Connect, до того, как можно будет отправить в ServerRealization первый ордер.
- Может ли сервер изменять цену ордера без его отзыва с биржи.
- Исполнить ордер. Метод для передачи в сервер торгового приказа извне.
- Изменить цену ордера без его отзыва. Метод для передачи в сервер торгового приказа извне.
- Отменить ордер. Метод для передачи в сервер торгового приказа извне.
- Отменить все ордера. Метод для передачи в сервер торгового приказа извне.
- Отменить ордера по конкретной бумаге. Метод для передачи в сервер торгового приказа извне.
- Обработчик события появления нового ордера на бирже.
- Событие: новый ордер.
- Событие: пользователь прислал ордер на исполнение.
- Событие: пользователь прислал ордер на отзыв.
17 OrdersHub
Регион, в котором хранятся и обрабатываются процедуры для хранения и запроса статусов ордеров.
- Объект в котором хранятся ордера входящие в коннектор из OsEngine. И из которого исходят нижеописанные события.
- Событие: нужно запросить у АПИ список активных ордеров. Вызывается через 15 секунд после подключения коннектора.
- Событие: ордер окончательно потерян. Прошло 5ть попыток запросить его статус – АПИ не реагирует.
- Событие: нужно обновить статус ордера через экстренный канал. Стандартный шлюз обновления статусов ордеров не сработал.
Удачных алгоритмов!
Пост из серии «Коннекторы к OsEngine»
Серия о том, как стать настоящим программистом и изменить свою профессию.
Оглавление и смыслы здесь: https://smart-lab.ru/company/os_engine/blog/959953.php
Комментарии открыты для друзей, добавляйтесь!
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Регистрируйся в АЛОР и получай бонусы: https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР: https://www.alorbroker.ru
Раздел «Для клиентов»: https://www.alorbroker.ru/openinfo/for-clients
Программа лояльности от АЛОР БРОКЕР и OsEngine: https://smart-lab.ru/company/os_engine/blog/972745.php