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

Множество подключений

S# имеет механизм для работы одновременно с несколькими соединениями (коннекторами). Например, робот может одновременно вести торговлю через Quik и SmartCOM, или работать с несколькими терминалами Quik. Этот механизм реализован на уровне сообщений. (см. Сообщения). За кулисами механизма лежит использование класса BasketMessageAdapter, который позволяет последовательно оперировать несколькими адаптерами, связанными с различными торговыми системами. Класс Connector имеет свойство Adapter этого типа.

Организовать работу с несколькими коннекторами можно загрузив настойки из специального конфигурационного файла, в котором сохранены настройки коннектора, в том числе настройки адаптеров, или ли же можно воспользоваться компонентом ConnectorWindow, который является графическим сервисом для конфигурации коннектора.

Ниже показан пример создания множественного подключения. Исходные коды примера находятся в проекте Samples/Common/SampleMultiConnection.

multiconnection main

Создание множественного подключения

  1. В конструкторе главного окна вызываем метод InitConnector, в котором выполняется конфигурирование коннектора, а также подписка на необходимые события.

    C#
    public MainWindow()
    {
        InitializeComponent();
        Instance = this;
    
        Title = Title.Put("Multi connection");
    
        _ordersWindow.MakeHideable();
        _myTradesWindow.MakeHideable();
        _tradesWindow.MakeHideable();
        _securitiesWindow.MakeHideable();
        _stopOrdersWindow.MakeHideable();
        _portfoliosWindow.MakeHideable();
    
        var logManager = new LogManager();
        logManager.Listeners.Add(new FileLogListener("sample.log"));
    
        var entityRegistry = new CsvEntityRegistry("Data");
    
        ConfigManager.RegisterService<IEntityRegistry>(entityRegistry);
        // ecng.serialization invoke in several places IStorage obj
        ConfigManager.RegisterService(entityRegistry.Storage);
    
        var storageRegistry = ConfigManager.GetService<IStorageRegistry>();
    
        SerializationContext.DelayAction = entityRegistry.DelayAction = new DelayAction(entityRegistry.Storage, ex => ex.LogError());
    
        Connector = new Connector(entityRegistry, storageRegistry);
        logManager.Sources.Add(Connector);
    
        InitConnector(entityRegistry);
    }
  2. В методе InitConnector выполняется подписка на события коннектора, а также загрузка настроек коннектора из конфигурационного файла при помощи метода ConnectorLoad(SettingsStorage).

    C#
    private void InitConnector(CsvEntityRegistry entityRegistry)
    {
        // subscribe on connection successfully event
        Connector.Connected += () =>
        {
            this.GuiAsync(() => ChangeConnectStatus(true));
        };
    
        // subscribe on connection error event
        Connector.ConnectionError += error => this.GuiAsync(() =>
        {
            ChangeConnectStatus(false);
            MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
        });
    
        Connector.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
    
        // subscribe on error event
        Connector.Error += error =>
            this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
    
        // subscribe on error of market data subscription event
        Connector.MarketDataSubscriptionFailed += (security, msg, error) =>
            this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, security)));
    
        Connector.NewSecurity += security => _securitiesWindow.SecurityPicker.Securities.Add(security);
        Connector.NewTrade += trade => _tradesWindow.TradeGrid.Trades.Add(trade);
    
        Connector.NewOrder += order => _ordersWindow.OrderGrid.Orders.Add(order);
        Connector.NewStopOrder += order => _stopOrdersWindow.OrderGrid.Orders.Add(order);
        Connector.NewMyTrade += trade => _myTradesWindow.TradeGrid.Trades.Add(trade);
    
        Connector.NewPortfolio += portfolio => _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio);
        Connector.NewPosition += position => _portfoliosWindow.PortfolioGrid.Positions.Add(position);
    
        // subscribe on error of order registration event
        Connector.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail;
        // subscribe on error of order cancelling event
        Connector.OrderCancelFailed += OrderFailed;
    
        // subscribe on error of stop-order registration event
        Connector.OrderRegisterFailed += _stopOrdersWindow.OrderGrid.AddRegistrationFail;
        // subscribe on error of stop-order cancelling event
        Connector.StopOrderCancelFailed += OrderFailed;
    
        // set market data provider
        _securitiesWindow.SecurityPicker.MarketDataProvider = Connector;
    
        try
        {
            if (File.Exists(_settingsFile))
                Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));
        }
        catch
        {
        }
    
        if (Connector.StorageAdapter == null)
            return;
    
        try
        {
            entityRegistry.Init();
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.ToString());
        }
    
        Connector.StorageAdapter.DaysLoad = TimeSpan.FromDays(3);
        Connector.StorageAdapter.Load();
    
        ConfigManager.RegisterService<IExchangeInfoProvider>(new StorageExchangeInfoProvider(entityRegistry));
    }
  3. Ниже показан код обработчика события Click кнопки Настройки. В обработчике вызывается метод Configure(Connector, Window). Этот метод открывает окно Настройки подключений (см. ниже). Также в обработчике выполняется сохранение настроек коннектора в конфигурационный файл. Этот файл в последующем можно использовать для конфигурирования коннектора без вызова окна Настроек подключения.

    C#
    private void SettingsClick(object sender, RoutedEventArgs e)
    {
        if (Connector.Configure(this))
            new XmlSerializer<SettingsStorage>().Serialize(Connector.Save(), _settingsFile);
    }
  4. Здесь представлено окно настройки подключений. Из раскрывающегося списка (открывается кнопкой '+') необходимо выбрать нужные адаптеры и настроить их свойства в окне свойств, расположенном справа. Например, для SmartCOM нужно указать адрес сервера, логин и пароль. Для работы с несколькими Quik будет нужно указать адреса серверов Lua.

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

    Корректность подключения можно проверить при помощи кнопки Проверить.

    Результатом работы этого окна будет создание и добавление адаптеров в список внутренних адаптеров свойства ConnectorAdapter.