private void OnConnect()
        {
            _connector = new QuikTrader()
            {
                LuaFixServerAddress = "127.0.0.1:5002".To <EndPoint>()
            };
            SecurityEditor.SecurityProvider = _connector;
            _candleManager = new CandleManager(_connector);

            _connector.Connected += () =>
            {
                this.GuiAsync(() =>
                {
                    StatusTextBlock.Text  = "Соединение установлено!";
                    ConnectButtom.Content = "Разъединить";
                });
            };

            _connector.Disconnected += () =>
            {
                this.GuiAsync(() =>
                {
                    StatusTextBlock.Text  = "Соединение разорвано!";
                    ConnectButtom.Content = "Соединить";
                });
            };

            // Это обработчик событие получения свечи
            _candleManager.Processing += (series, candle) =>
            {
                if (series != _series)
                {
                    return;
                }

                // Используем только завершенные свечи
                if (candle.State != CandleStates.Finished)
                {
                    return;
                }

                // Рассчитываем значение индикатора
                var smaValue = _sma.Process(candle);

                // Создаем экземпляр класса ChartDrawData - класс, где группируются данные для отрисовки
                var data = new ChartDrawData();

                // chartItem - набор элементов, привязанных к одной точке на шкале X
                var chartItem = data.Group(candle.OpenTime).Add(_candleElement, candle);
                chartItem.Add(_indicatorElement, smaValue);

                // Безопасно отрисовываем элементы на графике
                this.GuiSync(() =>
                {
                    Chart.Draw(data);
                });
            };

            _connector.Connect();
        }
Пример #2
0
        public ChartWindow(CandleSeries candleSeries, DateTime from, DateTime to)
        {
            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);

            _trader.CandleSeriesProcessing += ProcessNewCandle;
            _trader.SubscribeCandles(_candleSeries, @from, to);

            Title = candleSeries.ToString();
        }
Пример #3
0
        private void Check_Click(object sender, RoutedEventArgs e)
        {
            var terminal = this.SelectedTerminal;

            if (terminal.SystemProcess.MainModule == null)
            {
                throw new InvalidOperationException("Неподходящий процесс для обработки.");
            }

            this.OkResult.SetVisibility(false);

            _settingErrors.Clear();

            var trader = new QuikTrader(terminal.SystemProcess.MainModule.FileName);

            trader.Connected += () => this.GuiAsync(() =>
            {
                if (this.CheckDde.IsChecked == true)
                {
                    trader.StartExport();
                }

                OnConnect(trader, null);
            });

            trader.ConnectionError += error => this.GuiSync(() => OnConnect(trader, error));

            if (this.CheckDde.IsChecked == true)
            {
                trader.ProcessDataError += error => _settingErrors.Add(new SettingsError("Экспорт DDE. {0}".Put(error.Message), true));
            }

            trader.Connect();
        }
        public Strategy(MainWindow mWnd)
        {
            mainWindow = mWnd;
            InitializeComponent();

            trader = mainWindow.Trader;
            cbSecurity.ItemsSource  = trader.Securities;
            cbPortfolio.ItemsSource = trader.Portfolios;

            txtSteps.Text = countOfSteps.ToString();
        }
Пример #5
0
     //   CandleSeries candleseries = new CandleSeries();
         public  void Connect()
         {// quiktrader.DdeTables = new [] {quiktrader.SecuritiesTable}
           var terminal = QuikTerminal.Get(@"C:\BCS_Work\Учебный QUIK БКС");
            if (!terminal.IsLaunched)
            {
                 quiktrader = new QuikTrader(QuikTerminal.GetDefaultPath()) { Path = QuikTerminal.GetDefaultPath() };                 
                 

                
                    Console.WriteLine("Запускается Quik...");                    
                 

            //candleseries = new CandleSeries();
            //candlemanager.Start(candleseries);

        }
Пример #6
0
        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            if (this.Path.Text.IsEmpty())
            {
                MessageBox.Show(this, "Путь к Quik не выбран");
            }
            else
            {
                if (_trader == null)
                {
                    // создаем шлюз
                    _trader = new QuikTrader(this.Path.Text);

                    this.Portfolio.Trader = _trader;

                    // изменяем метаданные так, чтобы начали обрабатывать дополнительные колонки опционов
                    var columns = _trader.SecuritiesTable.Columns;
                    columns.Add(DdeSecurityColumns.Strike);
                    columns.Add(DdeSecurityColumns.Volatility);
                    columns.Add(DdeSecurityColumns.UnderlyingSecurity);
                    columns.Add(DdeSecurityColumns.TheorPrice);
                    columns.Add(DdeSecurityColumns.OptionType);
                    columns.Add(DdeSecurityColumns.ExpiryDate);

                    // добавляем в выпадающий список только опционы
                    _trader.NewSecurities += securities =>
                                             this.GuiAsync(() => _options.AddRange(securities.Where(s => s.Type == SecurityTypes.Option)));

                    // подписываемся на событие новых сделок чтобы обновить текущую цену фьючерса
                    _trader.NewTrades += trades => this.GuiAsync(() =>
                    {
                        var option = this.SelectedOption;
                        if (option != null)
                        {
                            var future = option.GetUnderlyingAsset();
                            if (future.LastTrade != null)
                            {
                                this.BaseActivePrice.Text = future.LastTrade.Price.ToString();
                            }
                        }
                    });

                    _trader.Connected += () => _trader.StartExport();
                    _trader.Connect();
                }
            }
        }
