Сегодня подробнее рассмотрим Prime поток AServer, процедуры Connect и Disconnect и обработку Securities с Portfolio. Повторим то, где они хранятся, и поговорим о том, как это всё вместе связано.

AServer в проекте.

Интересующие нас регионы внутри AServer.

Рассматривать их будем вот в этой последовательности с картинки выше, т.к. они так или иначе друг с другом связаны и все используются из региона «Thread 1. Work with connection».
В самом конце статьи по пунктам пройдёмся по тому, как они взаимодействуют.
1. РегионStart / Stop server – user direction.
Регион, в котором хранятся члены, отвечающие за внешнее управление коннектором со стороны пользователя.

- Статус сервера, который заказал пользователь. Connect / Disconnect.
- StartServer. Публичный метод, вызываемый из внешних интерфейсов для смены желаемого статуса на Connect.
- StopServer. Публичный метод, вызываемый из внешних интерфейсов для смены желаемого статуса на Disconnect.
- Событие: пользователь заказал статус Connect.
- Событие: пользователь заказал статус Disconnect.
Прямо из визуального интерфейса пользователю нельзя послать поток, который будет подключать коннектор к бирже. Поток из визуального интерфейса лишь изменит флаг в этом регионе, а остальное будут делать внутренние потоки AServer, о которых речь пойдёт ниже.
2. Регион Server status.
Регион, в котором хранится текущий статус сервера. Connect – полностью готов к торгам. Disconnect – не готов ни к чему.

- Текущий статус сервера. Connect / Disconnect.
- Тип сервера.
- Реализация сервера подключилась к API.
- Реализация сервера отключилась от API.
- Событие: Изменился статус сервера.
- Событие: Необходим перезапуск сервера. В основном вызывается для того, чтобы CandleConnector всех источников начали процедуру переподключения бумаг к торгам.
Суть в том, чтобы дождаться, когда в обработчики событий 3 и 4 придёт оповещение о смене статуса IServerRealization и сохранить этот статус в свойство 1.
3. Регион Portfolios.
Регион, в котором хранятся и обрабатываются портфели клиента.

- Массив с портфелями клиента.
- Запросить объект портфеля по его имени.
- Обработчик события обновления портфеля.
- Событие: Портфели изменились.
4.РегионSecurities.
Регион, в котором хранятся и обрабатываются бумаги по площадке.

- Массив с доступными на площадке бумагами.
- Часто запрашиваемые бумаги. Добавлено для оптимизации, чтобы не обходить верхний массив постоянно до конца из следующего метода.
- Запрос объекта бумаги по имени и классу.
- Показать бумаги на площадке в виде таблицы.
- Обработчик события обновления бумаг в источнике.
- Событие: Обновился список бумаг по площадке.
5. РегионThread 1. Work with connection.
Регион, в котором работает главный поток AServer. Отвечающий за статус подключения, запрашивающий Portfolios и Securities, разворачивающий CandleManager данного коннектора.

- Место работы Main потока.
- Последнее время старта сервера.
- Запустить класс, отвечающий за сборку свечек.
- Удалить класс, отвечающий за сборку свечек.
6.PrimeThreadArea.

1. У метода есть спецатрибут для перехватов исключений в неуправляемой памяти. Это важно. Кое-где возможно при создании нового коннектора тоже придётся это использовать.
2. Задержка у потока – 1 секунда. Он никуда не торопится. Торопиться нужно при рассылке и парсинге данных (и ловле мух). Но не здесь.
3. Если реализацию сервера ещё не подгрузили в AServer – ничего не делаем.
4. Механизм активации подключения.
- Вызывается, когда статус Disconnect, а пользователь заказал Connect.
- Вызывается Dispose у реализации для предварительной очистки памяти.
- Очищаются портфели, если таковые уже есть.
- Удаляется менеджер свечей.
- Вызывается Connect у реализации.
- Вызывается событие NeadToReconnectEvent, чтобы все источники у роботов были оповещены о том, что нужно переподключаться.
5. Механизм отключения от источника.
- Вызывается Dispose у реализации для предварительной очистки памяти.
- Удаляет менеджер свечей.
6. Это условие блокирует проход потока ниже, если статус сервера Disconnect.
7. Если менеджера свечей нет, создаёт его.
8. Вызывает у реализации GetPortfolio.
9. Вызывает у реализации GetSecurities.
7. Последовательность взаимодействия.
7.1 ПользовательиStart / Stop server – user direction.
Пользователь из GUI сервера подаёт приказ на коннект, нажимая на соответствующую кнопку. Вот здесь:

При этом статус сервера, который хочет пользователь от AServer, меняется на Connect, вот здесь:

7.2 Поток из Thread 1. Обращается к IServerRealization, активируя подключение.
Поток Prime, видя желаемый статус, вызывает вот эту процедуру:

Т.е. вызывает сначала Dispose у реализации, а затем и Connect.
7.3 IServerRealization высылает в регион Server Status данные по подключению.
Теперь переходим в AlorServerRealization (как пример). У неё вызывали метод Connect. И через какое-то время все web-socket активированы, она вызывает событие подключение, вот здесь:

AServer узнаёт об этом из обработчика события ConnectEvent, и его статус меняется на Connect:

7.4 Поток из Thread 1. Обращается к IServerRealization, вызывая скачивание бумаг и портфеля.

7.5 IServerRealization высылает в регион Securities скачанные бумаги, а в регион Portfolio скачанные портфели.
Через обработчики событий обновления бумаг и портфелей. Вот здесь:

Удачных алгоритмов!
Пост из серии «Коннекторы к 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
