Table of Contents

Коннекторы

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

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

multiconnection main

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

...
public Connector Connector;
...
public MainWindow()
{
    InitializeComponent();
    Connector = new Connector();
    InitConnector();
}
		

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

...
private const string _connectorFile = "ConnectorFile.json";
...
private void Setting_Click(object sender, RoutedEventArgs e)
{
    if (Connector.Configure(this))
    {
        Connector.Save().Serialize(_connectorFile);
    }
}
	  				

API GUI ConnectorWindow

Аналогично можно добавлять подключения напрямую из кода (без графических окон), воспользовавшись методом расширением TraderHelper.AddAdapter<TAdapter>(StockSharp.Algo.Connector connector, System.Action<TAdapter> init ):

...
// Добавляем адаптер для подключения к Binance
connector.AddAdapter<BinanceMessageAdapter>(a => 
{
    a.Key = "<Your API Key>";
    a.Secret = "<Your Secret Key>";
});

// Добавляем RSS для новостей
connector.AddAdapter<RssMessageAdapter>(a => 
{
    a.Address = "https://news-source.com/feed";
    a.IsEnabled = true;
});
	  				

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

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

private void InitConnector()
{
    // Подписка на событие успешного подключения
    Connector.Connected += () =>
    {
        this.GuiAsync(() => ChangeConnectStatus(true));
    };
    
    // Подписка на событие ошибки подключения
    Connector.ConnectionError += error => this.GuiAsync(() =>
    {
        ChangeConnectStatus(false);
        MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
    });
    
    // Подписка на событие отключения
    Connector.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
    
    // Подписка на событие ошибки
    Connector.Error += error =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
    
    // Подписка на событие ошибки подписки на рыночные данные
    Connector.SubscriptionFailed += (subscription, error) =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), 
            LocalizedStrings.Str2956Params.Put(subscription.DataType, subscription.SecurityId)));
    
    // Подписки на получение данных
    
    // Инструменты
    Connector.SecurityReceived += (sub, security) => _securitiesWindow.SecurityPicker.Securities.Add(security);
    
    // Тиковые сделки
    Connector.TickTradeReceived += (sub, trade) => _tradesWindow.TradeGrid.Trades.TryAdd(trade);
    
    // Заявки
    Connector.OrderReceived += (sub, order) => _ordersWindow.OrderGrid.Orders.TryAdd(order);
    
    // Собственные сделки
    Connector.OwnTradeReceived += (sub, trade) => _myTradesWindow.TradeGrid.Trades.TryAdd(trade);
    
    // Позиции
    Connector.PositionReceived += (sub, position) => _portfoliosWindow.PortfolioGrid.Positions.TryAdd(position);

    // Ошибки регистрации заявок
    Connector.OrderRegisterFailReceived += (sub, fail) => _ordersWindow.OrderGrid.AddRegistrationFail(fail);
    
    // Ошибки снятия заявок
    Connector.OrderCancelFailReceived += (sub, fail) => OrderFailed(fail);
    
    // Установка поставщика рыночных данных
    _securitiesWindow.SecurityPicker.MarketDataProvider = Connector;
    
    try
    {
        if (File.Exists(_connectorFile))
        {
            var ctx = new ContinueOnExceptionContext();
            ctx.Error += ex => ex.LogError();
            using (new Scope<ContinueOnExceptionContext>(ctx))
                Connector.Load(_connectorFile.Deserialize<SettingsStorage>());
        }
    }
    catch
    {
    }
    
    ConfigManager.RegisterService<IExchangeInfoProvider>(new InMemoryExchangeInfoProvider());
    
    // Регистрация провайдера адаптеров для графического конфигурирования
    ConfigManager.RegisterService<IMessageAdapterProvider>(
        new FullInMemoryMessageAdapterProvider(Connector.Adapter.InnerAdapters));
}

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

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

Выставление заявок описаны в пунктах Заявки, Создать новую заявку, Создать новую стоп заявку.

См. также

Графическое конфигурирование