Для изменения размера нажмите или перетащите
Пример работы с FixTrader

Пример работы с FixTrader демонстрирует приложение SampleFix, показанное на рисунке ниже. Исходные коды примера лежат в дистрибутиве в папке Samples/Fix.

Fix Sample
  1. В самом начале необходимо создать экземпляр класса шлюза FixTrader:

    C#
    // создаем шлюз
    public FixTrader Trader = new FixTrader();
  2. Затем загружаем настройки из xml файла.:

    C#
    if (File.Exists(_settingsFile))
    {
        Trader.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));
    }
  3. Устанавливаем необходимые обработчики событий IConnector:

    C#
    Trader.Restored += () => this.GuiAsync(() =>
    {
        // разблокируем кнопки
        ChangeConnectStatus(true);
        MessageBox.Show(this, LocalizedStrings.Str2958);
    });
    
    // подписываемся на событие успешного соединения
    Trader.Connected += () =>
    {
        this.GuiAsync(() => ChangeConnectStatus(true));
    };
    
    Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
    
    // подписываемся на событие разрыва соединения
    Trader.ConnectionError += error => this.GuiAsync(() =>
    {
        // разблокируем кнопки
        ChangeConnectStatus(false);
    
        MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
    });
    
    // подписываемся на ошибку обработки данных (транзакций и маркет)
    Trader.Error += error =>
                this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
    
    // подписываемся на событие ошибки получения рыночных данных
    Trader.MarketDataSubscriptionFailed += (security, type, error) =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security)));
    
    Trader.NewSecurities += securities => _securitiesWindow.SecurityPicker.Securities.AddRange(securities);
    Trader.NewMyTrades += trades => _myTradesWindow.TradeGrid.Trades.AddRange(trades);
    Trader.NewTrades += trades => _tradesWindow.TradeGrid.Trades.AddRange(trades);
    Trader.NewOrders += orders => _ordersWindow.OrderGrid.Orders.AddRange(orders);
    Trader.NewStopOrders += orders => _stopOrdersWindow.OrderGrid.Orders.AddRange(orders);
    
    Trader.NewPortfolios += portfolios =>
    {
        // регистрирует портфели на обновление данных
        portfolios.ForEach(Trader.RegisterPortfolio);
    
        _portfoliosWindow.PortfolioGrid.Portfolios.AddRange(portfolios);
    };
    
    Trader.NewPositions += positions => _portfoliosWindow.PortfolioGrid.Positions.AddRange(positions);
    
    // подписываемся на событие о неудачной регистрации заявок
    Trader.OrdersRegisterFailed += OrdersFailed;
    
    // подписываемся на событие о неудачном снятии заявок
    Trader.OrdersCancelFailed += OrdersFailed;
    
    // подписываемся на событие о неудачной регистрации стоп-заявок
    Trader.StopOrdersRegisterFailed += OrdersFailed;
    
    // подписываемся на событие о неудачном снятии стоп-заявок
    Trader.StopOrdersCancelFailed += OrdersFailed;
    
    // подписываемся на событие поступления новостей
    Trader.NewNews += news => _newsWindow.NewsPanel.NewsGrid.News.Add(news);
  4. Далее выполняем подключение к серверу FIX:

    C#
    Trader.Connect();
  5. После подключения можно ожидать срабатывания событий:

  6. Поиск инструментов (подробнее):

    Fix Securities
    C#
    var criteria = new Security
    {
        Currency = CurrencyTypes.USD,
        Code = SecCode.Text
    };
    
    MainWindow.Instance.Trader.LookupSecurities(criteria);
  7. Для получения сделок и изменений по выбранному инструменту (кнопка Бид-Оффер) необходимо вызвать методы RegisterTrades(Security) и RegisterSecurity(Security) соответственно:

    C#
    private void QuotesClick(object sender, RoutedEventArgs e)
    {
        var security = SecurityPicker.SelectedSecurity;
        var trader = MainWindow.Instance.Trader;
    
        if (trader.RegisteredSecurities.Contains(security))
        {
            trader.UnRegisterSecurity(security);
            trader.UnRegisterTrades(security);
        }
        else
        {
            trader.RegisterSecurity(security);
            trader.RegisterTrades(security);
        }
    }

    Сделки будут приходить в событии IConnectorNewTrades, а изменения в событии IConnectorSecuritiesChanged.

  8. Для запроса обновлений по стаканам необходимо воспользоваться методом RegisterMarketDepth(Security):

    C#
    private void DepthClick(object sender, RoutedEventArgs e)
    {
        var trader = MainWindow.Instance.Trader;
    
        var window = _quotesWindows.SafeAdd(SecurityPicker.SelectedSecurity, security =>
        {
            // subscribe on order book flow
            trader.RegisterMarketDepth(security);
    
            // create order book window
            var wnd = new QuotesWindow { Title = security.Id + " " + LocalizedStrings.MarketDepth };
            wnd.MakeHideable();
            return wnd;
        });
    
        if (window.Visibility == Visibility.Visible)
            window.Hide();
        else
            window.Show();
    
        if (!_initialized)
        {
            TraderOnMarketDepthsChanged(new[] { trader.GetMarketDepth(SecurityPicker.SelectedSecurity) });
            trader.MarketDepthsChanged += TraderOnMarketDepthsChanged;
            _initialized = true;
        }
    }
  9. Для регистрации заявок предусмотрена кнопка Новая заявка. Метод RegisterOrder(Order) отправляет заявку на сервер:

    C#
    private void NewOrderClick(object sender, RoutedEventArgs e)
    {
        var newOrder = new OrderWindow
        {
            Order = new Order { Security = SecurityPicker.SelectedSecurity },
            Connector = MainWindow.Instance.Trader,
        };
    
        if (newOrder.ShowModal(this))
            MainWindow.Instance.Trader.RegisterOrder(newOrder.Order);
    }