Estados das ordens

A API StockSharp fornece a capacidade de receber informação sobre ordens através do mecanismo de subscrição integrado. Tal como nos dados de mercado, a informação de transações usa uma abordagem unificada baseada em Subscription.

Eventos Relacionados com Ordens

Connector fornece os seguintes eventos para processar informação de ordens:

Evento Descrição
OrderReceived Evento para receber informação de ordens
OrderRegisterFailReceived Evento para falha no registo de ordens
OrderCancelFailReceived Evento para falha no cancelamento de ordens
OrderEditFailReceived Evento para falha na modificação de ordens
OwnTradeReceived Evento para receber informação sobre negócios próprios

Enum OrderStates

Durante o seu tempo de vida, uma ordem passa pelos seguintes estados:

OrderStates

  • OrderStates.None - a ordem foi criada no algoritmo de negociação, mas ainda não foi enviada para registo.
  • OrderStates.Pending - a ordem foi enviada para registo (RegisterOrder. O sistema aguarda confirmação da sua aceitação pela bolsa. Se a aceitação for bem-sucedida, o evento OrderReceived será acionado e a ordem passará para o estado OrderStates.Active. As propriedades Order.Id e Order.ServerTime também serão inicializadas. Se a ordem for rejeitada, o evento OrderRegisterFailReceived será acionado com uma descrição do erro, e a ordem passará para o estado OrderStates.Failed.
  • OrderStates.Active - a ordem está ativa na bolsa. Essa ordem permanecerá ativa até que todo o seu volume Order.Volume seja executado ou até ser cancelada forçadamente através de CancelOrder. Se a ordem for parcialmente executada, são acionados os eventos OwnTradeReceived sobre novos negócios da ordem colocada, bem como o evento OrderReceived, que passa uma notificação sobre a alteração do saldo da ordem Order.Balance. Este último evento também será acionado em caso de cancelamento da ordem.
  • OrderStates.Done - a ordem já não está ativa na bolsa (foi totalmente executada ou cancelada).
  • OrderStates.Failed - a ordem não foi aceite pela bolsa (ou por um sistema intermediário, como a parte de servidor da plataforma de negociação) por algum motivo.

Subscrições Automáticas

Por predefinição, Connector cria automaticamente subscrições para informação de transações ao ligar (SubscriptionsOnConnect). Isto inclui subscrições para:

  • Informação de ordens
  • Informação de negócios
  • Informação de posições
  • Pesquisa básica de instrumentos

Exemplo de processamento de um evento de receção de ordem:

private void InitConnector()
{
	// Assinar evento de recebimento de ordens
	Connector.OrderReceived += OnOrderReceived;
	
	// Assinar evento de recebimento de negociações próprias
	Connector.OwnTradeReceived += OnOwnTradeReceived;
	
	// Assinar evento de falha no registro de ordem
	Connector.OrderRegisterFailReceived += OnOrderRegisterFailed;
}

private void OnOrderReceived(Subscription subscription, Order order)
{
	// Processar ordem recebida
	_ordersWindow.OrderGrid.Orders.TryAdd(order);
	
	// Importante! Verifique se a ordem pertence à assinatura atual
	// para evitar processamento duplicado
	if (subscription == _myOrdersSubscription)
	{
		// Processamento adicional para a assinatura específica
		Console.WriteLine($"Ordem: {order.TransactionId}, Estado: {order.State}");
	}
}

Criação Manual de Subscrições de Ordens

Em alguns casos, pode ser necessário solicitar explicitamente informação sobre ordens. Para isso, pode criar subscrições separadas:

// Criar assinatura para ordens de uma carteira específica
var ordersSubscription = new Subscription(DataType.Transactions, portfolio)
{
	TransactionId = Connector.TransactionIdGenerator.GetNextId(),
};

// Manipulador para recebimento de ordens
Connector.OrderReceived += (subscription, order) =>
{
	if (subscription == ordersSubscription)
	{
		Console.WriteLine($"Ordem: {order.TransactionId}, Estado: {order.State}, Carteira: {order.Portfolio.Name}");
	}
};

// Iniciar a assinatura
Connector.Subscribe(ordersSubscription);

Verificar o Estado da Ordem

São usados métodos de extensão para determinar o estado atual de uma ordem:

// Verificar status da ordem
Order order = ...; // ordem recebida

// A ordem foi cancelada
bool isCanceled = order.IsCanceled();

// A ordem foi totalmente executada
bool isMatched = order.IsMatched();

// A ordem foi parcialmente executada
bool isPartiallyMatched = order.IsMatchedPartially();

// Pelo menos parte da ordem foi executada
bool isNotEmpty = order.IsMatchedEmpty();

// Obter volume executado
decimal matchedVolume = order.GetMatchedVolume();

Abordagem Avançada: Trabalhar com Várias Subscrições

Em cenários complexos, pode ser necessário trabalhar com várias subscrições de ordens em simultâneo. Neste caso, é importante processar corretamente os eventos para evitar duplicação:

private Subscription _portfolio1OrdersSubscription;
private Subscription _portfolio2OrdersSubscription;

private void RequestOrdersForDifferentPortfolios()
{
	// Assinatura para ordens da primeira carteira
	_portfolio1OrdersSubscription = new Subscription(DataType.Transactions, _portfolio1);
	
	// Assinatura para ordens da segunda carteira
	_portfolio2OrdersSubscription = new Subscription(DataType.Transactions, _portfolio2);
	
	// Manipulador comum para recebimento de ordens
	Connector.OrderReceived += OnMultipleSubscriptionOrderReceived;
	
	// Iniciar assinaturas
	Connector.Subscribe(_portfolio1OrdersSubscription);
	Connector.Subscribe(_portfolio2OrdersSubscription);
}

private void OnMultipleSubscriptionOrderReceived(Subscription subscription, Order order)
{
	// Determinar a qual assinatura a ordem pertence
	if (subscription == _portfolio1OrdersSubscription)
	{
		// Processar ordens da primeira carteira
	}
	else if (subscription == _portfolio2OrdersSubscription)
	{
		// Processar ordens da segunda carteira
	}
}

Note

Esta abordagem avançada com várias subscrições de ordens deve ser usada apenas em casos excecionais, quando o mecanismo de subscrição padrão é insuficiente.

Natureza Assíncrona das Transações

O envio de transações (registo, substituição ou cancelamento de ordens) é efetuado de forma assíncrona. Isto permite que o programa de negociação não espere pela confirmação da bolsa e continue a funcionar, acelerando a reação a alterações na situação de mercado.

Para acompanhar o estado de uma ordem, é necessário subscrever os eventos correspondentes:

Ver Também