示例#1
0
 public GroupedObservableCollection(Func <TElement, TKey> readKey, IEnumerable <TElement> items, Func <TElement, TKey> orderFunc)
     : this(readKey)
 {
     Elements = new ThreadSafeObservableCollection <TElement>();
     // var ordered = items.OrderBy(orderFunc);
     Elements.AddRange(items);
 }
 /// <summary>
 /// Adds all albums to <see cref="AlbumCollection"/>.
 /// </summary>
 /// <remarks>This is still experimental, a lot of performance improvements are needed.
 /// For instance, for each loop needs to be removed.
 /// Maybe we can use direct database queries and fill the AlbumCollection with it?
 /// </remarks>
 public async Task AddAlbums(IEnumerable <Mediafile> mediafiles)
 {
     var files = mediafiles.ToList();
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         List <Album> albums = new List <Album>();
         foreach (var song in files)
         {
             Album alb = null;
             if (!albums.Any(t => t.AlbumName == song.Album && t.Artist == song.LeadArtist))
             {
                 alb           = new Album();
                 alb.AlbumName = song.Album;
                 alb.Artist    = song.LeadArtist;
                 alb.AlbumArt  = string.IsNullOrEmpty(song.AttachedPicture) ? null : song.AttachedPicture;
                 albums.Add(alb);
             }
             if (albums.Any())
             {
                 albums.FirstOrDefault(t => t.AlbumName == song.Album && t.Artist == song.LeadArtist).AlbumSongs.Add(song);
             }
         }
         albumCollection.Insert(albums);
         AlbumCollection.AddRange(albums);
     }).AsTask().ConfigureAwait(false);
 }
示例#3
0
        private void UpdateProvider(ISecurityProvider provider)
        {
            if (_securityProvider == provider)
            {
                return;
            }

            if (_securityProvider != null)
            {
                _securityProvider.Added   -= AddSecurities;
                _securityProvider.Removed -= RemoveSecurities;
                _securityProvider.Cleared -= ClearSecurities;

                SecurityTextBox.ItemsSource = Enumerable.Empty <Security>();
                _itemsSource = null;
            }

            _securityProvider = provider;

            if (_securityProvider == null)
            {
                return;
            }

            var itemsSource = new ObservableCollectionEx <Security>();

            _itemsSource = new ThreadSafeObservableCollection <Security>(itemsSource);
            _itemsSource.AddRange(_securityProvider.LookupAll());

            _securityProvider.Added   += AddSecurities;
            _securityProvider.Removed += RemoveSecurities;
            _securityProvider.Cleared += ClearSecurities;

            SecurityTextBox.ItemsSource = itemsSource;
        }
示例#4
0
		private void UpdateProvider(ISecurityProvider provider)
		{
			if (_securityProvider == provider)
				return;

			if (_securityProvider != null)
			{
				_securityProvider.Added -= AddSecurities;
				_securityProvider.Removed -= RemoveSecurities;
				_securityProvider.Cleared -= ClearSecurities;

				SecurityTextBox.ItemsSource = Enumerable.Empty<Security>();
				_itemsSource = null;
			}

			_securityProvider = provider;

			if (_securityProvider == null)
				return;

			var itemsSource = new ObservableCollectionEx<Security>();

			_itemsSource = new ThreadSafeObservableCollection<Security>(itemsSource);
			_itemsSource.AddRange(_securityProvider.LookupAll());

			_securityProvider.Added += AddSecurities;
			_securityProvider.Removed += RemoveSecurities;
			_securityProvider.Cleared += ClearSecurities;

			SecurityTextBox.ItemsSource = itemsSource;
		}
