Adapter-Routing
StockSharp unterstützt gleichzeitige Verbindungen zu mehreren Börsen und Brokern. Das Routing-System (Basket-Routing) verwaltet, welche Nachrichten an welche Adapter geleitet werden, und gewährleistet einen transparenten Betrieb mit mehreren Verbindungen.
Allgemeine Architektur
Bei Verwendung mehrerer Adapter erstellt der Connector automatisch einen Basket, der alle Verbindungen kombiniert. Der Router bestimmt, an welchen Adapter jede einzelne Nachricht geleitet werden soll -- Marktdatenabonnements, Transaktionen, Portfolioanfragen usw.
AdapterRouter
Die Schnittstelle IAdapterRouter definiert die Logik zum Routen von Nachrichten zwischen Adaptern.
Hauptmethoden
| Methode | Beschreibung |
|---|---|
GetAdapters |
Gibt eine Liste der Adapter zurück, die für die Verarbeitung der gegebenen Nachricht geeignet sind |
GetSubscriptionAdaptersAsync |
Bestimmt asynchron die Adapter für Marktdatenabonnements |
GetPortfolioAdapter |
Gibt den an ein bestimmtes Portfolio gebundenen Adapter zurück |
TryGetOrderAdapter |
Findet den Adapter, über den eine Order registriert wurde |
SetSecurityAdapter |
Bindet ein Instrument an einen bestimmten Adapter |
SetPortfolioAdapter |
Bindet ein Portfolio an einen bestimmten Adapter |
Routing-Prioritäten
Das System bestimmt den Ziel-Adapter in folgender Prioritätsreihenfolge:
- Explizite Angabe -- wenn ein Adapter in der Nachricht über die Eigenschaft
message.Adapterangegeben ist, wird dieser Adapter verwendet. - Instrumentenbindung -- Zuordnung, die über
SetSecurityAdapterfestgelegt wurde. - Datentypbindung -- Adapter, die für einen bestimmten Nachrichtentyp registriert sind.
- Filterung nach unterstütztem Typ -- Adapter, die den gegebenen Nachrichtentyp unterstützen, werden ausgewählt.
Konfiguration des Routings
var router = connector.Adapter.InnerAdapters;
// Instrument zum Empfang von Tickdaten an den Adapter binden
router.SetSecurityAdapter(
secId,
DataType.Ticks,
binanceAdapter
);
// Portfolio für Transaktionen an den Adapter binden
router.SetPortfolioAdapter(
"MyPortfolio",
interactiveBrokersAdapter
);
Verwaltung von Verbindungen
Verbindungsstatus
Jeder Adapter im Basket durchläuft die standardmäßigen Verbindungsstatus:
- Disconnected -- getrennt
- Connecting -- Verbindung wird hergestellt
- Connected -- verbunden
- Disconnecting -- Verbindung wird getrennt
Der Basket aggregiert die Status aller enthaltenen Adapter.
Aggregationsparameter
Die Eigenschaft ConnectDisconnectEventOnFirstAdapter bestimmt, wann der Basket als verbunden gilt:
true-- das Verbindungsereignis wird ausgelöst, wenn der erste Adapter sich verbindet (Standard). Ermöglicht den Arbeitsbeginn, ohne auf alle Verbindungen zu warten.false-- das Ereignis wird erst ausgelöst, nachdem sich alle Adapter verbunden haben.
// Warten, bis alle Adapter verbunden sind
connector.Adapter.InnerAdapters.ConnectDisconnectEventOnFirstAdapter = false;
connector.Connected += () =>
{
Console.WriteLine("Alle Adapter verbunden");
};
connector.Connect();
Übergeordnete und untergeordnete Abonnements
Bei der Arbeit mit mehreren Adaptern kann ein einzelnes Abonnement in mehrere untergeordnete Abonnements aufgeteilt werden, von denen jedes an seinen eigenen Adapter geleitet wird. Das System führt automatisch Folgendes aus:
- Erstellt untergeordnete Abonnements für jeden geeigneten Adapter
- Aggregiert Antworten, bevor das übergeordnete Abonnement benachrichtigt wird
- Behandelt Teilfehler (wenn ein Adapter das Abonnement nicht abschließen kann, arbeiten die anderen weiter)
Beispiel für mehrere Börsen
// Adapter hinzufügen
connector.Adapter.InnerAdapters.Add(binanceAdapter);
connector.Adapter.InnerAdapters.Add(bybitAdapter);
connector.Connect();
// Tick-Abonnement -- wird automatisch geroutet
// an alle Adapter, die das angegebene Instrument unterstützen
var subscription = new Subscription(DataType.Ticks, security);
connector.Subscribe(subscription);
Warteschlange für ausstehende Nachrichten
Wenn beim Senden einer Nachricht kein Adapter verbunden ist, wird die Nachricht in eine Warteschlange für ausstehende Nachrichten (IPendingMessageState) eingereiht. Sobald ein Adapter sich verbindet, werden alle angesammelten Nachrichten automatisch gesendet.
// Order vor der Verbindung registrieren -- die Order wird gesendet
// automatisch nach dem Herstellen der Verbindung
connector.RegisterOrder(order);
connector.Connect();
Konfiguration mehrerer Verbindungen
Programmatische Konfiguration
// Adapter erstellen
var binance = new BinanceMessageAdapter(connector.TransactionIdGenerator)
{
Key = "<API_KEY>",
Secret = "<API_SECRET>".Secure(),
};
var ib = new InteractiveBrokersMessageAdapter(connector.TransactionIdGenerator)
{
Address = InteractiveBrokersMessageAdapter.DefaultAddress,
};
// Zum Basket hinzufügen
connector.Adapter.InnerAdapters.Add(binance);
connector.Adapter.InnerAdapters.Add(ib);
// Routing konfigurieren
connector.Adapter.InnerAdapters.SetPortfolioAdapter("BinancePortfolio", binance);
connector.Adapter.InnerAdapters.SetPortfolioAdapter("IBPortfolio", ib);
connector.Connect();
Grafische Konfiguration
Für die visuelle Konfiguration von Verbindungen verwenden Sie die grafische Konfigurationskomponente. Details finden Sie im Abschnitt Grafische Konfiguration.
Order-Tracking
Der Router verfolgt automatisch, über welchen Adapter jede Order registriert wurde. Beim Empfang von Order-Updates (Statusänderungen, Trades) leitet das System diese über denselben Adapter:
// Die Order wird über den an das Portfolio gebundenen Adapter registriert
var order = new Order
{
Security = security,
Portfolio = portfolio,
Side = Sides.Buy,
Price = price,
Volume = volume,
};
connector.RegisterOrder(order);
// Die Stornierung läuft automatisch über denselben Adapter
connector.CancelOrder(order);