Пример #7
0
        private void OnConnect(QuikTrader trader, Exception connectionError)
        {
            if (connectionError == null)
            {
                _settingErrors.AddRange(trader.Terminal.GetTableSettings()
                                        .Select(r => new SettingsError(LocalizedStrings.Str3031Params.Put(r.Table.Caption, r.Error.Message), r.IsCritical)));

                if (_settingErrors.Count == 0)
                {
                    OkResult.SetVisibility(true);
                }
            }
            else
            {
                MessageBox.Show(this, connectionError.ToString(), "Verifier");
            }

            trader.Dispose();
        }
        static void Main(string[] args)
        {
            IConnector connector = new QuikTrader()
            {
                LuaFixServerAddress = "127.0.0.1:5001".To <EndPoint>(),
                LuaLogin            = "******",
                LuaPassword         = "******".To <SecureString>()
            };

            ConfigManager  configManager = ConfigManager.GetInstance();
            CommandHandler handler       = CommandHandler.GetInstance(connector);

            configManager.SetOutput(Console.WriteLine);
            handler.SetOutput(Console.WriteLine);

            configManager.PrintAllSettings();

            while (true)
            {
                var userMessage = Console.ReadLine()?.ToLower();

                handler.ParseUserMessage(userMessage);

                if (userMessage.CompareIgnoreCase(UserCommands.Dconn.ToString()))
                {
                    break;
                }
            }

            var counter = 10;

            while (connector.ConnectionState == ConnectionStates.Connected &&
                   counter > 0)
            {
                Console.WriteLine("Trying to close safety for {0} sec.", counter);
                Thread.Sleep(1000);
                counter--;
            }

            Console.WriteLine("Press any key to exit");
            Console.ReadLine();
        }
Пример #9
0
        private void CheckClick(object sender, RoutedEventArgs e)
        {
            var terminal = SelectedTerminal;

            if (terminal.SystemProcess.MainModule == null)
            {
                throw new InvalidOperationException(LocalizedStrings.InvalidProcess);
            }

            OkResult.SetVisibility(false);

            _settingErrors.Clear();

            var isDde = IsDde.IsChecked == true;

            var connector = new QuikTrader(terminal.SystemProcess.MainModule.FileName)
            {
                IsDde = isDde
            };

            var checkDde = isDde && CheckDde.IsChecked == true;

            connector.Connected += () => this.GuiAsync(() =>
            {
                if (checkDde)
                {
                    connector.StartExport();
                }

                OnConnect(connector, null);
            });

            connector.ConnectionError += error => this.GuiSync(() => OnConnect(connector, error));

            if (checkDde)
            {
                connector.ProcessDataError += error => _settingErrors.Add(new SettingsError(LocalizedStrings.Str3030Params.Put(error.Message), true));
            }

            connector.Connect();
        }
Пример #10
0
        public void Dispose()
        {
            if (_isConnected)
            {
                try
                {
                    bStopJobs = true;
                    if (Trader != null)
                    {
                        Trader.Disconnect();
                        Trader.Dispose();
                        Trader = null;
                    }

                    Log("Disconnected from <QUIK>");
                }
                catch (Exception e)
                {
                    Log("Problem Disconnecting <QUIK>" + e);
                }
            }
        }
