Enrutamiento de adaptadores
StockSharp admite conexiones simultáneas a múltiples bolsas y brokers. El sistema de enrutamiento (basket routing) gestiona qué mensajes se dirigen a qué adaptadores, garantizando un funcionamiento transparente con múltiples conexiones.
Arquitectura general
Al usar varios adaptadores, el conector crea automáticamente una cesta (basket) que combina todas las conexiones. El enrutador determina a qué adaptador debe dirigirse cada mensaje específico: suscripciones a datos de mercado, transacciones, solicitudes de cartera, etc.
AdapterRouter
La interfaz IAdapterRouter define la lógica para enrutar mensajes entre adaptadores.
Métodos principales
| Método | Descripción |
|---|---|
GetAdapters |
Devuelve una lista de adaptadores adecuados para procesar el mensaje dado |
GetSubscriptionAdaptersAsync |
Determina de forma asíncrona los adaptadores para las suscripciones de datos de mercado |
GetPortfolioAdapter |
Devuelve el adaptador vinculado a una cartera específica |
TryGetOrderAdapter |
Encuentra el adaptador a través del cual se registró una orden |
SetSecurityAdapter |
Vincula un instrumento a un adaptador específico |
SetPortfolioAdapter |
Vincula una cartera a un adaptador específico |
Prioridades de enrutamiento
El sistema determina el adaptador de destino en el siguiente orden de prioridad:
- Especificación explícita — si se especifica un adaptador en el mensaje a través de la propiedad
message.Adapter, se usa ese adaptador. - Vinculación de instrumento — mapeo establecido mediante
SetSecurityAdapter. - Vinculación por tipo de datos — adaptadores registrados para un tipo de mensaje específico.
- Filtrado por tipo admitido — se seleccionan los adaptadores que admiten el tipo de mensaje dado.
Configuración del enrutamiento
var router = connector.Adapter.InnerAdapters;
// Vincular el instrumento al adaptador para recibir datos tick
router.SetSecurityAdapter(
secId,
DataType.Ticks,
binanceAdapter
);
// Vincular la cartera al adaptador para transacciones
router.SetPortfolioAdapter(
"MyPortfolio",
interactiveBrokersAdapter
);
Gestión de conexiones
Estados de conexión
Cada adaptador de la cesta pasa por los estados de conexión estándar:
- Disconnected — desconectado
- Connecting — conexión en curso
- Connected — conectado
- Disconnecting — desconexión en curso
La cesta agrega los estados de todos los adaptadores anidados.
Parámetros de agregación
La propiedad ConnectDisconnectEventOnFirstAdapter determina cuándo se considera conectada la cesta:
true— el evento de conexión se dispara cuando se conecta el primer adaptador (valor predeterminado). Permite comenzar a trabajar sin esperar a todas las conexiones.false— el evento se dispara solo después de que todos los adaptadores se hayan conectado.
// Esperar a que todos los adaptadores se conecten
connector.Adapter.InnerAdapters.ConnectDisconnectEventOnFirstAdapter = false;
connector.Connected += () =>
{
Console.WriteLine("Todos los adaptadores conectados");
};
connector.Connect();
Suscripciones padre e hijas
Al trabajar con varios adaptadores, una única suscripción puede dividirse en varias suscripciones hijas, cada una dirigida a su propio adaptador. El sistema automáticamente:
- Crea suscripciones hijas para cada adaptador adecuado
- Agrega las respuestas antes de notificar a la suscripción padre
- Maneja errores parciales (si un adaptador falla al suscribirse, los demás continúan funcionando)
Ejemplo multi-bolsa
// Añadir adaptadores
connector.Adapter.InnerAdapters.Add(binanceAdapter);
connector.Adapter.InnerAdapters.Add(bybitAdapter);
connector.Connect();
// Suscripción a ticks -- se enrutará automáticamente
// a todos los adaptadores que admiten el instrumento indicado
var subscription = new Subscription(DataType.Ticks, security);
connector.Subscribe(subscription);
Cola de mensajes pendientes
Si no hay ningún adaptador conectado cuando se envía un mensaje, el mensaje se coloca en una cola pendiente (IPendingMessageState). Cuando un adaptador se conecta, todos los mensajes acumulados se envían automáticamente.
// Registrar una orden antes de conectar -- la orden se enviará
// automáticamente después de establecer la conexión
connector.RegisterOrder(order);
connector.Connect();
Configuración de múltiples conexiones
Configuración programática
// Crear adaptadores
var binance = new BinanceMessageAdapter(connector.TransactionIdGenerator)
{
Key = "<API_KEY>",
Secret = "<API_SECRET>".Secure(),
};
var ib = new InteractiveBrokersMessageAdapter(connector.TransactionIdGenerator)
{
Address = InteractiveBrokersMessageAdapter.DefaultAddress,
};
// Añadir a la cesta
connector.Adapter.InnerAdapters.Add(binance);
connector.Adapter.InnerAdapters.Add(ib);
// Configurar el enrutamiento
connector.Adapter.InnerAdapters.SetPortfolioAdapter("BinancePortfolio", binance);
connector.Adapter.InnerAdapters.SetPortfolioAdapter("IBPortfolio", ib);
connector.Connect();
Configuración gráfica
Para la configuración visual de conexiones, use el componente de configuración gráfica. Consulte la sección Configuración gráfica para más detalles.
Seguimiento de órdenes
El enrutador rastrea automáticamente qué adaptador se usó para registrar cada orden. Al recibir actualizaciones de órdenes (cambios de estado, operaciones), el sistema las enruta a través del mismo adaptador:
// La orden se registrará a través del adaptador vinculado a la cartera
var order = new Order
{
Security = security,
Portfolio = portfolio,
Side = Sides.Buy,
Price = price,
Volume = volume,
};
connector.RegisterOrder(order);
// La cancelación pasará automáticamente por el mismo adaptador
connector.CancelOrder(order);