private void ConnectClick(object sender, RoutedEventArgs e) { if (Login.Text.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2974); return; } else if (Password.Password.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2975); return; } // создаем подключение _trader = new SmartTrader { Login = Login.Text, Password = Password.Password, Address = Address.SelectedAddress, // применить нужную версию SmartCOM Version = IsSmartCom3.IsChecked == true ? SmartComVersions.V3 : SmartComVersions.V2, }; // очищаем из текстового поля в целях безопасности //Password.Clear(); // подписываемся на ошибку обработки данных (транзакций и маркет) _trader.ProcessDataError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955)); // подписываемся на ошибку подписки маркет-данных _trader.MarketDataSubscriptionFailed += (security, type, error) => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security))); _trader.NewSecurities += securities => { // так как инструментов слишком много, то выводим только два популярных с ММВБ и РТС securities = securities.Where(s => s.Code == "LKOH" || (s.Type == SecurityTypes.Future && s.Id.Like("RI%FORTS"))); this.GuiAsync(() => _securitiesSource.AddRange(securities)); // начинаем получать текущие сделки (для построения свечек в реальном времени) securities.ForEach(_trader.RegisterTrades); }; // запускаем экспорт в случае успешного подключения _trader.Connected += _trader.StartExport; _candleManager = new CandleManager(_trader); _trader.Connect(); ConnectBtn.IsEnabled = false; }
private void ConnectClick(object sender, RoutedEventArgs e) { if (Login.Text.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2974); return; } else if (Password.Password.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2975); return; } // создаем подключение _trader = new SmartTrader { Login = Login.Text, Password = Password.Password, Address = Address.SelectedAddress, // применить нужную версию SmartCOM Version = IsSmartCom3.IsChecked == true ? SmartComVersions.V3 : SmartComVersions.V2, }; // очищаем из текстового поля в целях безопасности //Password.Clear(); // подписываемся на ошибку обработки данных (транзакций и маркет) _trader.Error += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955)); // подписываемся на ошибку подписки маркет-данных _trader.MarketDataSubscriptionFailed += (security, type, error) => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security))); Security.SecurityProvider = new FilterableSecurityProvider(_trader); _candleManager = new CandleManager(_trader); _trader.Connect(); ConnectBtn.IsEnabled = false; }
private void ConnectClick(object sender, RoutedEventArgs e) { if (!_isConnected) { if (Login.Text.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2974); return; } else if (Password.Password.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2975); return; } if (_trader == null) { // создаем подключение _trader = new SmartTrader(); _logManager.Sources.Add(_trader); Portfolios.Portfolios = new PortfolioDataSource(_trader); // подписываемся на событие успешного соединения _trader.Connected += () => { // возводим флаг, что соединение установлено _isConnected = true; // разблокируем кнопку Экспорт this.GuiAsync(() => ChangeConnectStatus(true)); _candleManager = new CandleManager(_trader); _trader.NewCandles += (series, candles) => _historyCandles.SyncDo(col => { _historyCandles.AddRange(candles.Cast <TimeFrameCandle>()); foreach (var candle in candles) { ProcessCandle(candle); } }); _trader.NewSecurities += securities => { // находим нужную бумагу var lkoh = securities.FirstOrDefault(s => s.Code == "LKOH"); if (lkoh != null) { _lkoh = lkoh; this.GuiAsync(() => { Start.IsEnabled = true; }); } }; _trader.NewMyTrades += trades => { if (_strategy != null) { // найти те сделки, которые совершила стратегия скользящей средней trades = trades.Where(t => _strategy.Orders.Any(o => o == t.Order)); _trades.Trades.AddRange(trades); } }; // подписываемся на событие о неудачной регистрации заявок //_trader.OrdersRegisterFailed += OrdersFailed; _candleManager.Processing += (s, candle) => { // выводим только те свечи, которые не были отрисованы как исторические if (candle.OpenTime > _lastHistoryCandle) { ProcessCandle(candle); } }; this.GuiAsync(() => { ConnectBtn.IsEnabled = false; }); }; // подписываемся на событие разрыва соединения _trader.ConnectionError += error => this.GuiAsync(() => { // заблокируем кнопку Экспорт (так как соединение было потеряно) ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959); }); _trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false)); // подписываемся на ошибку обработки данных (транзакций и маркет) //_trader.Error += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных")); // подписываемся на ошибку подписки маркет-данных _trader.MarketDataSubscriptionFailed += (security, type, error) => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security))); } _trader.Login = Login.Text; _trader.Password = Password.Password; _trader.Address = Address.SelectedAddress; // очищаем из текстового поля в целях безопасности //Password.Clear(); _trader.Connect(); } else { _trader.Disconnect(); } }
static void Main() { try { // для теста выбираем бумагу Лукойл const string secCode = "LKOH"; Console.Write("{0}: ", LocalizedStrings.EnterLogin); var login = Console.ReadLine(); Console.Write("{0}: ", LocalizedStrings.EnterPassword); var password = Console.ReadLine(); Console.Write("Enter account number through which an order will be placed: ".Translate()); var account = Console.ReadLine(); using (var waitHandle = new AutoResetEvent(false)) { // создаем подключение к Smart-у using (var trader = new SmartTrader { Login = login, Password = password, Address = SmartComAddresses.Reserve1 }) { trader.Version = StockSharp.SmartCom.Native.SmartComVersions.V2; // подписываемся на событие успешного подключения // все действия необходимо производить только после подключения trader.Connected += () => { Console.WriteLine(LocalizedStrings.Str2169); // извещаем об успешном соединени waitHandle.Set(); }; Console.WriteLine(LocalizedStrings.Str2170); trader.Connect(); // дожидаемся события об успешном соединении waitHandle.WaitOne(); // подписываемся на все портфели-счета trader.NewPortfolios += portfolios => { if (_portfolio != null) { return; } // находим нужный портфель и присваиваем его переменной _portfolio _portfolio = portfolios.FirstOrDefault(p => p.Name == account); if (_portfolio == null) { return; } Console.WriteLine(LocalizedStrings.Str2171Params, account); if (_lkoh != null) { waitHandle.Set(); } }; // подписываемся на событие появление инструментов trader.NewSecurities += securities => { if (_lkoh == null) { // находим Лукойл и присваиваем ее переменной lkoh _lkoh = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Stock); if (_lkoh != null) { Console.WriteLine(LocalizedStrings.Str2987); if (_portfolio != null) { waitHandle.Set(); } } } }; // подписываемся на событие появления моих новых сделок trader.NewMyTrades += myTrades => { foreach (var myTrade in myTrades) { var trade = myTrade.Trade; Console.WriteLine(LocalizedStrings.Str2173Params, trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time); } }; Console.WriteLine(LocalizedStrings.Str2989Params.Put(account)); // дожидаемся появления портфеля и инструмента waitHandle.WaitOne(); trader.SecuritiesChanged += securities => { // если инструмент хоть раз изменился (по нему пришли актуальные данные) if (securities.Contains(_lkoh) && _lkoh.BestBid != null && _lkoh.BestAsk != null) { waitHandle.Set(); } }; Console.WriteLine("Waiting for Lukoil security data to update...".Translate()); // запускаем обновление по инструменту trader.RegisterSecurity(_lkoh); waitHandle.WaitOne(); // 0.1% от изменения цены const decimal delta = 0.001m; // запоминаем первоначальное значение середины спреда var firstMid = _lkoh.BestPair.SpreadPrice / 2; if (_lkoh.BestBid == null || firstMid == null) { throw new Exception(LocalizedStrings.Str2990); } Console.WriteLine(LocalizedStrings.Str2991Params, _lkoh.BestBid.Price + firstMid); while (true) { var mid = _lkoh.BestPair.SpreadPrice / 2; // если спред вышел за пределы нашего диапазона if (mid != null && ((firstMid + firstMid * delta) <= mid || (firstMid - firstMid * delta) >= mid) ) { var order = new Order { Portfolio = _portfolio, Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid.Value), Security = _lkoh, Volume = 1, Direction = Sides.Buy, }; //trader.RegisterOrder(order); Console.WriteLine(LocalizedStrings.Str1157Params, order.Id); break; } else { Console.WriteLine(LocalizedStrings.Str2176Params, _lkoh.BestBid.Price + mid); } // ждем 1 секунду Thread.Sleep(1000); } } } } catch (Exception ex) { Console.WriteLine(ex); } }
private void ConnectClick(object sender, RoutedEventArgs e) { if (!_isConnected) { if (Login.Text.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2974); return; } else if (Password.Password.IsEmpty()) { MessageBox.Show(this, LocalizedStrings.Str2975); return; } if (Trader == null) { // создаем подключение Trader = new SmartTrader(); // инициализируем механизм переподключения Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime; Trader.Restored += () => this.GuiAsync(() => { // разблокируем кнопку Экспорт (соединение было восстановлено) ChangeConnectStatus(true); MessageBox.Show(this, LocalizedStrings.Str2958); }); // подписываемся на событие успешного соединения Trader.Connected += () => { // возводим флаг, что соединение установлено _isConnected = true; // разблокируем кнопку Подключиться this.GuiAsync(() => ChangeConnectStatus(true)); }; Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false)); // подписываемся на событие разрыва соединения Trader.ConnectionError += error => this.GuiAsync(() => { // заблокируем кнопку Экспорт (так как соединение было потеряно) ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959); }); // подписываемся на ошибку обработки данных (транзакций и маркет) Trader.Error += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955)); // подписываемся на ошибку подписки маркет-данных Trader.MarketDataSubscriptionFailed += (security, type, error) => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security))); Trader.NewSecurities += securities => _securitiesWindow.SecurityPicker.Securities.AddRange(securities); Trader.NewMyTrades += trades => _myTradesWindow.TradeGrid.Trades.AddRange(trades); Trader.NewTrades += trades => _tradesWindow.TradeGrid.Trades.AddRange(trades); Trader.NewOrders += orders => _ordersWindow.OrderGrid.Orders.AddRange(orders); Trader.NewStopOrders += orders => _stopOrdersWindow.OrderGrid.Orders.AddRange(orders); Trader.NewPortfolios += portfolios => { _portfoliosWindow.PortfolioGrid.Portfolios.AddRange(portfolios); portfolios.ForEach(Trader.RegisterPortfolio); }; Trader.NewPositions += positions => _portfoliosWindow.PortfolioGrid.Positions.AddRange(positions); // подписываемся на событие о неудачной регистрации заявок Trader.OrdersRegisterFailed += OrdersFailed; // подписываемся на событие о неудачном снятии заявок Trader.OrdersCancelFailed += OrdersFailed; // подписываемся на событие о неудачной регистрации стоп-заявок Trader.StopOrdersRegisterFailed += OrdersFailed; // подписываемся на событие о неудачном снятии стоп-заявок Trader.StopOrdersCancelFailed += OrdersFailed; // устанавливаем поставщик маркет-данных _securitiesWindow.SecurityPicker.MarketDataProvider = Trader; ShowSecurities.IsEnabled = ShowTrades.IsEnabled = ShowMyTrades.IsEnabled = ShowOrders.IsEnabled = ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = true; } Trader.Login = Login.Text; Trader.Password = Password.Password; Trader.Address = Address.SelectedAddress; // применить нужную версию SmartCOM Trader.Version = IsSmartCom3.IsChecked == true ? SmartComVersions.V3 : SmartComVersions.V2; // очищаем из текстового поля в целях безопасности //Password.Clear(); Trader.Connect(); } else { Trader.Disconnect(); } }