Table of Contents

Лог заявок

GUI orderlog

OrderLogGrid - графический компонент для отображения лога заявок (OrderLogItem).

Основные свойства и методы

Ниже показаны фрагменты кода с его использованием:

<Window x:Class="SampleITCH.OrdersLogWindow"
        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.OrderLog}" Height="750" Width="900">
    <xaml:OrderLogGrid x:Name="OrderLogGrid" x:FieldModifier="public" />
</Window>
public class OrderLogWindow
{
    private readonly Connector _connector;
    private readonly Security _security;
    private Subscription _orderLogSubscription;
    
    public OrderLogWindow(Connector connector, Security security)
    {
        InitializeComponent();
        
        _connector = connector;
        _security = security;
        
        // Подписываемся на событие получения элементов лога заявок
        _connector.OrderLogItemReceived += OnOrderLogItemReceived;
        
        // Создаем подписку на лог заявок
        _orderLogSubscription = new Subscription(DataType.OrderLog, security);
        
        // Запускаем подписку
        _connector.Subscribe(_orderLogSubscription);
    }
    
    // Обработчик события получения элемента лога заявок
    private void OnOrderLogItemReceived(Subscription subscription, OrderLogItem item)
    {
        // Проверяем, относится ли элемент лога к нашей подписке
        if (subscription != _orderLogSubscription)
            return;
            
        // Добавляем элемент в OrderLogGrid в потоке пользовательского интерфейса
        this.GuiAsync(() => OrderLogGrid.LogItems.Add(item));
    }
    
    // Метод для отписки при закрытии окна
    public void Unsubscribe()
    {
        if (_orderLogSubscription != null)
        {
            _connector.OrderLogItemReceived -= OnOrderLogItemReceived;
            _connector.UnSubscribe(_orderLogSubscription);
            _orderLogSubscription = null;
        }
    }
}

Фильтрация лога заявок

// Создание подписки на лог заявок с фильтрацией
public void SubscribeOrderLog(Security security, DateTime from, DateTime to)
{
    // Создаем подписку на лог заявок
    var orderLogSubscription = new Subscription(DataType.OrderLog, security)
    {
        MarketData =
        {
            // Указываем временной период для получения исторических данных
            From = from,
            To = to
        }
    };
    
    // Подписываемся на событие получения элементов лога заявок
    _connector.OrderLogItemReceived += OnFilteredOrderLogItemReceived;
    
    // Запускаем подписку
    _connector.Subscribe(orderLogSubscription);
}

// Обработчик события получения элемента лога заявок с фильтрацией
private void OnFilteredOrderLogItemReceived(Subscription subscription, OrderLogItem item)
{
    // Проверяем тип подписки
    if (subscription.DataType != DataType.OrderLog)
        return;
        
    // Фильтруем по цене (пример)
    if (item.Price < _minPrice || item.Price > _maxPrice)
        return;
        
    // Добавляем элемент в OrderLogGrid в потоке пользовательского интерфейса
    this.GuiAsync(() => 
    {
        OrderLogGrid.LogItems.Add(item);
        
        // Ограничиваем количество отображаемых элементов
        while (OrderLogGrid.LogItems.Count > _maxItems)
            OrderLogGrid.LogItems.RemoveAt(0);
    });
}

Анализ динамики лога заявок

// Класс для анализа динамики лога заявок
public class OrderLogAnalyzer
{
    private readonly Connector _connector;
    private readonly Security _security;
    private readonly OrderLogGrid _orderLogGrid;
    
    // Счетчики для анализа
    private int _buyCount = 0;
    private int _sellCount = 0;
    private decimal _buyVolume = 0;
    private decimal _sellVolume = 0;
    
    public OrderLogAnalyzer(Connector connector, Security security, OrderLogGrid orderLogGrid)
    {
        _connector = connector;
        _security = security;
        _orderLogGrid = orderLogGrid;
        
        // Подписываемся на событие получения элементов лога заявок
        _connector.OrderLogItemReceived += OnOrderLogItemReceived;
        
        // Создаем подписку на лог заявок
        var subscription = new Subscription(DataType.OrderLog, security);
        
        // Запускаем подписку
        _connector.Subscribe(subscription);
    }
    
    // Обработчик события получения элемента лога заявок
    private void OnOrderLogItemReceived(Subscription subscription, OrderLogItem item)
    {
        if (item.SecurityId != _security.ToSecurityId())
            return;
            
        // Анализируем элемент лога заявок
        if (item.Side == Sides.Buy)
        {
            _buyCount++;
            _buyVolume += item.Volume;
        }
        else if (item.Side == Sides.Sell)
        {
            _sellCount++;
            _sellVolume += item.Volume;
        }
        
        // Обновляем интерфейс с результатами анализа
        this.GuiAsync(() => 
        {
            // Добавляем элемент в OrderLogGrid
            _orderLogGrid.LogItems.Add(item);
            
            // Обновляем статистику
            UpdateStatistics();
        });
    }
    
    // Обновление статистики
    private void UpdateStatistics()
    {
        BuyCountLabel.Content = $"Покупки: {_buyCount}";
        SellCountLabel.Content = $"Продажи: {_sellCount}";
        BuyVolumeLabel.Content = $"Объем покупок: {_buyVolume}";
        SellVolumeLabel.Content = $"Объем продаж: {_sellVolume}";
        
        // Вычисляем дисбаланс
        var volumeImbalance = _buyVolume - _sellVolume;
        var imbalancePercent = (_buyVolume + _sellVolume) > 0 
            ? volumeImbalance / (_buyVolume + _sellVolume) * 100 
            : 0;
            
        ImbalanceLabel.Content = $"Дисбаланс: {volumeImbalance:F2} ({imbalancePercent:F2}%)";
    }
}