private void ConnectButtom_Click(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;

            if (button == null)
            {
                return;
            }
            if (button.Content.ToString() == "Соединить")
            {
                OnConnect();
            }
            else
            {
                _connector.Disconnect();
            }
        }
Exemple #2
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (!_isConnected)
            {
                if (Path.Text.IsEmpty())
                {
                    MessageBox.Show(this, LocalizedStrings.Str2969);
                }
                else
                {
                    if (Trader == null)
                    {
                        // создаем подключение
                        Trader = new QuikTrader(Path.Text)
                        {
                            IsDde = true
                        };

                        // возводим флаг, что соединение установлено
                        _isConnected = true;

                        // подписываемся на событие ошибки соединения
                        Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                        // добавляем тип QuikCandle для преобразования строчки из таблица Исторические свечи в объект QuikCandle
                        _table = new DdeCustomTable(typeof(QuikCandle));
                        Trader.CustomTables.Add(_table);

                        Trader.NewCustomTables += (type, objects) =>
                        {
                            // нас интересует только QuikCandle
                            if (type == typeof(QuikCandle))
                            {
                                _candlesWindow.Candles.AddRange(objects.Cast <QuikCandle>());
                            }
                        };

                        Trader.Connected += () => this.GuiAsync(() =>
                        {
                            ShowCandles.IsEnabled = true;
                            ExportDde.IsEnabled   = true;

                            _isConnected       = true;
                            ConnectBtn.Content = LocalizedStrings.Disconnect;
                        });

                        Trader.Disconnected += () => this.GuiAsync(() =>
                        {
                            _isConnected       = false;
                            ConnectBtn.Content = LocalizedStrings.Connect;
                        });
                    }

                    Trader.Connect();
                }
            }
            else
            {
                Trader.Disconnect();
            }
        }
Exemple #3
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (!_isConnected)
            {
                var isLua = IsLua.IsChecked == true;

                if (isLua)
                {
                    if (Address.Text.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2977);
                        return;
                    }

                    if (Login.Text.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2978);
                        return;
                    }

                    if (Password.Password.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2979);
                        return;
                    }
                }
                else
                {
                    if (QuikPath.Folder.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2969);
                        return;
                    }
                }

                if (Trader == null)
                {
                    // создаем подключение
                    Trader = isLua
                        ? new QuikTrader
                    {
                        LuaFixServerAddress = Address.Text.To <EndPoint>(),
                        LuaLogin            = Login.Text,
                        LuaPassword         = Password.Password.To <SecureString>()
                    }
                        : new QuikTrader(QuikPath.Folder)
                    {
                        IsDde = true
                    };

                    Trader.LogLevel = LogLevels.Debug;

                    _logManager.Sources.Add(Trader);

                    // отключение автоматического запроса всех инструментов.
                    Trader.RequestAllSecurities = AllSecurities.IsChecked == true;

                    // возводим флаг, что соединение установлено
                    _isConnected = true;

                    // переподключение будет работать только во время работы биржи РТС
                    // (чтобы отключить переподключение когда торгов нет штатно, например, ночью)
                    Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;

                    // подписываемся на событие об успешном восстановлении соединения
                    Trader.Restored += () => this.GuiAsync(() => MessageBox.Show(this, LocalizedStrings.Str2958));

                    // подписываемся на событие разрыва соединения
                    Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                    // подписываемся на ошибку обработки данных (транзакций и маркет)
                    //Trader.Error += error =>
                    //	this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));

                    // подписываемся на ошибку подписки маркет-данных
                    Trader.MarketDataSubscriptionFailed += (security, msg, error) =>
                                                           this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, 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 => _stopOrderWindow.OrderGrid.Orders.AddRange(orders);
                    Trader.OrdersRegisterFailed     += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str153)));
                    Trader.OrdersCancelFailed       += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)));
                    Trader.StopOrdersRegisterFailed += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str153)));
                    Trader.StopOrdersCancelFailed   += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)));
                    Trader.NewPortfolios            += portfolios => _portfoliosWindow.PortfolioGrid.Portfolios.AddRange(portfolios);
                    Trader.NewPositions             += positions => _portfoliosWindow.PortfolioGrid.Positions.AddRange(positions);

                    Trader.MassOrderCancelFailed += (transId, error) =>
                                                    this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str716));

                    // устанавливаем поставщик маркет-данных
                    _securitiesWindow.SecurityPicker.MarketDataProvider = Trader;

                    ShowSecurities.IsEnabled         = ShowTrades.IsEnabled =
                        ShowMyTrades.IsEnabled       = ShowOrders.IsEnabled =
                            ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = ShowMyWin.IsEnabled = Console.IsEnabled = true;
                }

                Trader.Connect();

                _isConnected       = true;
                ConnectBtn.Content = LocalizedStrings.Disconnect;
            }
            else
            {
                Trader.Disconnect();

                _isConnected       = false;
                ConnectBtn.Content = LocalizedStrings.Connect;
            }
        }
