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); }
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; }
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; }
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; }
private void Assets_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { var asset = SelectedAsset; _options.Clear(); _options.AddRange(asset.GetDerivatives(Connector)); ProcessPositions(); }
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); } } }
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); }
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; }
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; }
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; }
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); //} }
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(); } } }
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; } }
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; }
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(); }
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]); } }
private void TraderOnNewScannerResults(ScannerFilter filter, IEnumerable <ScannerResult> results) { _results.AddRange(results); }
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); }
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(); } }
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(); }