示例#1
0
        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.Connector = _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);
                            }
                        };

                        _trader.StartExport();

                        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.ProcessDataError += 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();
            }
        }
示例#2
0
        static void Main()
        {
            try
            {
                // для теста выбираем бумагу Лукойл
                const string secCode = "LKOH";

                Console.Write(LocalizedStrings.EnterLogin);
                var login = Console.ReadLine();

                Console.Write(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.Demo
                    })
                    {
                        // подписываемся на событие успешного подключения
                        // все действия необходимо производить только после подключения
                        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));

                        // запускаем экспорт по инструментам и портфелям
                        trader.StartExport();

                        // дожидаемся появления портфеля и инструмента
                        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);
                        }

                        // останавливаем экспорт
                        trader.StopExport();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
示例#3
0
        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();

                    ConfigManager.RegisterService(new FilterableSecurityProvider(Trader));

                    // инициализируем механизм переподключения
                    Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
                    Trader.ReConnectionSettings.ConnectionSettings.Restored += () => this.GuiAsync(() =>
                    {
                        // разблокируем кнопку Экспорт (соединение было восстановлено)
                        ChangeConnectStatus(true);
                        MessageBox.Show(this, LocalizedStrings.Str2958);
                    });

                    // подписываемся на событие успешного соединения
                    Trader.Connected += () =>
                    {
                        // возводим флаг, что соединение установлено
                        _isConnected = true;

                        // разблокируем кнопку Подключиться
                        this.GuiAsync(() => ChangeConnectStatus(true));

                        Trader.StartExport();
                    };
                    Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));

                    // подписываемся на событие разрыва соединения
                    Trader.ConnectionError += error => this.GuiAsync(() =>
                    {
                        // заблокируем кнопку Экспорт (так как соединение было потеряно)
                        ChangeConnectStatus(false);

                        MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
                    });

                    // подписываемся на ошибку обработки данных (транзакций и маркет)
                    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 => _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);
                    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();
            }
        }