Exemple #4
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (!_isConnected)
            {
                if (Path.Text.IsEmpty())
                {
                    MessageBox.Show(this, LocalizedStrings.Str2969);
                }
                else
                {
                    if (Trader == null)
                    {
                        // создаем подключение
                        Trader = new QuikTrader(Path.Text)
                        {
                            IsDde = true
                        };

                        // возводим флаг, что соединение установлено
                        _isConnected = true;

                        // подписываемся на событие ошибки соединения
                        Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                        Trader.NewSecurities += securities => _securitiesWindow.SecurityPicker.Securities.AddRange(securities);

                        Trader.Error += error => System.Diagnostics.Debug.WriteLine(error);

                        // добавляем на экспорт необходимые колонки
                        Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.ImpliedVolatility);
                        Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.TheorPrice);
                        Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.UnderlyingSecurity);
                        Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.StepPrice);

                        // добавляем экспорт дополнительных колонок из стакана (своя продажа и покупка)
                        Trader.QuotesTable.Columns.Add(DdeQuoteColumns.OwnAskVolume);
                        Trader.QuotesTable.Columns.Add(DdeQuoteColumns.OwnBidVolume);

                        Trader.DdeTables = new[] { Trader.SecuritiesTable };

                        Trader.Connected += () => this.GuiAsync(() =>
                        {
                            ShowSecurities.IsEnabled = true;

                            _isConnected       = true;
                            ConnectBtn.Content = LocalizedStrings.Disconnect;
                        });

                        Trader.Disconnected += () => this.GuiAsync(() =>
                        {
                            _isConnected       = false;
                            ConnectBtn.Content = LocalizedStrings.Connect;
                        });
                    }

                    Trader.Connect();
                }
            }
            else
            {
                Trader.Disconnect();
            }
        }
Exemple #5
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (_trader == null || _trader.ConnectionState == ConnectionStates.Disconnected)
            {
                if (_trader == null)
                {
                    if (Path.Text.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2983);
                        return;
                    }

                    // создаем подключение
                    _trader = new QuikTrader(Path.Text)
                    {
                        IsDde = true
                    };

                    Portfolios.Portfolios = new PortfolioDataSource(_trader);

                    _trader.Connected += () =>
                    {
                        _candleManager = new CandleManager(_trader);

                        _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);
                            }
                        };

                        _candleManager.Processing += (series, candle) =>
                        {
                            // если скользящие за сегодняшний день отрисованы, то рисуем в реальном времени текущие скользящие
                            if (_isTodaySmaDrawn && candle.State == CandleStates.Finished)
                            {
                                ProcessCandle(candle);
                            }
                        };
                        //_trader.Error += ex => this.GuiAsync(() => MessageBox.Show(this, ex.ToString()));
                        _trader.ConnectionError += ex =>
                        {
                            if (ex != null)
                            {
                                this.GuiAsync(() => MessageBox.Show(this, ex.ToString()));
                            }
                        };

                        this.GuiAsync(() =>
                        {
                            ConnectBtn.IsEnabled = false;
                            Report.IsEnabled     = true;
                        });
                    };
                }

                _trader.Connect();
            }
            else
            {
                _trader.Disconnect();
            }
        }
