コード例 #1
0
ファイル: ChartWindow.xaml.cs プロジェクト: zishe/StockSharp
        public ChartWindow(CandleSeries candleSeries)
        {
            InitializeComponent();

            if (candleSeries == null)
            {
                throw new ArgumentNullException(nameof(candleSeries));
            }

            _candleSeries = candleSeries;
            _trader       = MainWindow.Instance.Trader;

            Chart.ChartTheme = ChartThemes.ExpressionDark;

            var area = new ChartArea();

            Chart.Areas.Add(area);

            _candleElem = new ChartCandleElement
            {
                AntiAliasing    = false,
                UpFillColor     = Colors.White,
                UpBorderColor   = Colors.Black,
                DownFillColor   = Colors.Black,
                DownBorderColor = Colors.Black,
            };

            area.Elements.Add(_candleElem);

            var tf = (TimeSpan)candleSeries.Arg;

            _trader.CandleSeriesProcessing += ProcessNewCandle;
            _trader.SubscribeCandles(_candleSeries, tf.Ticks == 1 ? DateTime.Today : DateTime.Now.Subtract(TimeSpan.FromTicks(tf.Ticks * 1000)));
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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;
        }
コード例 #4
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.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();
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
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();

                    // инициализируем механизм переподключения
                    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();
            }
        }
コード例 #7
0
        private void CreateConnector(Configuration config)
        {
            try
            {
                if (Connector != null && Connector.ConnectionState == ConnectionStates.Connected)
                {
                    throw new Exception("Нельзя создать новый коннектор при активном соединении.");
                }

                if (Connector != null)
                {
                    if (LogManager.Sources.Contains(Connector))
                    {
                        LogManager.Sources.Remove(Connector);
                    }
                    Connector.Dispose();
                }

                switch (config.ConnectorType)
                {
                case eConnectorType.SmartCom:

                    if (config.SmartAddress == null)
                    {
                        throw new Exception("Не задан адрес сервера SmartCom.");
                    }

                    if (config.SmartAddress.IsEqual(SmartComAddresses.Demo) && (string.IsNullOrWhiteSpace(config.SmartDemo.Login) || string.IsNullOrWhiteSpace(config.SmartDemo.Password)))
                    {
                        this.AddWarningLog(string.Format("{0}", "Не заданы логин и/или пароль демо-счета SmartCom"));
                        OnNewStatusMessage("Не заданы логин и/или пароль для демо-счета SmartCom!");
                        return;
                    }

                    if (!config.SmartAddress.IsEqual(SmartComAddresses.Demo) && (string.IsNullOrWhiteSpace(config.SmartLive.Login) || string.IsNullOrWhiteSpace(config.SmartLive.Password)))
                    {
                        this.AddWarningLog(string.Format("{0}", "Не заданы логин и/или пароль SmartCom"));
                        OnNewStatusMessage("Не заданы логин и/или пароль SmartCom!");
                        return;
                    }

                    Connector = new SmartTrader();
                    ((SmartTrader)Connector).Address = config.SmartAddress;
                    ((SmartTrader)Connector).Version = SmartComVersions.V3;

                    if (config.SmartAddress.IsEqual(SmartComAddresses.Demo))
                    {
                        ((SmartTrader)Connector).Login    = config.SmartDemo.Login;
                        ((SmartTrader)Connector).Password = config.SmartDemo.Password;
                    }
                    else
                    {
                        ((SmartTrader)Connector).Login    = config.SmartLive.Login;
                        ((SmartTrader)Connector).Password = config.SmartLive.Password;
                    }

                    break;

                case eConnectorType.Quik:
                    Connector = new QuikTrader
                    {
                        LuaLogin            = config.LuaLogin,
                        LuaFixServerAddress = config.LuaFixServerAddress
                    };

                    break;

                default:
                    break;
                }

                ConnectorType = config.ConnectorType;

                if (!LogManager.Sources.Contains(Connector))
                {
                    LogManager.Sources.Add(Connector);
                }

                OnConnectorCreated(Connector, config.ConnectorType);

                this.AddWarningLog(string.Format("Создан новый коннектор {0}", config.ConnectorType.ToString()));

                OnNewStatusMessage(string.Format("Создан новый коннектор {0}", config.ConnectorType.ToString()));
            }
            catch (Exception ex)
            {
                this.AddErrorLog(string.Format("{0} / {1}", ex.Message, ex.StackTrace));
                OnNewStatusMessage(ex.Message);
            }
        }