示例#5
0
        private async void HandleExecuteCmdMessage(Message message)
        {
            if (message.Payload == null)
            {
                return;
            }

            if (message.Payload is List <object> list)
            {
                double volume = 0;
                if ((double)list[3] == 50.0)
                {
                    volume = SettingsHelper.GetLocalSetting <double>("volume", 50.0);
                }
                else
                {
                    volume = (double)list[3];
                }
                Mediafile libraryMediaFile = null;
                if (list[0] is IReadOnlyList <IStorageItem> files)
                {
                    List <Mediafile> mediafileList = new List <Mediafile>(files.Count);
                    foreach (IStorageItem item in files)
                    {
                        if (item.IsOfType(StorageItemTypes.File))
                        {
                            mediafileList.Add(await TagReaderHelper.CreateMediafile(item as StorageFile));
                        }
                    }
                    NowPlayingQueue = new ThreadSafeObservableCollection <Mediafile>();
                    NowPlayingQueue.AddRange(mediafileList);
                    libraryMediaFile = NowPlayingQueue[0];
                }
                else
                {
                    var id = SettingsHelper.GetLocalSetting <long>("NowPlayingID", 0L);
                    libraryMediaFile = _service.GetMediafile(id);
                    if (libraryMediaFile == null)
                    {
                        var path = SettingsHelper.GetLocalSetting <string>("path", null);
                        if (path != null)
                        {
                            if (await Task.Run(() => File.Exists(path)))
                            {
                                libraryMediaFile = await TagReaderHelper.CreateMediafile(await StorageFile.GetFileFromPathAsync(path));
                            }
                        }
                    }
                }

                await Load(libraryMediaFile, (bool)list[2], (double)list[1], volume);
            }
            else
            {
                GetType().GetTypeInfo().GetDeclaredMethod(message.Payload as string)?.Invoke(this, new object[] { });
            }

            message.HandledStatus = MessageHandledStatus.HandledCompleted;
        }
示例#6
0
        private void Assets_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var asset = SelectedAsset;

            _options.Clear();
            _options.AddRange(asset.GetDerivatives(Connector));

            ProcessPositions();
        }
示例#7
0
        private void Refresh(String guid, ThreadSafeObservableCollection <UsbDeviceViewModel> deviceList, UsbDeviceViewModel selectedDevice, Action <UsbDeviceViewModel> setSelectedDevice, String deviceId = null, String devicePath = null)
        {
            if (String.IsNullOrEmpty(deviceId) && String.IsNullOrEmpty(devicePath))
            {
                if (selectedDevice != null)
                {
                    deviceId = selectedDevice.DeviceId;
                }
                else if (deviceList.Count > 0)
                {
                    deviceId = deviceList[0].DeviceId;
                }
            }

            deviceList.Clear();

            UsbDevice[] usbDevices = UsbDevice.GetDevices(new Guid(guid));

            List <UsbDeviceViewModel> usbDeviceViewModels = new List <UsbDeviceViewModel>();

            foreach (UsbDevice usbDevice in usbDevices)
            {
                usbDeviceViewModels.Add(new UsbDeviceViewModel(usbDevice));
            }

            deviceList.AddRange(usbDeviceViewModels);

            if (!String.IsNullOrEmpty(deviceId))
            {
                foreach (UsbDeviceViewModel usbDeviceViewModel in deviceList)
                {
                    if (usbDeviceViewModel.DeviceId.Equals(deviceId, StringComparison.CurrentCultureIgnoreCase))
                    {
                        setSelectedDevice(usbDeviceViewModel);
                        return;
                    }
                }
            }

            if (!String.IsNullOrEmpty(devicePath))
            {
                foreach (UsbDeviceViewModel usbDeviceViewModel in deviceList)
                {
                    if (usbDeviceViewModel.DevicePath.Equals(devicePath, StringComparison.CurrentCultureIgnoreCase))
                    {
                        setSelectedDevice(usbDeviceViewModel);
                        return;
                    }
                }
            }

            if (deviceList.Count > 0)
            {
                setSelectedDevice(deviceList[0]);
            }
        }
 void LoadPlaylists()
 {
     Options.Add(new ContextMenuCommand(AddToPlaylistCommand, "New Playlist"));
     PlaylistCollection.AddRange(TracksCollection.Elements.SelectMany(t => t.Playlists));
     PlaylistCollection.AddRange(db.playlists.FindAll());
     foreach (var list in PlaylistCollection.DistinctBy(t => t.Name))
     {
         if (list.Songs.Count <= 0)
         {
             AddPlaylist(new Dictionary <Playlist, IEnumerable <Mediafile> >(), list.Name, list.Description);
         }
         else
         {
             var dict = new Dictionary <Playlist, IEnumerable <Mediafile> >();
             dict.Add(list, list.Songs);
             AddPlaylist(dict, list.Name, list.Description);
         }
     }
 }
