Orders

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

GUI OrderGrid

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 Orders 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 Orders
private void OrderGrid_OnOrderCanceling(IEnumerable<Order> orders)
{
	// Durch ausgewählte Orders iterieren und jede stornieren
	foreach (var order in orders)
	{
		_connector.CancelOrder(order);
	}
}

// Öffnet ein Fenster zum Bearbeiten der Order und führt die Änderung der ausgewählten Order 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 Orders über Subscriptions

Der moderne Ansatz für die Arbeit mit Orders verwendet Subscriptions:

// Ereignis für empfangene Orders abonnieren
_connector.OrderReceived += OnOrderReceived;

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

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

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

Orders stornieren

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

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

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

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

Fehler bei Orderregistrierung und -stornierung behandeln

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

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

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

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