Маршрутизация адаптеров
StockSharp поддерживает одновременное подключение к нескольким биржам и брокерам. Система маршрутизации (basket routing) управляет тем, какие сообщения направляются к каким адаптерам, обеспечивая прозрачную работу с множеством подключений.
Общая архитектура
При использовании нескольких адаптеров коннектор автоматически создаёт корзину (basket), которая объединяет все подключения. Маршрутизатор определяет, на какой адаптер направить каждое конкретное сообщение -- подписку на рыночные данные, транзакцию, запрос портфеля и т.д.
AdapterRouter
Интерфейс IAdapterRouter определяет логику маршрутизации сообщений между адаптерами.
Основные методы
| Метод | Описание |
|---|---|
GetAdapters |
Возвращает список адаптеров, подходящих для обработки данного сообщения |
GetSubscriptionAdaptersAsync |
Асинхронно определяет адаптеры для подписки на рыночные данные |
GetPortfolioAdapter |
Возвращает адаптер, привязанный к конкретному портфелю |
TryGetOrderAdapter |
Находит адаптер, через который была зарегистрирована заявка |
SetSecurityAdapter |
Привязывает инструмент к конкретному адаптеру |
SetPortfolioAdapter |
Привязывает портфель к конкретному адаптеру |
Приоритеты маршрутизации
Система определяет целевой адаптер в следующем порядке приоритетов:
- Явное указание -- если в сообщении задан адаптер через свойство
message.Adapter, используется именно он. - Привязка инструмента -- маппинг, установленный через
SetSecurityAdapter. - Привязка по типу данных -- адаптеры, зарегистрированные для определённого типа сообщений.
- Фильтрация по поддерживаемым типам -- выбираются адаптеры, которые поддерживают данный тип сообщения.
Настройка маршрутизации
var router = connector.Adapter.InnerAdapters;
// Привязка инструмента к адаптеру для получения тиковых данных
router.SetSecurityAdapter(
secId,
DataType.Ticks,
binanceAdapter
);
// Привязка портфеля к адаптеру для транзакций
router.SetPortfolioAdapter(
"MyPortfolio",
interactiveBrokersAdapter
);
Управление подключениями
Состояния подключения
Каждый адаптер в корзине проходит через стандартные состояния подключения:
- Disconnected -- отключён
- Connecting -- идёт подключение
- Connected -- подключён
- Disconnecting -- идёт отключение
Корзина агрегирует состояния всех вложенных адаптеров.
Параметры агрегации
Свойство ConnectDisconnectEventOnFirstAdapter определяет, когда корзина считается подключённой:
true-- событие подключения срабатывает при подключении первого адаптера (по умолчанию). Позволяет начать работу, не дожидаясь всех подключений.false-- событие срабатывает только после подключения всех адаптеров.
// Ожидать подключения всех адаптеров
connector.Adapter.InnerAdapters.ConnectDisconnectEventOnFirstAdapter = false;
connector.Connected += () =>
{
Console.WriteLine("Все адаптеры подключены");
};
connector.Connect();
Родительские и дочерние подписки
При работе с несколькими адаптерами одна подписка может быть разделена на несколько дочерних, каждая из которых направляется на свой адаптер. Система автоматически:
- Создаёт дочерние подписки для каждого подходящего адаптера
- Агрегирует ответы перед уведомлением родительской подписки
- Обрабатывает частичные ошибки (если один адаптер не смог подписаться, остальные продолжают работать)
Пример с несколькими биржами
// Добавление адаптеров
connector.Adapter.InnerAdapters.Add(binanceAdapter);
connector.Adapter.InnerAdapters.Add(bybitAdapter);
connector.Connect();
// Подписка на тики -- будет автоматически направлена
// на все адаптеры, поддерживающие данный инструмент
var subscription = new Subscription(DataType.Ticks, security);
connector.Subscribe(subscription);
Очередь ожидающих сообщений
Если в момент отправки сообщения ни один адаптер не подключён, сообщение помещается в очередь ожидания (IPendingMessageState). При подключении адаптера все накопленные сообщения автоматически отправляются.
// Регистрация заявки до подключения -- заявка будет отправлена
// автоматически после установления соединения
connector.RegisterOrder(order);
connector.Connect();
Настройка нескольких подключений
Программная настройка
// Создание адаптеров
var binance = new BinanceMessageAdapter(connector.TransactionIdGenerator)
{
Key = "<API_KEY>",
Secret = "<API_SECRET>".Secure(),
};
var ib = new InteractiveBrokersMessageAdapter(connector.TransactionIdGenerator)
{
Address = InteractiveBrokersMessageAdapter.DefaultAddress,
};
// Добавление в корзину
connector.Adapter.InnerAdapters.Add(binance);
connector.Adapter.InnerAdapters.Add(ib);
// Настройка маршрутизации
connector.Adapter.InnerAdapters.SetPortfolioAdapter("BinancePortfolio", binance);
connector.Adapter.InnerAdapters.SetPortfolioAdapter("IBPortfolio", ib);
connector.Connect();
Графическая настройка
Для визуальной настройки подключений используйте компонент графического конфигурирования. Подробнее в разделе Графическое конфигурирование.
Отслеживание заявок
Маршрутизатор автоматически отслеживает, через какой адаптер была зарегистрирована каждая заявка. При получении обновлений по заявке (изменение состояния, сделки) система направляет их через тот же адаптер:
// Заявка будет зарегистрирована через адаптер, привязанный к портфелю
var order = new Order
{
Security = security,
Portfolio = portfolio,
Side = Sides.Buy,
Price = price,
Volume = volume,
};
connector.RegisterOrder(order);
// Отмена пойдёт через тот же адаптер автоматически
connector.CancelOrder(order);