示例#9
0
        public async Task <ThreadSafeObservableCollection <Mediafile> > ShuffledCollection()
        {
            var shuffled = new ThreadSafeObservableCollection <Mediafile>();
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                shuffled.AddRange(TracksCollection.Elements.ToList());
                shuffled.Shuffle();
            });

            return(shuffled);
        }
示例#10
0
		private void FillBoards(IExchangeInfoProvider provider)
		{
			var itemsSource = new ObservableCollectionEx<ExchangeBoard> { _emptyBoard };
			var boards = new ThreadSafeObservableCollection<ExchangeBoard>(itemsSource);

			boards.AddRange(provider.Boards);

			provider.BoardAdded += boards.Add;
			
			Boards = boards;
		}
示例#11
0
        private void FillBoards(IExchangeInfoProvider provider)
        {
            var itemsSource = new ObservableCollectionEx <ExchangeBoard> {
                _emptyBoard
            };
            var boards = new ThreadSafeObservableCollection <ExchangeBoard>(itemsSource);

            boards.AddRange(provider.Boards);

            provider.BoardAdded += boards.Add;

            Boards = boards;
        }
示例#12
0
        public SessionsPanel()
        {
            InitializeComponent();

            Sessions.GroupingColumnConverters.Add("Session.Type", (IValueConverter)Resources["enumConverter"]);

            var source     = new ObservableCollectionEx <SessionStrategy>();
            var strategies = new ThreadSafeObservableCollection <SessionStrategy>(source);

            strategies.AddRange(Registry.Sessions.SelectMany(s =>
            {
                s.Strategies.Added += strategies.Add;
                return(s.Strategies.ToArray());
            }));
            Registry.Sessions.Added += s =>
            {
                s.Strategies.Added += strategies.Add;
            };

            IValueConverter converter = new StatisticsStorageConverter();

            _view        = CollectionViewSource.GetDefaultView(source);
            _view.Filter = obj =>
            {
                var sessionStrategy = obj as SessionStrategy;
                if (sessionStrategy != null)
                {
                    var result = sessionStrategy.Session.StartTime >= FromDate && sessionStrategy.Session.EndTime <= ToDate;

                    var profitValue = converter.Convert(sessionStrategy.Statistics, typeof(string), "Net Profit", CultureInfo.CurrentCulture);
                    if (profitValue != null)
                    {
                        var profit = profitValue.To <decimal>();
                        result &= profit >= ProfitFrom && profit <= ProfitTo;
                    }
                    else
                    {
                        result &= ShowEmptyProfit.IsChecked == true;
                    }

                    return(result);
                }

                return(true);
            };

            Sessions.ItemsSource = source;
        }
示例#13
0
 public GroupedObservableCollection(Func <TElement, TKey> readKey, IEnumerable <TElement> items)
     : this(readKey)
 {
     //this.readKey = readKey;
     Elements = new ThreadSafeObservableCollection <TElement>();
     Elements.AddRange(items);
     // this.AddRange(items, false);
     foreach (var item in items)
     {
         this.AddItem(item);
     }
     //foreach (var item in items)
     //{
     //    this.AddItem(item, false);
     //}
 }
示例#14
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();
                }
            }
        }
示例#15
0
        private void UpdateProvider(IExchangeInfoProvider provider)
        {
            _exchanges.Clear();

            if (_exchangeInfoProvider != null)
            {
                _exchangeInfoProvider.ExchangeAdded -= _exchanges.Add;
            }

            _exchangeInfoProvider = provider;

            if (_exchangeInfoProvider != null)
            {
                _exchanges.AddRange(_exchangeInfoProvider.Exchanges);
                _exchangeInfoProvider.ExchangeAdded += _exchanges.Add;
            }
        }
