Orderzustände

Die StockSharp API bietet die Möglichkeit, Informationen über Orders über den integrierten Abonnementmechanismus zu empfangen. Wie bei Marktdaten verwenden Transaktionsinformationen einen einheitlichen Ansatz auf Basis von Subscription.

Orderbezogene Ereignisse

Connector stellt folgende Ereignisse zur Verarbeitung von Orderinformationen bereit:

Ereignis Beschreibung
OrderReceived Ereignis zum Empfang von Orderinformationen
OrderRegisterFailReceived Ereignis für Fehler bei der Orderregistrierung
OrderCancelFailReceived Ereignis für Fehler bei der Orderstornierung
OrderEditFailReceived Ereignis für Fehler bei der Orderänderung
OwnTradeReceived Ereignis zum Empfang von Informationen über eigene Trades

Enum OrderStates

Während ihrer Lebensdauer durchläuft eine Order folgende Zustände:

OrderStates

  • OrderStates.None - die Order wurde im Handelsalgorithmus erstellt, aber noch nicht zur Registrierung gesendet.
  • OrderStates.Pending - die Order wurde zur Registrierung gesendet (RegisterOrder. Das System wartet auf die Bestätigung ihrer Annahme durch die Börse. Bei erfolgreicher Annahme wird das Ereignis OrderReceived ausgelöst, und die Order wechselt in den Zustand OrderStates.Active. Auch die Eigenschaften Order.Id und Order.ServerTime werden initialisiert. Wenn die Order abgelehnt wird, wird das Ereignis OrderRegisterFailReceived mit einer Fehlerbeschreibung ausgelöst, und die Order wechselt in den Zustand OrderStates.Failed.
  • OrderStates.Active - die Order ist an der Börse aktiv. Eine solche Order bleibt aktiv, bis ihr gesamtes Volumen Order.Volume ausgeführt wurde oder sie über CancelOrder zwangsweise storniert wird. Wenn die Order teilweise ausgeführt wird, werden Ereignisse OwnTradeReceived über neue Trades für die platzierte Order ausgelöst, ebenso das Ereignis OrderReceived, das eine Benachrichtigung über die Änderung des Orderrests Order.Balance übergibt. Letzteres Ereignis wird auch bei einer Orderstornierung ausgelöst.
  • OrderStates.Done - die Order ist an der Börse nicht mehr aktiv (sie wurde vollständig ausgeführt oder storniert).
  • OrderStates.Failed - die Order wurde aus irgendeinem Grund von der Börse (oder einem zwischengeschalteten System, zum Beispiel dem Serverteil der Handelsplattform) nicht angenommen.

Automatische Abonnements

Standardmäßig erstellt Connector beim Verbinden automatisch Abonnements für Transaktionsinformationen (SubscriptionsOnConnect). Dazu gehören Abonnements für:

  • Orderinformationen
  • Trade-Informationen
  • Positionsinformationen
  • Basissuche nach Instrumenten

Beispiel zur Verarbeitung eines Orderempfangsereignisses:

private void InitConnector()
{
	// Ereignis für Orderempfang abonnieren
	Connector.OrderReceived += OnOrderReceived;

	// Ereignis für Empfang eigener Trades abonnieren
	Connector.OwnTradeReceived += OnOwnTradeReceived;

	// Ereignis für Fehler bei der Orderregistrierung abonnieren
	Connector.OrderRegisterFailReceived += OnOrderRegisterFailed;
}

private void OnOrderReceived(Subscription subscription, Order order)
{
	// Empfangene Order verarbeiten
	_ordersWindow.OrderGrid.Orders.TryAdd(order);

	// Wichtig! Prüfen, ob die Order zum aktuellen Abonnement gehört,
	// um doppelte Verarbeitung zu vermeiden
	if (subscription == _myOrdersSubscription)
	{
		// Zusätzliche Verarbeitung für das konkrete Abonnement
		Console.WriteLine($"Auftrag: {order.TransactionId}, Status: {order.State}");
	}
}

Manuelles Erstellen von Orderabonnements

In manchen Fällen müssen Sie Informationen über Orders explizit anfordern. Dafür können Sie separate Abonnements erstellen:

// Abonnement für Orders eines bestimmten Portfolios erstellen
var ordersSubscription = new Subscription(DataType.Transactions, portfolio)
{
	TransactionId = Connector.TransactionIdGenerator.GetNextId(),
};

// Handler für den Empfang von Orders
Connector.OrderReceived += (subscription, order) =>
{
	if (subscription == ordersSubscription)
	{
		Console.WriteLine($"Auftrag: {order.TransactionId}, Status: {order.State}, Portfolio: {order.Portfolio.Name}");
	}
};

// Abonnement starten
Connector.Subscribe(ordersSubscription);

Orderstatus prüfen

Zur Bestimmung des aktuellen Zustands einer Order werden Erweiterungsmethoden verwendet:

// Aufträgetatus prüfen
Order order = ...; // empfangene Order

// Ist die Order storniert
bool isCanceled = order.IsCanceled();

// Ist die Order vollständig ausgeführt
bool isMatched = order.IsMatched();

// Ist die Order teilweise ausgeführt
bool isPartiallyMatched = order.IsMatchedPartially();

// Ist mindestens ein Teil der Order ausgeführt
bool isNotEmpty = order.IsMatchedEmpty();

// Ausgeführtes Volumen abrufen
decimal matchedVolume = order.GetMatchedVolume();

Erweiterter Ansatz: Arbeit mit mehreren Abonnements

In komplexen Szenarien müssen Sie möglicherweise gleichzeitig mit mehreren Orderabonnements arbeiten. In diesem Fall ist es wichtig, Ereignisse korrekt zu behandeln, um Duplikate zu vermeiden:

private Subscription _portfolio1OrdersSubscription;
private Subscription _portfolio2OrdersSubscription;

private void RequestOrdersForDifferentPortfolios()
{
	// Abonnement für Orders des ersten Portfolios
	_portfolio1OrdersSubscription = new Subscription(DataType.Transactions, _portfolio1);

	// Abonnement für Orders des zweiten Portfolios
	_portfolio2OrdersSubscription = new Subscription(DataType.Transactions, _portfolio2);

	// Gemeinsamer Handler für den Empfang von Orders
	Connector.OrderReceived += OnMultipleSubscriptionOrderReceived;

	// Abonnements starten
	Connector.Subscribe(_portfolio1OrdersSubscription);
	Connector.Subscribe(_portfolio2OrdersSubscription);
}

private void OnMultipleSubscriptionOrderReceived(Subscription subscription, Order order)
{
	// Bestimmen, zu welchem Abonnement die Order gehört
	if (subscription == _portfolio1OrdersSubscription)
	{
		// Aufträge des ersten Portfolios verarbeiten
	}
	else if (subscription == _portfolio2OrdersSubscription)
	{
		// Aufträge des zweiten Portfolios verarbeiten
	}
}

Note

Ein solcher erweiterter Ansatz mit mehreren Orderabonnements sollte nur in Ausnahmefällen verwendet werden, wenn der Standard-Abonnementmechanismus nicht ausreicht.

Asynchrone Natur von Transaktionen

Das Senden von Transaktionen (Registrierung, Ersetzung oder Stornierung von Orders) erfolgt asynchron. Dadurch muss das Handelsprogramm nicht auf eine Bestätigung der Börse warten, sondern kann weiterarbeiten, was die Reaktion auf Änderungen der Marktsituation beschleunigt.

Um den Status einer Order zu verfolgen, müssen Sie die entsprechenden Ereignisse abonnieren:

Siehe auch