Пример #11
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Path.Text.IsEmpty())
            {
                MessageBox.Show(this, LocalizedStrings.Str2969);
            }
            else
            {
                Trader = new QuikTrader(Path.Text)
                {
                    IsDde = true, IsAsyncMode = true
                };

                Portfolios.Connector = Trader;

                Trader.Connected     += () => this.GuiAsync(() => ExportDde.IsEnabled = true);
                Trader.NewSecurities += securities => _securitiesWindow.SecurityPicker.Securities.AddRange(securities);

                // подписываемся на событие о неудачной регистрации заявок
                Trader.OrdersRegisterFailed += OrdersFailed;
                // подписываемся на событие о неудачном снятии заявок
                Trader.OrdersCancelFailed += OrdersFailed;

                // подписываемся на событие о неудачной регистрации стоп-заявок
                Trader.StopOrdersRegisterFailed += OrdersFailed;
                // подписываемся на событие о неудачном снятии стоп-заявок
                Trader.StopOrdersCancelFailed += OrdersFailed;

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

                Trader.Connect();

                ShowSecurities.IsEnabled = true;
                ConnectBtn.IsEnabled     = false;
            }
        }
Пример #12
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Path.Text.IsEmpty())
            {
                MessageBox.Show(this, LocalizedStrings.Str2983);
            }
            else
            {
                _trader = new QuikTrader(Path.Text)
                {
                    IsDde = true
                };

                _trader.Connected     += () => this.GuiAsync(() => ExportDde.IsEnabled = true);
                _trader.NewSecurities += securities => this.GuiAsync(() => Security.ItemsSource = _trader.Securities);

                _trader.Connect();

                _candleManager             = new CandleManager(_trader);
                _candleManager.Processing += DrawCandle;

                ConnectBtn.IsEnabled = false;
            }
        }
Пример #13
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;
            }
        }
Пример #14
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();
        }
Пример #15
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            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.Str2983);
                    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
                };

                if (_trader.IsDde)
                {
                    _trader.DdeTables = new[] { _trader.SecuritiesTable, _trader.TradesTable };
                }

                _logManager.Sources.Add(_trader);
                // подписываемся на событие об успешном восстановлении соединения
                _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, type, error) =>
                                                        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security)));

                Security.SecurityProvider = new FilterableSecurityProvider(_trader);

                _trader.Connect();

                _candleManager             = new CandleManager(_trader);
                _candleManager.Processing += DrawCandle;

                ConnectBtn.IsEnabled = false;
            }
        }
Пример #16
0
        static void Main()
        {
            try
            {
                // для теста выбираем бумагу Лукойл
                const string secCode = "LKOH";

                var quikPath = QuikTerminal.GetDefaultPath();

                if (quikPath.IsEmpty())
                {
                    Console.WriteLine("Не найден ни один запущенный Quik");
                    return;
                }

                Console.WriteLine("Запущенный Quik найден по пути " + quikPath);

                Console.Write("Введите код клиента, через который будет выставлена заявка: ");
                var account = Console.ReadLine();

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

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

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

                        Console.WriteLine("Производим подключение...");

                        trader.Connect();

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

                        trader.NewPortfolios += portfolios =>
                        {
                            if (_portfolio == null)
                            {
                                // находим Лукойл и присваиваем ее переменной lkoh
                                _portfolio = portfolios.FirstOrDefault(p => p.Name == account);

                                if (_portfolio != null)
                                {
                                    Console.WriteLine("Портфель {0} появился.", account);

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

                        // подписываемся на событие появление инструментов
                        trader.NewSecurities += securities =>
                        {
                            if (_lkoh == null)
                            {
                                // находим Лукойл и присваиваем ее переменной lkoh
                                _lkoh = securities.FirstOrDefault(sec => sec.Code == secCode);

                                if (_lkoh != null)
                                {
                                    Console.WriteLine("Инструмент Лукойл появился.");

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

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

                        // подписываемся на событие появления моих новых сделок
                        trader.NewMyTrades += myTrades =>
                        {
                            foreach (var myTrade in myTrades)
                            {
                                var trade = myTrade.Trade;
                                Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
                            }
                        };

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

                                if (_depth != null)
                                {
                                    Console.WriteLine("Стакан Лукойла появился.");

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

                        Console.WriteLine("Дожидаемся появления в программе инструмента Лукойл и портфеля {0}...".Put(account));

                        // запускаем экспорт по DDE
                        trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
                                           trader.EquityPortfoliosTable, trader.OrdersTable);

                        // дожидаемся появления портфеля и инструмента
                        waitHandle.WaitOne();

                        // 0.1% от изменения цены
                        const decimal delta = 0.001m;

                        // запоминаем первоначальное значение середины спреда
                        var firstMid = _lkoh.BestPair.SpreadPrice / 2;
                        if (_lkoh.BestBid == null)
                        {
                            throw new Exception("Нет лучшего бида для котировки.");
                        }

                        Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _lkoh.BestBid.Price + firstMid);

                        while (true)
                        {
                            var mid = _lkoh.BestPair.SpreadPrice / 2;

                            // если спред вышел за пределы нашего диапазона
                            if (
                                ((firstMid + firstMid * delta) <= mid) ||
                                ((firstMid - firstMid * delta) >= mid)
                                )
                            {
                                var order = new Order
                                {
                                    Portfolio = _portfolio,
                                    Price     = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
                                    Security  = _lkoh,
                                    Volume    = 1,
                                    Direction = OrderDirections.Buy,
                                };
                                trader.RegisterOrder(order);
                                Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
                            }

                            // ждем 1 секунду
                            Thread.Sleep(1000);
                        }

                        // останавливаем экспорт по DDE
                        trader.StopExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
                                          trader.EquityPortfoliosTable, trader.OrdersTable);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
Пример #17
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();
            }
        }
Пример #18
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 = "Подключиться";
            }
        }
Пример #19
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);
            }
        }
