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

Пример использования Quik Lua

Пример работы с QuikTrader демонстрирует приложение SampleQuik, показанное на рисунке ниже.

Quik Lua First Strategy

Примечание Примечание

Исходный код данного примера доступен в дистрибутиве в каталоге Samples/SampleQuik.

Внимание Внимание

Проверьте, что терминал Quik настроен корректно для работы с QuikTrader - см. Настройка Quik Lua.

Пример работы с Quik Lua

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

    C#
    // создаем подключение и указываем логин и пароль
    Trader = new QuikTrader
    {
        LuaFixServerAddress = Address.Text.To<EndPoint>(),
        LuaLogin = Login.Text,
        LuaPassword = Password.Password.To<SecureString>(),
        LogLevel = LogLevels.Debug
    };
  2. Создаем обработчики событий IConnector:

    C#
    // отключение автоматического запроса всех инструментов.
    Trader.RequestAllSecurities = AllSecurities.IsChecked == true;
    
    // возводим флаг, что соединение установлено
    _isConnected = true;
    
    // переподключение будет работать только во время работы биржи РТС
    // (чтобы отключить переподключение когда торгов нет штатно, например, ночью)
    Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
    
    // подписываемся на событие об успешном восстановлении соединения
    Trader.Restored += () => this.GuiAsync(() => MessageBox.Show(this, LocalizedStrings.Str2958));
    
    // подписываемся на событие разрыва соединения
    Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));
    
    // подписываемся на ошибку обработки данных (транзакций и маркет)
    Trader.Error += error =>this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));
    
    // подписываемся на ошибку подписки маркет-данных
    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.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail;
    Trader.OrderCancelFailed += fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, "Ошибка отмены заявки"));
    Trader.StopOrderRegisterFailed += _stopOrdersWindow.OrderGrid.AddRegistrationFail;
    Trader.StopOrderCancelFailed += fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, "Ошибка отмены стоп заявки"));
    Trader.NewPortfolio += portfolio => _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio);
    Trader.NewPosition += position => _portfoliosWindow.PortfolioGrid.Positions.Add(position);
    
    Trader.MassOrderCancelFailed += (transId, error) =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str716));
    
    // устанавливаем поставщик маркет-данных
    _securitiesWindow.SecurityPicker.MarketDataProvider = Trader;
  3. Выполняем подключение:

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

  5. Для получения обновлений по выбранному инструменту и тиков необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(Security) соответственно:

    C#
    private void Level1Click(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 =>
        {
            //// начинаем получать котировки стакана
            trader.RegisterMarketDepth(security);
    
            // создаем окно со стаканом
            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. Для регистрации заявок используется метод 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);
    }
См. также