Click or drag to resize

Connectors

Для работы с биржами и источниками данных в S# рекомендуется работать через базовый класс Connector.

Рассмотрим работу с Connector. Исходные коды примера находятся в проекте Samples/Common/SampleConnection.

multiconnection main

Создаём экземпляр класса Connector:

C#
...
public Connector Connector;
...
public MainWindow()
{
    InitializeComponent();

    Connector = new Connector();
    InitConnector();
}

Для конфигурирования Connector у S#.API есть специальный графический интерфейс, в котором можно настроить сразу несколько подключений одновременно. Как им воспользоваться описано в пункте Graphical configuration.

C#
...
private const string _connectorFile = "ConnectorFile";
...
private void Setting_Click(object sender, RoutedEventArgs e)
{
    if (Connector.Configure(this))
    {
        new XmlSerializer<SettingsStorage>().Serialize(Connector.Save(), _connectorFile);
    }
}
API GUI Connector Window

Аналогично можно добавлять подключения напрямую из кода (без графических окон), воспользовавшись методом расширением TraderHelperAddAdapterTAdapter(Connector, ActionTAdapter):

C#
...
// добавляем два подключения к QUIK (цены и заявки)
connector.AddAdapter<LuaFixMarketDataMessageAdapter>(a => { });
connector.AddAdapter<LuaFixTransactionMessageAdapter>(a => { });

В один объект Connector можно добавлять неограниченное количество подключений. Поэтому одновременно из программы можно подключаться сразу к нескольким биржам и брокерам.

В методе InitConnector устанавливаем требуемые обработчики событий IConnector:

C#
private void InitConnector()
{
    // 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 += _securitiesWindow.SecurityPicker.Securities.Add;
    Connector.NewTrade += _tradesWindow.TradeGrid.Trades.Add;

    Connector.NewOrder += _ordersWindow.OrderGrid.Orders.Add;
    Connector.NewStopOrder += _stopOrdersWindow.OrderGrid.Orders.Add;
    Connector.NewMyTrade += _myTradesWindow.TradeGrid.Trades.Add;

    Connector.NewPortfolio += _portfoliosWindow.PortfolioGrid.Portfolios.Add;
    Connector.NewPosition += _portfoliosWindow.PortfolioGrid.Positions.Add;

    // 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))
        {
            var ctx = new ContinueOnExceptionContext();
            ctx.Error += ex => ex.LogError();

            using (new Scope<ContinueOnExceptionContext> (ctx))
                Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));
        }
    }
    catch
    {
    }

    ConfigManager.RegisterService<IExchangeInfoProvider>(new InMemoryExchangeInfoProvider());

    // нужен для графического конфигурирования
    ConfigManager.RegisterService<IMessageAdapterProvider>(new FullInMemoryMessageAdapterProvider(Connector.Adapter.InnerAdapters));
}

Как сохранять и загружать настройки Connector в файл можно ознакомиться в пункте Save and load settings.

О создании собственного Connector можно ознакомиться в пункте Creating own connector.

Выставление заявок описаны в пунктах Orders management, Create new order, Create new stop order.

See Also