Пример #20
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());
        }
    }
Пример #21
0
        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);
        }
Пример #22
0
        static void Main()
        {
            try
            {
                Console.Write(LocalizedStrings.Str2992);
                var account1 = Console.ReadLine();

                Console.Write(LocalizedStrings.Str2993);
                var account2 = Console.ReadLine();

                using (var quikTrader1 = new QuikTrader {
                    LuaFixServerAddress = "127.0.0.1:5001".To <EndPoint>()
                })
                    using (var quikTrader2 = new QuikTrader {
                        LuaFixServerAddress = "127.0.0.1:5002".To <EndPoint>()
                    })
                    {
                        // подписываемся на событие ошибок обработки данных и разрыва соединения
                        //
                        quikTrader1.Error += OnError;
                        quikTrader2.Error += OnError;

                        quikTrader1.ConnectionError += OnError;
                        quikTrader2.ConnectionError += OnError;


                        var portfoliosWait = new ManualResetEvent(false);

                        Action <IEnumerable <Portfolio> > newPortfolios = portfolios =>
                        {
                            if (_portfolio1 == null)
                            {
                                _portfolio1 = portfolios.FirstOrDefault(p => p.Name == account1);
                            }

                            if (_portfolio2 == null)
                            {
                                _portfolio2 = portfolios.FirstOrDefault(p => p.Name == account2);
                            }

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

                        // подписываемся на события новых портфелей
                        quikTrader1.NewPortfolios += newPortfolios;
                        quikTrader2.NewPortfolios += newPortfolios;


                        var securitiesWait = new ManualResetEvent(false);

                        // подписываемся на события новых инструментов
                        quikTrader1.NewSecurities += securities =>
                        {
                            if (_lkoh == null)
                            {
                                _lkoh = securities.FirstOrDefault(s => s.Code == "LKOH");
                            }

                            // если оба инструмента появились
                            if (_lkoh != null && _riz0 != null)
                            {
                                securitiesWait.Set();
                            }
                        };
                        quikTrader2.NewSecurities += securities =>
                        {
                            if (_riz0 == null)
                            {
                                _riz0 = securities.FirstOrDefault(s => s.Code == "RIZ0");
                            }

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


                        // запускаем экспорты в Quik-ах, когда получим событие об успешном соединении
                        //
                        quikTrader1.Connected += () =>
                        {
                            Console.WriteLine(LocalizedStrings.Str2994Params.Put(quikTrader1.LuaFixServerAddress));
                        };
                        quikTrader2.Connected += () =>
                        {
                            Console.WriteLine(LocalizedStrings.Str2994Params.Put(quikTrader2.LuaFixServerAddress));
                        };

                        // производим подключение каждого из QuikTrader-а
                        //
                        quikTrader1.Connect();
                        quikTrader2.Connect();

                        Console.WriteLine(LocalizedStrings.Str2995);
                        portfoliosWait.WaitOne();
                        securitiesWait.WaitOne();

                        Console.WriteLine(LocalizedStrings.Str2996);
                        if (_lkoh.BestBid == null || _riz0.BestBid == null)
                        {
                            throw new Exception(LocalizedStrings.Str2990);
                        }

                        quikTrader1.RegisterOrder(new Order
                        {
                            Portfolio = _portfolio1,
                            Volume    = 1,
                            Security  = _lkoh,
                            Price     = _lkoh.BestBid.Price
                        });
                        Console.WriteLine(LocalizedStrings.Str2997);

                        quikTrader2.RegisterOrder(new Order
                        {
                            Portfolio = _portfolio2,
                            Volume    = 1,
                            Security  = _riz0,
                            Price     = _riz0.BestBid.Price
                        });
                        Console.WriteLine(LocalizedStrings.Str2998);
                    }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
Пример #23
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();
            }
        }
        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);
            }
        }
