Table of Contents

Состояния заявок

StockSharp API предоставляет возможность получать информацию о заявках посредством встроенного механизма подписок. Как и с рыночными данными, для транзакционной информации используется единый подход, основанный на Subscription.

События, связанные с заявками

Connector предоставляет следующие события для обработки информации по заявкам:

Событие Описание
OrderReceived Событие получения информации о заявке
OrderRegisterFailReceived Событие ошибки регистрации заявки
OrderCancelFailReceived Событие ошибки отмены заявки
OrderEditFailReceived Событие ошибки редактирования заявки
OwnTradeReceived Событие получения информации о собственной сделке

OrderStates enum

Заявка во время своей жизни проходит следующие состояния:

OrderStates

  • OrderStates.None - заявка была создана в роботе и еще не была отправлена на регистрацию.
  • OrderStates.Pending - заявка была отправлена на регистрацию (RegisterOrder. Для заявки ожидается подтверждение ее принятия от биржи. В случае успеха принятия будет вызвано событие OrderReceived, и заявка будет переведена в состояние OrderStates.Active. Также будут проинициализированы свойства Order.Id и Order.ServerTime. В случае отвержения заявки будет вызвано событие OrderRegisterFailReceived с описанием ошибки, и заявка будет переведена в состояние OrderStates.Failed.
  • OrderStates.Active - заявка активна на бирже. Такая заявка будет активна до тех пор, пока не исполнится весь ее выставленный объем Order.Volume, или она не будет снята принудительно через [CancelOrder](xref:StockSharp.BusinessEntities.ITransactionProvider.CancelOrder(StockSharp.BusinessEntities.Order). Если заявка исполняется частично, то вызываются события OwnTradeReceived о новых сделках по выставленной заявке, а так же событие OrderReceived, где передается уведомление об изменении баланса по заявке Order.Balance. Последнее событие будет выведено и в случае отмены заявки.
  • OrderStates.Done - заявка более не активна на бирже (была полностью исполнена или снята).
  • OrderStates.Failed - заявка не была принята биржей (или промежуточной системой, как, например, серверная часть торговой платформы) по какой-либо причине.

Автоматические подписки

По умолчанию Connector автоматически создает подписки на транзакционную информацию при подключении (SubscriptionsOnConnect). Это включает подписки на:

  • Информацию о заявках
  • Информацию о сделках
  • Информацию о позициях
  • Базовый поиск инструментов

Пример обработки события получения заявки:

private void InitConnector()
{
    // Подписка на событие получения заявки
    Connector.OrderReceived += OnOrderReceived;
    
    // Подписка на событие получения собственной сделки
    Connector.OwnTradeReceived += OnOwnTradeReceived;
    
    // Подписка на событие ошибки регистрации заявки
    Connector.OrderRegisterFailReceived += OnOrderRegisterFailed;
}

private void OnOrderReceived(Subscription subscription, Order order)
{
    // Обработка полученной заявки
    _ordersWindow.OrderGrid.Orders.TryAdd(order);
    
    // Важно! Проверяем, относится ли заявка к текущей подписке
    // чтобы избежать дублирования обработки
    if (subscription == _myOrdersSubscription)
    {
        // Дополнительная обработка для конкретной подписки
        Console.WriteLine($"Заявка: {order.TransactionId}, Состояние: {order.State}");
    }
}

Ручное создание подписок на заявки

В некоторых случаях может потребоваться явно запросить информацию о заявках. Для этого можно создать отдельные подписки:

// Создаем подписку на заявки по конкретному портфелю
var ordersSubscription = new Subscription(DataType.Transactions, portfolio)
{
    TransactionId = Connector.TransactionIdGenerator.GetNextId(),
};

// Обработчик получения заявок
Connector.OrderReceived += (subscription, order) =>
{
    if (subscription == ordersSubscription)
    {
        Console.WriteLine($"Заявка: {order.TransactionId}, Состояние: {order.State}, Портфель: {order.Portfolio.Name}");
    }
};

// Запускаем подписку
Connector.Subscribe(ordersSubscription);

Проверка состояния заявок

Для определения текущего состояния заявки используются методы-расширения:

// Проверка состояния заявки
Order order = ...; // полученная заявка

// Отменена ли заявка
bool isCanceled = order.IsCanceled();

// Исполнена ли заявка полностью
bool isMatched = order.IsMatched();

// Исполнена ли заявка частично
bool isPartiallyMatched = order.IsMatchedPartially();

// Исполнена ли хотя бы часть заявки
bool isNotEmpty = order.IsMatchedEmpty();

// Получить исполненный объем
decimal matchedVolume = order.GetMatchedVolume();

Расширенный подход: работа с несколькими подписками

В сложных сценариях может потребоваться работа с несколькими подписками на заявки одновременно. В этом случае важно правильно обрабатывать события, чтобы избежать дублирования:

private Subscription _portfolio1OrdersSubscription;
private Subscription _portfolio2OrdersSubscription;

private void RequestOrdersForDifferentPortfolios()
{
    // Подписка на заявки по первому портфелю
    _portfolio1OrdersSubscription = new Subscription(DataType.Transactions, _portfolio1);
    
    // Подписка на заявки по второму портфелю
    _portfolio2OrdersSubscription = new Subscription(DataType.Transactions, _portfolio2);
    
    // Общий обработчик получения заявок
    Connector.OrderReceived += OnMultipleSubscriptionOrderReceived;
    
    // Запускаем подписки
    Connector.Subscribe(_portfolio1OrdersSubscription);
    Connector.Subscribe(_portfolio2OrdersSubscription);
}

private void OnMultipleSubscriptionOrderReceived(Subscription subscription, Order order)
{
    // Определяем, к какой подписке относится заявка
    if (subscription == _portfolio1OrdersSubscription)
    {
        // Обработка заявок первого портфеля
    }
    else if (subscription == _portfolio2OrdersSubscription)
    {
        // Обработка заявок второго портфеля
    }
}
Note

Такой продвинутый подход с несколькими подписками на заявки следует использовать только в исключительных случаях, когда стандартного механизма подписок недостаточно.

Асинхронная природа транзакций

Отправка транзакций (регистрация, замена или отмена заявок) выполняется в асинхронном режиме. Это позволяет торговой программе не ожидать подтверждения от биржи, а продолжать работу, что ускоряет реакцию на изменения рыночной ситуации.

Для отслеживания статуса заявки необходимо подписаться на соответствующие события:

См. также