注文

OrderGrid は、注文および条件付き注文を表示するためのテーブルです。さらに、このテーブルのコンテキストメニューには、注文に対する操作(注文の登録、差し替え、キャンセル)のコマンドが含まれています。メニュー項目を選択すると、それぞれ OrderGrid.OrderRegisteringOrderGrid.OrderReRegistering、または OrderGrid.OrderCanceling イベントが生成されます。

GUI OrderGrid

Tip

操作そのもの(登録、差し替え、キャンセル)は実行されません。対応するコードをイベントハンドラー内に手動で記述する必要があります。

主なメンバー

以下は、その使用方法を示すコード片です。コード例は 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)
{
	// 接続中のその他のコード...
	
	// 注文受信イベントをサブスクライブします
	_connector.OrderReceived += (subscription, order) => 
	{
		// OrderGrid テーブルに注文を追加します
		_ordersWindow.OrderGrid.Orders.TryAdd(order);
	};
	
	// コネクターに接続します
	_connector.Connect();
}
					
// 選択されたすべての注文をキャンセルします
private void OrderGrid_OnOrderCanceling(IEnumerable<Order> orders)
{
	// 選択された注文を反復処理し、それぞれをキャンセルします
	foreach (var order in orders)
	{
		_connector.CancelOrder(order);
	}
}

// 注文編集ウィンドウを開き、選択された注文の差し替えを実行します
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);
}
	  				

サブスクリプションを通じた注文の操作

注文を操作する最新の方法では、サブスクリプションを使用します。

// 注文受信イベントをサブスクライブします
_connector.OrderReceived += OnOrderReceived;

// 注文受信ハンドラー
private void OnOrderReceived(Subscription subscription, Order order)
{
	// 注文が対象のサブスクリプションに属しているか確認します
	if (subscription == _ordersSubscription)
	{
		// 注文をテーブルに追加します
		_ordersWindow.OrderGrid.Orders.TryAdd(order);
		
		// 追加の注文処理
		Console.WriteLine($"注文を受信しました: {order.TransactionId}, 状態: {order.State}");
		
		// 注文が最終状態の場合、UI を更新します
		if (order.State == OrderStates.Done || order.State == OrderStates.Failed)
		{
			this.GuiAsync(() => {
				// 完了した注文のインターフェイスを更新します
			});
		}
	}
}

注文のキャンセル

// 注文キャンセルの最新の方法
private void CancelOrder(Order order)
{
	try
	{
		_connector.CancelOrder(order);
		
		// アクションをログに記録します
		_logManager.AddInfoLog($"注文キャンセルコマンドを送信しました: {order.TransactionId}");
	}
	catch (Exception ex)
	{
		_logManager.AddErrorLog($"注文キャンセル時のエラー: {ex.Message}");
	}
}

// 注文の一括キャンセル
private void CancelAllOrders()
{
	var activeOrders = _ordersWindow.OrderGrid.Orders
		.Where(o => o.State == OrderStates.Active)
		.ToArray();
		
	foreach (var order in activeOrders)
	{
		CancelOrder(order);
	}
}

注文登録およびキャンセルエラーの処理

// 注文登録失敗をサブスクライブします
_connector.OrderRegisterFailReceived += OnOrderRegisterFailed;

// 注文登録失敗ハンドラー
private void OnOrderRegisterFailed(Subscription subscription, OrderFail fail)
{
	// エラー情報を OrderGrid に追加します
	_ordersWindow.OrderGrid.AddRegistrationFail(fail);
	
	// エラーをログに記録します
	_logManager.AddErrorLog($"注文登録エラー: {fail.Error}");
	
	// ユーザーに通知します
	this.GuiAsync(() => 
	{
		MessageBox.Show(this, 
			$"注文登録に失敗しました: {fail.Error}",
			"登録エラー",
			MessageBoxButton.OK, 
			MessageBoxImage.Error);
	});
}