Маршрутизация адаптеров

StockSharp поддерживает одновременное подключение к нескольким биржам и брокерам. Система маршрутизации (basket routing) управляет тем, какие сообщения направляются к каким адаптерам, обеспечивая прозрачную работу с множеством подключений.

Общая архитектура

При использовании нескольких адаптеров коннектор автоматически создаёт корзину (basket), которая объединяет все подключения. Маршрутизатор определяет, на какой адаптер направить каждое конкретное сообщение -- подписку на рыночные данные, транзакцию, запрос портфеля и т.д.

AdapterRouter

Интерфейс IAdapterRouter определяет логику маршрутизации сообщений между адаптерами.

Основные методы

Метод Описание
GetAdapters Возвращает список адаптеров, подходящих для обработки данного сообщения
GetSubscriptionAdaptersAsync Асинхронно определяет адаптеры для подписки на рыночные данные
GetPortfolioAdapter Возвращает адаптер, привязанный к конкретному портфелю
TryGetOrderAdapter Находит адаптер, через который была зарегистрирована заявка
SetSecurityAdapter Привязывает инструмент к конкретному адаптеру
SetPortfolioAdapter Привязывает портфель к конкретному адаптеру

Приоритеты маршрутизации

Система определяет целевой адаптер в следующем порядке приоритетов:

  1. Явное указание -- если в сообщении задан адаптер через свойство message.Adapter, используется именно он.
  2. Привязка инструмента -- маппинг, установленный через SetSecurityAdapter.
  3. Привязка по типу данных -- адаптеры, зарегистрированные для определённого типа сообщений.
  4. Фильтрация по поддерживаемым типам -- выбираются адаптеры, которые поддерживают данный тип сообщения.

Настройка маршрутизации

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);

См. также