Aufträge

OrderGrid ist eine Tabelle zur Anzeige von Aufträgen und bedingten Aufträgen. Außerdem enthält das Kontextmenü dieser Tabelle Befehle für Operationen mit Aufträgen: Registrierung, Änderung und Stornierung von Aufträgen. Die Auswahl eines Menüeintrags erzeugt die Ereignisse OrderGrid.OrderRegistering, OrderGrid.OrderReRegistering bzw. OrderGrid.OrderCanceling.

Aufträge – Bildschirmfoto

Tip

Die Operation selbst (Registrierung, Änderung, Stornierung) wird nicht ausgeführt. Der entsprechende Code muss manuell in den Ereignishandlern geschrieben werden.

Wichtigste Member

Unten sind Codefragmente für die Verwendung gezeigt. Das Codebeispiel stammt aus Samples/01_Basic/03_Orders.

<Window x:Class="Sample.OrdersWindow"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:loc="clr-namespace:StockSharp.Localization;assembly=StockSharp.Localization"
	xmlns:xaml="http://schemas.stocksharp.com/xaml"
	Title="{x:Static loc:LocalizedStrings.Orders}" Height="410" Width="930">
	<xaml:OrderGrid x:Name="OrderGrid" x:FieldModifier="public"
					OrderCanceling="OrderGrid_OnOrderCanceling"
					OrderReRegistering="OrderGrid_OnOrderReRegistering" />
</Window>

private readonly Connector _connector = new Connector();

private void ConnectClick(object sender, RoutedEventArgs e)
{
	// Sonstiger Code während der Verbindung...

	// Ereignis für empfangene Aufträge abonnieren
	_connector.OrderReceived += (subscription, order) =>
	{
		// Aufträge zur Tabelle OrderGrid hinzufügen
		_ordersWindow.OrderGrid.Orders.TryAdd(order);
	};

	// Connector verbinden
	_connector.Connect();
}

// Storniert alle ausgewählten Aufträge
private void OrderGrid_OnOrderCanceling(IEnumerable<Order> orders)
{
	// Durch ausgewählte Aufträge iterieren und jeden stornieren
	foreach (var order in orders)
	{
		_connector.CancelOrder(order);
	}
}

// Öffnet ein Fenster zum Bearbeiten des Auftrags und führt die Änderung des ausgewählten Auftrags aus
private void OrderGrid_OnOrderReRegistering(Order order)
{
	var window = new OrderWindow
	{
		Title = LocalizedStrings.Str2976Params.Put(order.TransactionId),
		SecurityProvider = _connector,
		MarketDataProvider = _connector,
		Portfolios = new PortfolioDataSource(_connector),
		Order = order.ReRegisterClone(newVolume: order.Balance)
	};

	if (window.ShowModal(this))
		_connector.ReRegisterOrder(order, window.Order);
}

Arbeiten mit Aufträgen über Abonnements

Der moderne Ansatz für die Arbeit mit Aufträgen verwendet Abonnements:

// Ereignis für empfangene Aufträge abonnieren
_connector.OrderReceived += OnOrderReceived;

// Handler für empfangene Aufträge
private void OnOrderReceived(Subscription subscription, Order order)
{
	// Prüfen, ob der Auftrag zum für uns relevanten Abonnement gehört
	if (subscription == _ordersSubscription)
	{
		// Auftrag zur Tabelle hinzufügen
		_ordersWindow.OrderGrid.Orders.TryAdd(order);

		// Zusätzliche Auftragsverarbeitung
		Console.WriteLine($"Auftrag empfangen: {order.TransactionId}, Status: {order.State}");

		// Wenn der Auftrag in einem finalen Zustand ist, UI aktualisieren
		if (order.State == OrderStates.Done || order.State == OrderStates.Failed)
		{
			this.GuiAsync(() => {
				// Oberfläche für abgeschlossene Aufträge aktualisieren
			});
		}
	}
}

Aufträge stornieren

// Moderner Ansatz zur Auftragsstornierung
private void CancelOrder(Order order)
{
	try
	{
		_connector.CancelOrder(order);

		// Aktion protokollieren
		_logManager.AddInfoLog($"Befehl zur Auftragsstornierung gesendet: {order.TransactionId}");
	}
	catch (Exception ex)
	{
		_logManager.AddErrorLog($"Fehler beim Stornieren des Auftrags: {ex.Message}");
	}
}

// Massenstornierung von Aufträgen
private void CancelAllOrders()
{
	var activeOrders = _ordersWindow.OrderGrid.Orders
		.Where(o => o.State == OrderStates.Active)
		.ToArray();

	foreach (var order in activeOrders)
	{
		CancelOrder(order);
	}
}

Fehler bei Auftragsregistrierung und -stornierung behandeln

// Fehler bei der Auftragsregistrierung abonnieren
_connector.OrderRegisterFailReceived += OnOrderRegisterFailed;

// Handler für fehlgeschlagene Auftragsregistrierung
private void OnOrderRegisterFailed(Subscription subscription, OrderFail fail)
{
	// Fehlerinformationen zu OrderGrid hinzufügen
	_ordersWindow.OrderGrid.AddRegistrationFail(fail);

	// Fehler protokollieren
	_logManager.AddErrorLog($"Fehler bei der Auftragsregistrierung: {fail.Error}");

	// Benutzer benachrichtigen
	this.GuiAsync(() =>
	{
		MessageBox.Show(this,
			$"Auftrag konnte nicht registriert werden: {fail.Error}",
			"Registrierungsfehler",
			MessageBoxButton.OK,
			MessageBoxImage.Error);
	});
}