Table of Contents

Тиковые сделки

GUI TradeGrid

TradeGrid - таблица сделок.

Основные свойства

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

<Window x:Class="Sample.TradesWindow"
    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.Str985}" Height="284" Width="544">
    <xaml:TradeGrid x:Name="TradeGrid" x:FieldModifier="public" />
</Window>
public class TradesWindow
{
    private readonly Connector _connector;
    private readonly Security _security;
    private Subscription _tickSubscription;
    
    public TradesWindow(Connector connector, Security security)
    {
        InitializeComponent();
        
        _connector = connector;
        _security = security;
        
        // Подписываемся на событие получения тиковых сделок
        _connector.TickTradeReceived += OnTickReceived;
        
        // Создаем подписку на тиковые сделки
        _tickSubscription = new Subscription(DataType.Ticks, security);
        
        // Запускаем подписку
        _connector.Subscribe(_tickSubscription);
    }
    
    // Обработчик события получения тиковой сделки
    private void OnTickReceived(Subscription subscription, ITickTradeMessage tick)
    {
        // Проверяем, относится ли сделка к нашей подписке
        if (subscription != _tickSubscription)
            return;
            
        // Добавляем сделку в TradeGrid в потоке пользовательского интерфейса
        this.GuiAsync(() => TradeGrid.Trades.Add(tick));
    }
    
    // Метод для отписки при закрытии окна
    public void Unsubscribe()
    {
        if (_tickSubscription != null)
        {
            _connector.TickTradeReceived -= OnTickReceived;
            _connector.UnSubscribe(_tickSubscription);
            _tickSubscription = null;
        }
    }
}

Отображение собственных сделок

public class MyTradesWindow
{
    private readonly Connector _connector;
    
    public MyTradesWindow(Connector connector)
    {
        InitializeComponent();
        
        _connector = connector;
        
        // Подписываемся на событие получения собственных сделок
        _connector.OwnTradeReceived += OnOwnTradeReceived;
        
        // Создаем подписку на транзакционные данные
        var myTradesSubscription = new Subscription(DataType.Transactions, null);
        
        // Запускаем подписку
        _connector.Subscribe(myTradesSubscription);
    }
    
    // Обработчик события получения собственной сделки
    private void OnOwnTradeReceived(Subscription subscription, MyTrade myTrade)
    {
        // Добавляем собственную сделку в TradeGrid в потоке пользовательского интерфейса
        this.GuiAsync(() => TradeGrid.Trades.Add(myTrade));
    }
}

Получение исторических тиковых сделок

// Метод для получения исторических тиковых сделок
public void LoadHistoricalTicks(Security security, DateTime from, DateTime to)
{
    // Очищаем текущие сделки
    TradeGrid.Trades.Clear();
    
    // Создаем подписку на исторические тиковые сделки
    var historySubscription = new Subscription(DataType.Ticks, security)
    {
        MarketData =
        {
            // Указываем временной период для получения исторических данных
            From = from,
            To = to
        }
    };
    
    // Подписываемся на событие получения тиковых сделок
    _connector.TickTradeReceived += OnHistoricalTickReceived;
    
    // Запускаем подписку
    _connector.Subscribe(historySubscription);
}

// Обработчик события получения исторической тиковой сделки
private void OnHistoricalTickReceived(Subscription subscription, ITickTradeMessage tick)
{
    // Добавляем тик в TradeGrid в потоке пользовательского интерфейса
    this.GuiAsync(() => 
    {
        TradeGrid.Trades.Add(tick);
        
        // Обновляем статистику
        UpdateTradeStatistics();
    });
}

// Метод обновления статистики по сделкам
private void UpdateTradeStatistics()
{
    int totalTrades = TradeGrid.Trades.Count;
    decimal totalVolume = TradeGrid.Trades.Sum(t => t.Volume);
    decimal averagePrice = TradeGrid.Trades.Any() 
        ? TradeGrid.Trades.Average(t => t.Price)
        : 0;
    
    // Обновляем элементы интерфейса статистики
    TotalTradesLabel.Content = $"Всего сделок: {totalTrades}";
    TotalVolumeLabel.Content = $"Общий объем: {totalVolume}";
    AveragePriceLabel.Content = $"Средняя цена: {averagePrice:F2}";
}

Фильтрация сделок по объему

// Метод для фильтрации сделок по минимальному объему
public void FilterTicksByVolume(decimal minVolume)
{
    // Сохраняем значение фильтра
    _minVolumeFilter = minVolume;
    
    // Обновляем обработчик события получения тиковых сделок
    _connector.TickTradeReceived -= OnTickReceived;
    _connector.TickTradeReceived += OnFilteredTickReceived;
}

// Обработчик события получения тиковой сделки с фильтрацией по объему
private void OnFilteredTickReceived(Subscription subscription, ITickTradeMessage tick)
{
    // Проверяем, относится ли сделка к выбранному инструменту
    if (tick.SecurityId != _security.ToSecurityId())
        return;
        
    // Применяем фильтр по объему
    if (tick.Volume < _minVolumeFilter)
        return;
        
    // Добавляем сделку в TradeGrid в потоке пользовательского интерфейса
    this.GuiAsync(() => TradeGrid.Trades.Add(tick));
    
    // Если сделка крупная, можно выделить ее или подать уведомление
    if (tick.Volume >= _largeVolumeThreshold)
    {
        NotifyLargeVolumeTrade(tick);
    }
}

// Метод уведомления о крупной сделке
private void NotifyLargeVolumeTrade(ITickTradeMessage tick)
{
    // Выводим информацию о крупной сделке
    Console.WriteLine($"Крупная сделка: {tick.SecurityId}, {tick.ServerTime}, Цена: {tick.Price}, Объем: {tick.Volume}");
    
    // Можно добавить звуковое или визуальное уведомление
    this.GuiAsync(() => 
    {
        // Пример визуального выделения в списке
        var tradeItem = TradeGrid.Trades.LastOrDefault();
        if (tradeItem != null)
        {
            TradeGrid.SelectedTrade = tradeItem;
            HighlightTrade(tradeItem);
        }
    });
}