Пример #25
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();
            }
        }
Пример #26
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (_connector == null)
            {
                if (IsQuik.IsChecked == true)
                {
                    var isDde = IsDde.IsChecked == true;

                    if (isDde && Path.Text.IsEmpty())
                    {
                        MessageBox.Show(this, LocalizedStrings.Str2969);
                        return;
                    }

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

                    if (isDde)
                    {
                        // изменяем метаданные так, чтобы начали обрабатывать дополнительные колонки опционов
                        var columns = trader.SecuritiesTable.Columns;
                        columns.Add(DdeSecurityColumns.Strike);
                        columns.Add(DdeSecurityColumns.ImpliedVolatility);
                        columns.Add(DdeSecurityColumns.UnderlyingSecurity);
                        columns.Add(DdeSecurityColumns.TheorPrice);
                        columns.Add(DdeSecurityColumns.OptionType);
                        columns.Add(DdeSecurityColumns.ExpiryDate);
                    }

                    _connector = trader;
                }
                else
                {
                    var trader = new PlazaTrader
                    {
                        Address = Address.Text.To <EndPoint>(),
                        IsCGate = IsCGate.IsChecked == true
                    };

                    trader.Tables.Add(trader.TableRegistry.Volatility);

                    if (IsAutorization.IsChecked == true)
                    {
                        trader.Login    = Login.Text;
                        trader.Password = Password.Password;
                    }

                    _connector = trader;
                }

                Desk.MarketDataProvider = _connector;
                Desk.SecurityProvider   = _connector;
                Desk.CurrentTime        = null;

                // добавляем в выпадающий список только фьючерсы
                _connector.NewSecurities += securities =>
                                            this.GuiAsync(() =>
                {
                    _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));

                    if (SelectedAsset == null && _assets.Count > 0)
                    {
                        SelectedAsset = _assets.First();
                    }

                    if (SelectedAsset != null)
                    {
                        var newStrikes = securities
                                         .Where(s => s.Type == SecurityTypes.Option && s.UnderlyingSecurityId.CompareIgnoreCase(SelectedAsset.Id))
                                         .ToArray();

                        if (newStrikes.Length > 0)
                        {
                            _options.AddRange(newStrikes);
                            Desk.Options = _options;
                            Desk.RefreshOptions();
                        }
                    }
                });

                _connector.SecuritiesChanged += securities =>
                {
                    this.GuiAsync(() =>
                    {
                        if (SelectedAsset == null)
                        {
                            return;
                        }

                        var newStrikes = securities
                                         .Where(s => s.Type == SecurityTypes.Option && s.UnderlyingSecurityId.CompareIgnoreCase(SelectedAsset.Id))
                                         .Where(s => !_options.Contains(s))
                                         .ToArray();

                        if (newStrikes.Length > 0)
                        {
                            _options.AddRange(newStrikes);
                            Desk.Options = _options;
                            Desk.RefreshOptions();
                        }

                        if (Desk.Options.Intersect(securities).Any())
                        {
                            Desk.RefreshOptions();
                        }
                    });
                };

                // подписываемся на событие новых сделок чтобы обновить текущую цену фьючерса
                _connector.NewTrades += trades => this.GuiAsync(() =>
                {
                    var asset = SelectedAsset;
                    if (asset == null)
                    {
                        return;
                    }

                    if (asset.LastTrade != null)
                    {
                        LastPrice.Text = asset.LastTrade.Price.To <string>();
                    }
                });

                _connector.Connected += () =>
                {
                    var trader = _connector as QuikTrader;
                    if (trader != null && trader.IsDde)
                    {
                        var quikTrader = trader;
                        quikTrader.StartExport(new[] { quikTrader.SecuritiesTable, quikTrader.TradesTable });
                    }
                    else
                    {
                        _connector.StartExport();
                    }
                };
            }

            if (_connector.ConnectionState == ConnectionStates.Connected)
            {
                _connector.Disconnect();
            }
            else
            {
                _connector.Connect();
            }
        }