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

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

ib main window
  1. В самом начале необходимо создать экземпляр класса шлюза InteractiveBrokersTrader:

    C#
    Trader = new InteractiveBrokersTrader {
        Address = Address.Text.To<IPEndPoint>(),
    };
  2. Далее следует установить требуемые обработчики событий IConnector:

    C#
    // подписываемся на событие успешного соединения
    Trader.Connected += () =>
    {
        this.GuiAsync(() => ChangeConnectStatus(true));
    };
    
    // подписываемся на событие разрыва соединения
    Trader.ConnectionError += error => this.GuiAsync(() =>
    {
        ChangeConnectStatus(false);
        MessageBox.Show(this, error.ToString(), "Ошибка соединения");
    });
    
    // подписываемся на событие успешного отключения
    Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
    
    Trader.Error += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));
    Trader.NewSecurities += securities => this.GuiAsync(() => _securitiesWindow.AddSecurities(securities));
    Trader.NewTrades += trades =>this.GuiAsync(() => _tradesWindow.Trades.AddRange(trades));
    Trader.NewOrders +=orders => this.GuiAsync(() => _ordersWindow.Orders.AddRange(orders));
    Trader.NewMyTrades += trades => this.GuiAsync(() => _myTradesWindow.Trades.AddRange(trades));
    Trader.NewStopOrders += orders => this.GuiAsync(() => _conditionOrdersWindow.Orders.AddRange(orders));
    Trader.NewMarketDepths += _securitiesWindow.ProcessDepths;
    Trader.MarketDepthsChanged += _securitiesWindow.ProcessDepths;
    Trader.NewCandles += _securitiesWindow.AddHistoricalCandles;
    Trader.NewRealTimeCandle += _securitiesWindow.AddRealTimeCandle;
    
    Trader.NewPortfolios += portfolios =>
    {
        _portfoliosWindow.Portfolios.AddRange(portfolios);
        portfolios.ForEach(Trader.RegisterPortfolio);
    };
    Trader.NewPositions += positions => this.GuiAsync(() => _positionsWindow.Positions.AddRange(positions));
    
    // подписываемся на событие о неудачной регистрации заявок
    Trader.OrdersRegisterFailed += OrdersFailed;
    
    // подписываемся на событие о неудачном снятии заявок
    Trader.OrdersCancelFailed += OrdersFailed;
  3. Далее необходимо выполнить подключение к серверу Interactive Brokers:

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

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

    ib securities
    C#
    var criteria = new Security
    {
        Currency = CurrencyTypes.USD,
        Code = SecCode.Text,
        Type = (SecurityTypes)SecType.GetSelectedValue<SecurityTypes>(),
    };
    
    if (!BoardName.Text.IsEmpty())
    {
        criteria.ExchangeBoard = ExchangeBoard.GetBoard(BoardName.Text, code =>
            new ExchangeBoard
            {
                Code = code,
                Exchange = new Exchange
                {
                    Name = code
                }
            });
    }
    
    if (!ContractId.Text.IsEmpty())
        criteria.SetContractId(ContractId.Text.To<int>());
    
    MainWindow.Instance.Trader.LookupSecurities(criteria);

    Если инструментов с заданными критериями не будет найдено, то вернется ошибка через событие Error:

    ib security not found
  6. Для получения обновлений по выбранному инструменту необходимо вызвать метод RegisterSecurity(Security):

    C#
    Trader.RegisterSecurity(SelectedSecurity);
  7. Для запроса обновлений по стаканам необходимо воспользоваться методом RegisterMarketDepth(Security):

    C#
    private void QuotesClick(object sender, RoutedEventArgs e)
    {
        if (Quotes.IsChecked == true)
        {
            // создаем окно со стаканом
            var wnd = new QuotesWindow { Title = SelectedSecurity.Code + " котировки" };
            _quotesWindows.Add(SelectedSecurity, wnd);
    
            // начинаем получать котировки стакана
            Trader.RegisterMarketDepth(SelectedSecurity);
    
            wnd.Show();
        }
        else
        {
            Trader.UnRegisterMarketDepth(SelectedSecurity);
    
            var wnd = _quotesWindows[SelectedSecurity];
            _quotesWindows.Remove(SelectedSecurity);
            wnd.Close();
        }
    }
    ib market depth
  8. Для регистрации заявок предусмотрена кнопка «Новая заявка». Метод RegisterOrder(Order) отправляет заявку на сервер:

    C#
    private void Send_Click(object sender, RoutedEventArgs e)
    {
        var order = new Order
        {
            Type = IsMarket.IsChecked == true ? OrderTypes.Market : OrderTypes.Limit,
            Portfolio = Portfolio.SelectedPortfolio,
            Volume = Volume.Text.To<decimal>(),
            Price = Price.Text.To<decimal>(),
            Security = Security,
            Direction = IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
        };
    
        MainWindow.Instance.Trader.RegisterOrder(order);
    
        DialogResult = true;
    }