Exemple #6
0
        static void Main()
        {
            try
            {
                // для теста выбираем бумагу Лукойл
                const string secCode = "LKOH";

                var quikPath = QuikTerminal.GetDefaultPath();

                if (quikPath.IsEmpty())
                {
                    Console.WriteLine(LocalizedStrings.Str2984);
                    return;
                }

                Console.WriteLine(LocalizedStrings.Str2985.Put(quikPath));

                Console.Write(LocalizedStrings.Str2986);
                var account = Console.ReadLine();

                using (var waitHandle = new AutoResetEvent(false))
                {
                    // создаем подключение к Quik-у
                    using (var trader = new QuikTrader(quikPath)
                    {
                        IsDde = true
                    })
                    {
                        // необходимо раскомментировать, если идет работа с РТС Стандарт
                        //trader.FormatTransaction += builder => builder.RemoveInstruction(Transaction.TimeInForce);

                        // подписываемся на событие успешного подключения
                        // все действия необходимо производить только после подключения
                        trader.Connected += () =>
                        {
                            Console.WriteLine(LocalizedStrings.Str2169);

                            // извещаем об успешном соединени
                            waitHandle.Set();
                        };

                        Console.WriteLine(LocalizedStrings.Str2170);

                        trader.DdeTables = new[] { trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
                                                   trader.EquityPortfoliosTable, trader.OrdersTable };

                        trader.Connect();

                        // дожидаемся события об успешном соединении
                        waitHandle.WaitOne();

                        trader.NewPortfolio += portfolio =>
                        {
                            if (_portfolio == null && portfolio.Name == account)
                            {
                                // находим нужный портфель и присваиваем его переменной _portfolio
                                _portfolio = portfolio;

                                Console.WriteLine(LocalizedStrings.Str2171Params, account);

                                // если инструмент и стакан уже появились,
                                // то извещаем об этом основной поток для выставления заявки
                                if (_lkoh != null && _depth != null)
                                {
                                    waitHandle.Set();
                                }
                            }
                        };

                        // подписываемся на событие появление инструментов
                        trader.NewSecurity += security =>
                        {
                            if (_lkoh == null)
                            {
                                if (!security.Code.CompareIgnoreCase(secCode))
                                {
                                    return;
                                }

                                // находим Лукойл и присваиваем ее переменной lkoh
                                _lkoh = security;

                                if (_lkoh != null)
                                {
                                    Console.WriteLine(LocalizedStrings.Str2987);

                                    // запускаем экспорт стакана
                                    trader.RegisterMarketDepth(_lkoh);

                                    if (_portfolio != null && _depth != null)
                                    {
                                        waitHandle.Set();
                                    }
                                }
                            }
                        };

                        // подписываемся на событие появления моих новых сделок
                        trader.NewMyTrade += myTrade =>
                        {
                            var trade = myTrade.Trade;
                            Console.WriteLine(LocalizedStrings.Str2173Params, trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
                        };

                        // подписываемся на событие обновления стакана
                        trader.MarketDepthChanged += depth =>
                        {
                            if (_depth == null && _lkoh != null && depth.Security == _lkoh)
                            {
                                _depth = depth;

                                Console.WriteLine(LocalizedStrings.Str2988);

                                // если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
                                if (_portfolio != null && _lkoh != null)
                                {
                                    waitHandle.Set();
                                }
                            }
                        };

                        Console.WriteLine(LocalizedStrings.Str2989Params.Put(account));

                        // дожидаемся появления портфеля и инструмента
                        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.Disconnect();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
Exemple #7
0
    public void LuaConnect()
    {
        ManualResetEvent portfoliosWait = null;

        if (!_isConnected)
        {
            if (_fixServerAddress.IsEmpty())
            {
                MessageBox.Show(LocalizedStrings.Str2977);
                return;
            }

            if (_luaLogin.IsEmpty())
            {
                MessageBox.Show(LocalizedStrings.Str2978);
                return;
            }

            if (_luaPassword.IsEmpty())
            {
                MessageBox.Show(LocalizedStrings.Str2979);
                return;
            }



            if (Trader == null)
            {
                // создаем подключение
                Trader = new QuikTrader
                {
                    LuaFixServerAddress = _fixServerAddress.To <EndPoint>(),
                    LuaLogin            = _luaLogin,
                    LuaPassword         = _luaPassword.To <SecureString>()
                };


                Trader.LogLevel = LogLevels.Debug;

                _logManager.Sources.Add(Trader);

                // отключение автоматического запроса всех инструментов.
                //Trader.RequestAllSecurities = AllSecurities.IsChecked == true;
                Trader.RequestAllSecurities = true;

                // возводим флаг, что соединение установлено
                _isConnected = true;

                // переподключение будет работать только во время работы биржи РТС
                // (чтобы отключить переподключение когда торгов нет штатно, например, ночью)
                Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;

                // подписываемся на событие об успешном восстановлении соединения
                Trader.Restored += () => MessageBox.Show(LocalizedStrings.Str2958);

                // подписываемся на событие разрыва соединения
                Trader.ConnectionError += error => MessageBox.Show(error.ToString());

                // подписываемся на ошибку обработки данных (транзакций и маркет)
                //Trader.Error += error =>
                //	this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));

                // подписываемся на ошибку подписки маркет-данных
                Trader.MarketDataSubscriptionFailed += (security, type, error) => MessageBox.Show(error.ToString(), LocalizedStrings.Str2956Params.Put(type, security));

                Trader.NewSecurities += TraderOnNewSecurities;

                Trader.LookupSecuritiesResult += TraderOnLookupSecuritiesResult;

                //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 => _stopOrderWindow.OrderGrid.Orders.AddRange(orders);
                //Trader.OrdersRegisterFailed += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2960)));
                //Trader.OrdersCancelFailed += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)));
                //Trader.StopOrdersRegisterFailed += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2960)));
                //Trader.StopOrdersCancelFailed += fails => fails.ForEach(fail => this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)));
                //Trader.NewPortfolios += portfolios => _portfoliosWindow.PortfolioGrid.Portfolios.AddRange(portfolios);
                //Trader.NewPositions += positions => _portfoliosWindow.PortfolioGrid.Positions.AddRange(positions);

                // устанавливаем поставщик маркет-данных
                //_securitiesWindow.SecurityPicker.MarketDataProvider = Trader;

                //ShowSecurities.IsEnabled = ShowTrades.IsEnabled =
                //    ShowMyTrades.IsEnabled = ShowOrders.IsEnabled =
                //        ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = true;


                portfoliosWait = new ManualResetEvent(false);

                Action <IEnumerable <Portfolio> > newPortfolios = portfolios =>
                {
                    if (_portfolio1 == null)
                    {
                        Portfolio first = null;
                        foreach (Portfolio p in portfolios)
                        {
                            if (p.Name == "60087")
                            {
                                first = p;
                                break;
                            }
                        }
                        _portfolio1 = first;
                    }

                    // если оба инструмента появились
                    if (_portfolio1 != null)
                    {
                        portfoliosWait.Set();
                    }
                };

                Trader.NewPortfolios += newPortfolios;

                decimal sum;
                sum = 0.0m;
                foreach (var portfolio in Trader.Portfolios)
                {
                    sum += portfolio.GetFreeMoney(false);
                }

                Debug.WriteLine(sum.ToString());
            }

            Trader.Connect();
            _isConnected = true;
            Debug.WriteLine(Trader.ConnectionState.ToString());
            portfoliosWait.WaitOne();
            GetAllSecurities();

            Debug.WriteLine(Trader.ConnectionState.ToString());
        }
        else
        {
            Trader.Disconnect();
            _isConnected = false;
            Debug.WriteLine(Trader.ConnectionState.ToString());
        }
    }
Exemple #8
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (!_isConnected)
            {
                if (Path.Text.IsEmpty())
                {
                    MessageBox.Show(this, "Путь к Quik не выбран");
                }
                else
                {
                    if (Trader == null)
                    {
                        // создаем шлюз
                        Trader = new QuikTrader(Path.Text);

                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        Trader.SupportManualOrders = true;
                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                        // возводим флаг, что соединение установлено
                        _isConnected = true;

                        // инициализируем механизм переподключения (будет автоматически соединяться
                        // каждые 10 секунд, если шлюз потеряется связь с сервером)
                        Trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);

                        // переподключение будет работать только во время работы биржи РТС
                        // (чтобы отключить переподключение когда торгов нет штатно, например, ночью)
                        Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;

                        // подписываемся на событие об успешном восстановлении соединения
                        Trader.ReConnectionSettings.ConnectionRestored += () => this.GuiAsync(() => MessageBox.Show(this, "Соединение восстановлено"));

                        // подписываемся на событие разрыва соединения

                        Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                        Trader.NewSecurities    += securities => this.GuiAsync(() => _securitiesWindow.Securities.AddRange(securities));
                        Trader.NewMyTrades      += trades => this.GuiAsync(() => _myTradesWindow.Trades.AddRange(trades));
                        Trader.NewTrades        += trades => this.GuiAsync(() => _tradesWindow.Trades.AddRange(trades));
                        Trader.NewOrders        += orders => this.GuiAsync(() => _ordersWindow.Orders.AddRange(orders));
                        Trader.NewStopOrders    += orders => this.GuiAsync(() => _stopOrderWindow.Orders.AddRange(orders));
                        Trader.NewPortfolios    += portfolios => this.GuiAsync(() => _portfoliosWindow.Portfolios.AddRange(portfolios));
                        Trader.NewPositions     += positions => this.GuiAsync(() => _positionsWindow.Positions.AddRange(positions));
                        Trader.ProcessDataError += ex => System.Diagnostics.Debug.WriteLine(ex);
                        Trader.Connected        += () => this.GuiAsync(() =>
                        {
                            ExportDde.IsEnabled = true;
                            if (!Trader.IsExportStarted)
                            {
                                Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinStepPrice);
                                Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.Strike);
                                Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.OptionType);
                                Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.ExpiryDate);
                                Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.UnderlyingSecurity);
                                Trader.StartExport();
                            }
                            (new SoundPlayer(ConnectedSound)).Play();
                        });

                        ShowSecurities.IsEnabled         = ShowTrades.IsEnabled =
                            ShowMyTrades.IsEnabled       = ShowOrders.IsEnabled =
                                ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = btnStart.IsEnabled = true;
                    }

                    Trader.Connect();

                    _isConnected       = true;
                    ConnectBtn.Content = "Отключиться";
                }
            }
            else
            {
                Trader.Disconnect();

                _isConnected       = false;
                ConnectBtn.Content = "Подключиться";
            }
        }