示例#16
0
		public SessionsPanel()
		{
			InitializeComponent();

			Sessions.GroupingColumnConverters.Add("Session.Type", (IValueConverter)Resources["enumConverter"]);

			var source = new ObservableCollectionEx<SessionStrategy>();
			var strategies = new ThreadSafeObservableCollection<SessionStrategy>(source);
			strategies.AddRange(Registry.Sessions.SelectMany(s =>
			{
				s.Strategies.Added += strategies.Add;
				return s.Strategies.ToArray();
			}));
			Registry.Sessions.Added += s =>
			{
				s.Strategies.Added += strategies.Add;
			};

			IValueConverter converter = new StatisticsStorageConverter();

			_view = CollectionViewSource.GetDefaultView(source);
			_view.Filter = obj =>
			{
				var sessionStrategy = obj as SessionStrategy;
				if (sessionStrategy != null)
				{
					var result = sessionStrategy.Session.StartTime >= FromDate && sessionStrategy.Session.EndTime <= ToDate;

					var profitValue = converter.Convert(sessionStrategy.Statistics, typeof(string), "Net Profit", CultureInfo.CurrentCulture);
					if (profitValue != null)
					{
						var profit = profitValue.To<decimal>();
						result &= profit >= ProfitFrom && profit <= ProfitTo;
					}
					else
						result &= ShowEmptyProfit.IsChecked == true;

					return result;
				}

				return true;
			};

			Sessions.ItemsSource = source;
		}
示例#17
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();
        }
示例#18
0
 private void AddSecurities(IEnumerable <Security> securities)
 {
     _itemsSource.AddRange(securities);
 }
        private void Refresh(String guid, ThreadSafeObservableCollection<UsbDeviceViewModel> deviceList, UsbDeviceViewModel selectedDevice, Action<UsbDeviceViewModel> setSelectedDevice, String deviceId = null, String devicePath = null)
        {
            if (String.IsNullOrEmpty(deviceId) && String.IsNullOrEmpty(devicePath))
            {
                if (selectedDevice != null)
                {
                    deviceId = selectedDevice.DeviceId;
                }
                else if (deviceList.Count > 0)
                {
                    deviceId = deviceList[0].DeviceId;
                }
            }

            deviceList.Clear();

            UsbDevice[] usbDevices = UsbDevice.GetDevices(new Guid(guid));

            List<UsbDeviceViewModel> usbDeviceViewModels = new List<UsbDeviceViewModel>();
            foreach (UsbDevice usbDevice in usbDevices)
            {
                usbDeviceViewModels.Add(new UsbDeviceViewModel(usbDevice));
            }

            deviceList.AddRange(usbDeviceViewModels);

            if (!String.IsNullOrEmpty(deviceId))
            {
                foreach (UsbDeviceViewModel usbDeviceViewModel in deviceList)
                {
                    if (usbDeviceViewModel.DeviceId.Equals(deviceId, StringComparison.CurrentCultureIgnoreCase))
                    {
                        setSelectedDevice(usbDeviceViewModel);
                        return;
                    }
                }
            }

            if (!String.IsNullOrEmpty(devicePath))
            {
                foreach (UsbDeviceViewModel usbDeviceViewModel in deviceList)
                {
                    if (usbDeviceViewModel.DevicePath.Equals(devicePath, StringComparison.CurrentCultureIgnoreCase))
                    {
                        setSelectedDevice(usbDeviceViewModel);
                        return;
                    }
                }
            }

            if (deviceList.Count > 0)
            {
                setSelectedDevice(deviceList[0]);
            }
        }
示例#20
0
 private void TraderOnNewScannerResults(ScannerFilter filter, IEnumerable <ScannerResult> results)
 {
     _results.AddRange(results);
 }
