Коннекторы
Для работы с биржами и источниками данных в S# рекомендуется работать через базовый класс Connector.
Рассмотрим работу с Connector. Исходные коды примера находятся в проекте Samples/Common/SampleConnection.
Создаём экземпляр класса 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);
}
}
Аналогично можно добавлять подключения напрямую из кода (без графических окон), воспользовавшись методом расширением 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 можно ознакомиться в пункте Создание собственного коннектора.
Выставление заявок описаны в пунктах Заявки, Создать новую заявку, Создать новую стоп заявку.