Коннекторы
Для работы с биржами и источниками данных в 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))
{
new JsonSerializer<SettingsStorage>().Serialize(Connector.Save(), _connectorFile);
}
}
Аналогично можно добавлять подключения напрямую из кода (без графических окон), воспользовавшись методом расширением TraderHelper.AddAdapter<TAdapter>(StockSharp.Algo.Connector connector, System.Action<TAdapter> init ):
...
// добавляем два подключения к QUIK (цены и заявки)
connector.AddAdapter<LuaFixMarketDataMessageAdapter>(a => { });
connector.AddAdapter<LuaFixTransactionMessageAdapter>(a => { });
В один объект Connector можно добавлять неограниченное количество подключений. Поэтому одновременно из программы можно подключаться сразу к нескольким биржам и брокерам.
В методе InitConnector устанавливаем требуемые обработчики событий IConnector:
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.PositionReceived += (sub, p) => _portfoliosWindow.PortfolioGrid.Positions.TryAdd(p);
// 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 JsonSerializer<SettingsStorage>().Deserialize(_settingsFile));
}
}
catch
{
}
ConfigManager.RegisterService<IExchangeInfoProvider>(new InMemoryExchangeInfoProvider());
// нужен для графического конфигурирования
ConfigManager.RegisterService<IMessageAdapterProvider>(new FullInMemoryMessageAdapterProvider(Connector.Adapter.InnerAdapters));
}
Как сохранять и загружать настройки Connector в файл можно ознакомиться в пункте Сохранение и загрузка настроек.
О создании собственного Connector можно ознакомиться в пункте Создание собственного коннектора.
Выставление заявок описаны в пунктах Заявки, Создать новую заявку, Создать новую стоп заявку.