Click or drag to resize

Getting started

The application SampleBlackwood shows an example of working with BlackwoodTrader, as shown in the figure below. The example source code is in the Samples/Blackwood folder of the installation package.

blackwood main window
  1. First, you need to create an instance of the BlackwoodTrader:

    C#
    var address = Address.Text.To<IPAddress>();
    
    Trader = new BlackwoodTrader
    {
        Login = Login.Text,
        Password = Password.Password,
        ExecutionAddress = new IPEndPoint(address, BlackwoodAddresses.ExecutionPort),
        MarketDataAddress = new IPEndPoint(address, BlackwoodAddresses.MarketDataPort),
        HistoricalDataAddress = new IPEndPoint(address, BlackwoodAddresses.HistoricalDataPort),
    };
  2. Then you should to subscribe on required IConnector events:

    C#
    // subscribe on connection successfully event
    Trader.Connected += () =>
    {
        // set flag (connection is established)
        _isConnected = true;
    
        // update gui labes
        this.GuiAsync(() => ChangeConnectStatus(true));
    
        Trader.RegisterNews();
    
        Trader.SubscribeHighLow(true);
    
        Trader.SubscribeImbalance();
        Trader.SubscribeCrossLock();
        Trader.RequestPreMarketIndications();
    };
    
    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
        Trader.RegisterPortfolio(portfolio);
    
        _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);
  3. Then you need to connect to Blackwood server:

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

  5. Instruments search (in more detail):

    blackwood 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);
    }
  6. For updates on the selected instrument you need to call RegisterSecurity(Security) method:

    C#
    Trader.RegisterSecurity(SelectedSecurity);
  7. To request updates on the order books you need to use the RegisterMarketDepth(Security) method:

    C#
    private void Level2Click(object sender, RoutedEventArgs e)
    {
        foreach (var security in SecurityPicker.SelectedSecurities)
        {
            ShowLevel1(security);
    
            // subscribe on order book flow
            MainWindow.Instance.Trader.RegisterMarketDepth(security);
        }
    }
    blackwood market depth
  8. 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);
    }