Для изменения размера нажмите или перетащите

Пример работы с OECTrader

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

OECTrader Main Window
  1. В самом начале необходимо создать экземпляр класса шлюза OpenECryTrader:

    C#
    Trader = new OpenECryTrader {
        Login = Login.Text, 
        Password = Password.Password,
        Address = address,
        EnableOECLogging = true
    };
  2. Далее следует установить требуемые обработчики событий IConnector:

    C#
    // подписываемся на событие успешного соединения
    Trader.Connected += () =>
    {
        // возводим флаг, что соединение установлено
        _isConnected = true;
    
        // разблокируем кнопку Экспорт
        this.GuiAsync(() => ChangeConnectStatus(true));
    
        // запускаем подписку на новости
        Trader.RegisterNews();
    
    };
    
    // подписываемся на событие разрыва соединения
    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.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 =>
    {
        _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio);
        // подписываемся на обновление портфеля
        Trader.RegisterPortfolio(portfolio);
    };
    
    // событие получения новых позиций
    Trader.NewPosition += position => _portfoliosWindow.PortfolioGrid.Positions.Add(position);
    
    // событие неудачной регистрации заявок
    Trader.OrdersRegisterFailed += OrdersFailed;
    // событие неудачного снятия заявок
    Trader.OrdersCancelFailed += OrdersFailed;
    // событие неудачной регистрации стоп-заявок
    Trader.StopOrdersRegisterFailed += OrdersFailed;
    // событие неудачного снятия стоп-заявок
    Trader.StopOrdersCancelFailed += OrdersFailed;
    Trader.NewNews += news => _newsWindow.NewsPanel.NewsGrid.News.Add(news);
  3. Далее необходимо выполнить подключение к серверу OEC:

    C#
    Trader.Connect();

    После подключения можно ожидать срабатывания событий:

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

    OECTrader Security
    C#
    private void FindClick(object sender, RoutedEventArgs e)
    {
        var wnd = new SecurityLookupWindow { Criteria = new Security { Code = "ES" } };
        if (!wnd.ShowModal(this)) return;
    
        MainWindow.Instance.Trader.LookupSecurities(wnd.Criteria);
    }
  5. Для получения обновлений по выбранному инструменту и тикам необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(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);
        }
    }
  6. Для запроса обновлений по стаканам необходимо воспользоваться методом 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)
        {
            TraderOnMarketDepthChanged(trader.GetMarketDepth(SecurityPicker.SelectedSecurity));
            trader.MarketDepthChanged += TraderOnMarketDepthChanged;
            _initialized = true;
        }
  7. Для получения обновлений по портфелям используется метод RegisterPortfolio(Portfolio):

    C#
    Trader.NewPortfolio += portfolio =>
    {
        _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio);
        // подписываемся на обновление портфеля
        Trader.RegisterPortfolio(portfolio);
    };
  8. Для регистрации заявок предусмотрена кнопка «Новая заявка». Метод RegisterOrder(Order) отправляет заявку на сервер:

    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);
    }