Exemple #9
0
        static void Main(string[] args)
        {
            var tradeBufferMax = 200;
            var depthBufferMax = 1000;

            var tradeBuffers = new Dictionary <string, List <Trade> >();
            var depthBuffers = new Dictionary <string, List <MarketDepth> >();

            var tradeStorages = new Dictionary <string, IMarketDataStorage <Trade> >();
            var depthStorages = new Dictionary <string, IMarketDataStorage <MarketDepth> >();

            List <string> securityIds = new List <string>();

            StorageFormats storageFormat;
            string         storagePath;

            var settings = XElement.Load("settings.xml");

            storagePath   = @settings.Element("storage-path").Value;
            storageFormat = (StorageFormats)Enum.Parse(typeof(StorageFormats), settings.Element("storage-format").Value.ToUpper());

            foreach (var item in settings.Element("securities").Elements())
            {
                var secId = item.Element("security").Value;
                securityIds.Add(secId);
                depthBuffers.Add(secId, new List <MarketDepth>());
                tradeBuffers.Add(secId, new List <Trade>());
            }

            var storage = new StorageRegistry()
            {
                DefaultDrive = new LocalMarketDataDrive {
                    Path = storagePath
                }
            };

            var connector = new QuikTrader();

            // Ставим false, чтобы квик при старте не загрузил все 30 тыс инструментов
            connector.RequestAllSecurities = false;

            // Контролируем соединение в течение работы срочного рынка
            connector.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;

            // Обработчик события успешного соединения
            connector.Connected += () =>
            {
                Console.WriteLine("Соединение установлено!");
                if (securityIds.Any())
                {
                    // Запрашиваем инструменты
                    foreach (var id in securityIds)
                    {
                        connector.LookupSecurities(new Security()
                        {
                            Code = id.Split('@')[0], Board = ExchangeBoard.GetBoard(id.Split('@')[1])
                        });
                    }
                }
                else
                {
                    Console.WriteLine("Нет инструментов для запроса!");
                }
            };

            connector.LookupSecuritiesResult += (ex, securities) =>
            {
                foreach (var security in securities)
                {
                    if (tradeStorages.ContainsKey(security.Id) || depthStorages.ContainsKey(security.Id))
                    {
                        continue;
                    }

                    // Инициализируем специализированные хранилища
                    tradeStorages.Add(security.Id, storage.GetTradeStorage(security, null, storageFormat));
                    depthStorages.Add(security.Id, storage.GetMarketDepthStorage(security, null, storageFormat));

                    // Региструем получение сделок
                    if (!connector.RegisteredTrades.Contains(security))
                    {
                        connector.RegisterTrades(security);
                    }

                    // Региструем получение стаканов
                    if (!connector.RegisteredMarketDepths.Contains(security))
                    {
                        connector.RegisterMarketDepth(security);
                    }
                }
            };

            connector.NewTrades += trades =>
            {
                foreach (var trade in trades)
                {
                    var secId = trade.Security.Id;

                    tradeBuffers[secId].Add(trade);

                    if (tradeBuffers[secId].Count >= tradeBufferMax)
                    {
                        var forsave = tradeBuffers[secId].TakeLast(tradeBufferMax);
                        tradeBuffers[secId] = tradeBuffers[secId].Except(forsave).ToList();
                        var task = Task.Factory.StartNew(() => tradeStorages[secId].Save(forsave));
                    }
                }
            };

            connector.MarketDepthsChanged += depths =>
            {
                foreach (var depth in depths)
                {
                    var secId = depth.Security.Id;
                    depthBuffers[secId].Add(depth);

                    if (depthBuffers[secId].Count >= depthBufferMax)
                    {
                        var forsave = depthBuffers[secId].TakeLast(depthBufferMax);
                        depthBuffers[secId] = depthBuffers[secId].Except(forsave).ToList();
                        var task = Task.Factory.StartNew(() => depthStorages[secId].Save(forsave));
                    }
                }
            };

            // Обработчик события разрыва соединения
            connector.Disconnected += () => Console.WriteLine("Соединение разорвано!");

            // Команда соединения
            connector.Connect();

            Console.Read();

            var ttasks = new List <Task>();
            var dtasks = new List <Task>();

            foreach (var security in connector.Securities)
            {
                // Отменяем регистрацию сделок
                if (connector.RegisteredTrades.Contains(security))
                {
                    connector.UnRegisterTrades(security);
                }

                // Отменяем получение стаканов
                if (connector.RegisteredMarketDepths.Contains(security))
                {
                    connector.UnRegisterMarketDepth(security);
                }

                // Записываем остатки данных
                ttasks.Add(Task.Factory.StartNew(() => tradeStorages[security.Id].Save(tradeBuffers[security.Id])));
                dtasks.Add(Task.Factory.StartNew(() => depthStorages[security.Id].Save(depthBuffers[security.Id])));
            }

            Console.WriteLine("Записываем остатки данных!");

            // Чуток ждем
            Task.WaitAll(ttasks.ToArray());
            Task.WaitAll(dtasks.ToArray());

            // Команда разрыва соединения
            connector.Disconnect();
        }
        public bool Connect(Terminal toTerminal)
        {
            try
            {
                if (Trader == null)
                {
                    // создаем подключение
                    Trader = new QuikTrader {
                        IsDde = false, Path = toTerminal.FullPath
                    };

                    /*
                     * {
                     *  LuaFixServerAddress = Address.Text.To<EndPoint>(),
                     *  LuaLogin = Login.Text,
                     *  LuaPassword = Password.Password.To<SecureString>()
                     * };
                     */

                    Trader.LogLevel = LogLevels.Info;

                    _logManager.Sources.Add(Trader);
                    _logManager.Listeners.Add(new FileLogListener("XTrade.Quik.log"));

                    // отключение автоматического запроса всех инструментов.
                    Trader.RequestAllSecurities = false;

                    // возводим флаг, что соединение установлено
                    _isConnected = true;

                    // переподключение будет работать только во время работы биржи РТС
                    // (чтобы отключить переподключение когда торгов нет штатно, например, ночью)
                    Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;

                    // подписываемся на событие об успешном восстановлении соединения
                    Trader.Restored += () =>
                    {
                        Log("Connection restored");
                    }; // MessageBox.Show(this, LocalizedStrings.Str2958));

                    // подписываемся на событие разрыва соединения
                    Trader.ConnectionError += error =>
                    {
                        Log(error.ToString());
                    }; //this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                    // подписываемся на ошибку обработки данных (транзакций и маркет)
                    Trader.Error += error => { Log(error.ToString()); };
                    //	this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));

                    // подписываемся на ошибку подписки маркет-данных
                    Trader.MarketDataSubscriptionFailed += (security, msg, error) => { Log(error.ToString()); };
                    // this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, security)));

                    Trader.NewSecurity += Securities.Add;
                    //Trader.NewMyTrade += _myTradesWindow.TradeGrid.Trades.Add;
                    //Trader.NewTrade += _tradesWindow.TradeGrid.Trades.Add;
                    Trader.NewOrder     += Orders.Add;
                    Trader.NewStopOrder += Orders.Add;
                    //Trader.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail;
                    //Trader.StopOrderRegisterFailed += _stopOrdersWindow.OrderGrid.AddRegistrationFail;
                    Trader.OrderCancelFailed += fail => { Log(fail.Error.Message); };
                    // this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981));
                    Trader.StopOrderCancelFailed += fail => { Log(fail.Error.Message); };
                    //this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981));
                    Trader.NewPortfolio += Portfolios.Add;
                    Trader.NewPosition  += Positions.Add;

                    Trader.MassOrderCancelFailed += (transId, error) => { Log(error.ToString()); };
                    //this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str716));

                    // устанавливаем поставщик маркет-данных
                    // _securitiesWindow.SecurityPicker.MarketDataProvider = Trader;

                    //ShowSecurities.IsEnabled = ShowTrades.IsEnabled =
                    //    ShowMyTrades.IsEnabled = ShowOrders.IsEnabled =
                    //        ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = true;

                    Trader.Connect();

                    _isConnected = true;

                    bStopJobs = false;

                    terminal = toTerminal;
                    //var advs = MainService.thisGlobal.GetAdvisersByTerminal(terminal.Id);
                    Portfolio portfolio = null;
                    try
                    {
                        var res = service.GetAdvisers().Where(x => x.TerminalId == toTerminal.Id);
                        foreach (var adv in res)
                        {
                            if (!adv.Disabled)
                            {
                                QUIKExpert quikE = new QUIKExpert(adv);
                                advisers.Add(adv.Id, quikE);
                                service.SubscribeToSignals(adv.Id);
                                if (string.IsNullOrEmpty(adv.State))
                                {
                                    adv.State = quikE.Serialize();
                                    service.UpdateAdviser(adv);
                                }

                                if (portfolio == null)
                                {
                                    portfolio = Portfolios.Where(x => x.Name == quikE.PortfolioName).FirstOrDefault();
                                }
                            }
                        }

                        Log("Successfully connected to <QUIK>");
                    }
                    catch (Exception e)
                    {
                        log.Error(e);
                    }

                    return(true);
                }

                Trader.Disconnect();

                _isConnected = false;
                return(false);
            }
            catch (Exception e)
            {
                Log(e.ToString());
            }

            return(false);
        }