示例#21
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Connector != null && !(Connector is FakeConnector))
            {
                return;
            }

            PosChart.Positions.Clear();
            PosChart.AssetPosition = null;
            PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset));

            // create connection
            Connector = new QuikTrader();

            //_trader = new PlazaTrader { IsCGate = true };
            //_trader.Tables.Add(_trader.TableRegistry.Volatility);

            Portfolio.Portfolios = new PortfolioDataSource(Connector);

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            // fill underlying asset's list
            Connector.NewSecurities += securities =>
                                       _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));

            Connector.SecuritiesChanged += securities =>
            {
                if ((PosChart.AssetPosition != null && securities.Contains(PosChart.AssetPosition.Security)) || PosChart.Positions.Cache.Select(p => p.Security).Intersect(securities).Any())
                {
                    _isDirty = true;
                }
            };

            // subscribing on tick prices and updating asset price
            Connector.NewTrades += trades =>
            {
                var assetPos = PosChart.AssetPosition;
                if (assetPos != null && trades.Any(t => t.Security == assetPos.Security))
                {
                    _isDirty = true;
                }
            };

            Connector.NewPositions += positions => this.GuiAsync(() =>
            {
                var asset = SelectedAsset;

                if (asset == null)
                {
                    return;
                }

                var assetPos = positions.FirstOrDefault(p => p.Security == asset);
                var newPos   = positions.Where(p => p.Security.UnderlyingSecurityId == asset.Id).ToArray();

                if (assetPos == null && newPos.Length == 0)
                {
                    return;
                }

                if (assetPos != null)
                {
                    PosChart.AssetPosition = assetPos;
                }

                if (newPos.Length > 0)
                {
                    PosChart.Positions.AddRange(newPos);
                }

                RefreshChart();
            });

            Connector.PositionsChanged += positions => this.GuiAsync(() =>
            {
                if ((PosChart.AssetPosition != null && positions.Contains(PosChart.AssetPosition)) || positions.Intersect(PosChart.Positions.Cache).Any())
                {
                    RefreshChart();
                }
            });

            Connector.Connect();
        }
 private void OnNewPortfolios(IEnumerable <Portfolio> portfolios)
 {
     _portfolios.AddRange(portfolios);
 }
示例#23
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();
            }
        }
示例#24
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            var isDde = IsDde.IsChecked == true;

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

            if (Connector != null && !(Connector is FakeConnector))
            {
                return;
            }

            PosChart.Positions.Clear();
            PosChart.AssetPosition = null;
            PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset));

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

            if (isDde)
            {
                // изменяем метаданные так, чтобы начали обрабатывать дополнительные колонки опционов
                var columns = ((QuikTrader)Connector).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);
            }

            //_trader = new PlazaTrader { IsCGate = true };
            //_trader.Tables.Add(_trader.TableRegistry.Volatility);

            Portfolio.Connector = Connector;

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            // добавляем базовые активы в список
            Connector.NewSecurities += securities =>
                                       _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));

            Connector.SecuritiesChanged += securities =>
            {
                if ((PosChart.AssetPosition != null && securities.Contains(PosChart.AssetPosition.Security)) || PosChart.Positions.Cache.Select(p => p.Security).Intersect(securities).Any())
                {
                    _isDirty = true;
                }
            };

            // подписываемся на событие новых сделок чтобы обновить текущую цену фьючерса
            Connector.NewTrades += trades =>
            {
                var assetPos = PosChart.AssetPosition;
                if (assetPos != null && trades.Any(t => t.Security == assetPos.Security))
                {
                    _isDirty = true;
                }
            };

            Connector.NewPositions += positions => this.GuiAsync(() =>
            {
                var asset = SelectedAsset;

                if (asset == null)
                {
                    return;
                }

                var assetPos = positions.FirstOrDefault(p => p.Security == asset);
                var newPos   = positions.Where(p => p.Security.UnderlyingSecurityId == asset.Id).ToArray();

                if (assetPos == null && newPos.Length == 0)
                {
                    return;
                }

                if (assetPos != null)
                {
                    PosChart.AssetPosition = assetPos;
                }

                if (newPos.Length > 0)
                {
                    PosChart.Positions.AddRange(newPos);
                }

                RefreshChart();
            });

            Connector.PositionsChanged += positions => this.GuiAsync(() =>
            {
                if ((PosChart.AssetPosition != null && positions.Contains(PosChart.AssetPosition)) || positions.Intersect(PosChart.Positions.Cache).Any())
                {
                    RefreshChart();
                }
            });

            Connector.Connect();
        }