Click or drag to resize

Getting started

The SampleFix application shows an example of working with the FixTrader as shown in the figure below. The example source code is in the Samples/Fix folder of the installation package.

Fix Sample
  1. First, you need to create an instance of the FixTrader:

    C#
    public FixTrader Trader = new FixTrader();
  2. Loading connector's settings from the xml file:

    C#
    if (File.Exists(_settingsFile))
    {
        Trader.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));
    }
  3. Next, you should subscribe on required IConnector events:

    C#
    // subscribe on connection successfully event
    Trader.Connected += () =>
    {
        this.GuiAsync(() => ChangeConnectStatus(true));
    };
    Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
    
    // subscribe on connection error event
    Trader.ConnectionError += error => this.GuiAsync(() =>
    {
        // update gui labes
        ChangeConnectStatus(false);
    
        MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
    });
    
    // subscribe on error event
    Trader.Error += error =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
    
    // subscribe on error of market data subscription event
    Trader.MarketDataSubscriptionFailed += (security, msg, error) =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, security)));
    
    Trader.NewSecurity += security => _securitiesWindow.SecurityPicker.Securities.Add(security);
    Trader.NewMyTrade += trade => _myTradesWindow.TradeGrid.Trades.Add(trade);
    Trader.NewTrade += trade => _tradesWindow.TradeGrid.Trades.Add(trade);
    Trader.NewOrder += order => _ordersWindow.OrderGrid.Orders.Add(order);
    Trader.NewStopOrder += order => _stopOrdersWindow.OrderGrid.Orders.Add(order);
    
    Trader.NewPortfolio += portfolio =>
    {
        // subscribe on portfolio updates
        //portfolios.ForEach(Trader.RegisterPortfolio);
    
        _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio);
    };
    Trader.NewPosition += position => _portfoliosWindow.PortfolioGrid.Positions.Add(position);
    
    // subscribe on error of order registration event
    Trader.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail;
    // subscribe on error of order cancelling event
    Trader.OrderCancelFailed += OrderFailed;
    
    // subscribe on error of stop-order registration event
    Trader.StopOrderRegisterFailed += _stopOrdersWindow.OrderGrid.AddRegistrationFail;
    // subscribe on error of stop-order cancelling event
    Trader.StopOrderCancelFailed += OrderFailed;
    
    Trader.MassOrderCancelFailed += (transId, error) =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str716));
    
    Trader.NewNews += news => _newsWindow.NewsPanel.NewsGrid.News.Add(news);
  4. Finally, you need to connect to FIX server:

    C#
    Trader.Connect();
  5. Once connected, you can expect to trigger events:

  6. Instruments search (in more detail):

    Fix Securities
    C#
    private void FindClick(object sender, RoutedEventArgs e)
    {
        var wnd = new SecurityLookupWindow { Criteria = new Security { Code = "AAPL" } };
    
        if (!wnd.ShowModal(this))
            return;
    
        MainWindow.Instance.Trader.LookupSecurities(wnd.Criteria);
    }
  7. For updates on the selected instrument and ticks you need to use the RegisterTrades(Security) and RegisterSecurity(Security) methods, respectively:

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

    Transactions will come in the event IConnectorNewTrade, and changes in the event IConnectorSecuritiesChanged.

  8. To request updates on the order books you need to use the RegisterMarketDepth(Security) method:

    C#
    private void DepthClick(object sender, RoutedEventArgs e)
    {
        var trader = MainWindow.Instance.Trader;
    
        foreach (var security in SecurityPicker.SelectedSecurities)
        {
            var window = _quotesWindows.SafeAdd(security, s =>
            {
                // 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)
            {
                TraderOnMarketDepthChanged(trader.GetMarketDepth(security));
                trader.MarketDepthChanged += TraderOnMarketDepthChanged;
                _initialized = true;
            }
        }
    }
  9. For orders registration the New Order button used. The RegisterOrder(Order) method sends an order to the server:

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