vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/21/2013
					
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
								 
							 | 
						 
					 
			
					 
					 
					
	
			Работаю над закачкой маркет данных (свой аналог Гидры). Плаза коннектор. Попробовал перевести закачку SecurityChanges на Level1Change. Получаю данные так:  Code
        readonly HashSet<Level1Fields> _level1Fields = new HashSet<Level1Fields>(new[]
            {
                Level1Fields.AsksCount,
                Level1Fields.AsksVolume,
                Level1Fields.BidsCount,
                Level1Fields.BidsVolume,
                Level1Fields.HistoricalVolatility,
                Level1Fields.ImpliedVolatility,
                Level1Fields.MarginBuy,
                Level1Fields.MarginSell,
                Level1Fields.StepPrice,
                Level1Fields.PriceStep,
                Level1Fields.OpenInterest,
            });
        private void OnSecuritiesChanged(IEnumerable<Security> securities)
        {
            foreach (var security in securities)
            {
                var changeMessage = security.GetNewChanges(_level1Fields);
                _saveManager.Level1ChangeMessages.Enqueue(changeMessage);
            }
        }
 Сохраняю данные так:  Code
                var level1ChangeMessagesBySecurity =
                    from c in level1ChangeMessagesFromQueue
                    group c by c.SecurityId
                        into g
                        select g;
                foreach (var level1ChangeMessageBySecurity in level1ChangeMessagesBySecurity)
                {
                    var level1ChangeStorage = _storageRegistry.GetLevel1ChangeStorage(new Security() { Id = level1ChangeMessageBySecurity.Key.Native.ToString()}, _defaultDrive);
                    try
                    {
                        level1ChangeStorage.Save(level1ChangeMessageBySecurity);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Ошибка при сохранении изменений инструментов", e);
                    }
                }
 При сохранении получаю ошибку:  Code
{"Unable to cast object of type 'Grouping[StockSharp.Messages.SecurityId,StockSharp.Messages.Level1ChangeMessage]' to type 'System.Collections.Generic.IEnumerable`1[StockSharp.Algo.Storages.SecurityChange]'."}
 Не понятно почему идет попытка привести StockSharp.Messages.Level1ChangeMessage к типу StockSharp.Algo.Storages.SecurityChange. Предполагаю это баг.
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					Mikhail Sukhov 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/21/2013
					
					
			
					 
					 
					
	
			vk37 Работаю над закачкой маркет данных (свой аналог Гидры). Плаза коннектор. Попробовал перевести закачку SecurityChanges на Level1Change.  Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/21/2013
					
					
			
					 
					 
					
	
			Михаил Сухов 
  Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.
  Тогда получается как-то так: Code
                var messagesBySecurity =
                    from c in messagesFromQueue
                    group c by c.SecurityId
                        into g
                        select g;
                foreach (var messageBySecurity in messagesBySecurity)
                {
                    var security = new Security() {Id = messageBySecurity.Key.Native.ToString()};
                    var securityChangeStorage = _storageRegistry.GetSecurityChangeStorage(security, _defaultDrive);
                    try
                    {
                        var securityChanges = new List<SecurityChange>();
                        foreach (var message in messageBySecurity)
                            foreach (var change in message.Changes)
                                securityChanges.Add(new SecurityChange(security, message.LocalTimeStamp, change.Type, change.Value));
                        securityChangeStorage.Save(securityChanges);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Ошибка при сохранении изменений инструментов", e);
                    }
                }
 Или есть способ проще?
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/27/2013
					
					
			
					 
					 
					
	
			Михаил Сухов Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.  SC.Time брать из  L1Msg.LocalTimeStamp?
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/27/2013
					
					
			
					 
					 
					
	
			Кстати при вызове security.GetNewChanges приходит огромное количество Level1ChangeMessage с отсутствующими изменениями.
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					Mikhail Sukhov 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/28/2013
					
					
			
					 
					 
					
	
			vk37 Кстати при вызове security.GetNewChanges приходит огромное количество Level1ChangeMessage с отсутствующими изменениями.  Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/28/2013
					
					
			
					 
					 
					
	
			Михаил Сухов Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)  Code
!changeMessage.Changes.Any() 
 
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					Mikhail Sukhov 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/28/2013
					
					
			
					 
					 
					
	
			vk37 Михаил Сухов Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)  Code
!changeMessage.Changes.Any() 
  Я выбираю "Помощь зала"
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/29/2013
					
					
			
					 
					 
					
	
			Михаил Сухов Я выбираю "Помощь зала"   )) Ну в общем, этот код возвращает большое количество Level1ChangeMessage у которого в коллекции Changes отсутствуют элементы. Code
        readonly HashSet<Level1Fields> _level1Fields = new HashSet<Level1Fields>(new[]
            {
                Level1Fields.AsksCount,
                Level1Fields.AsksVolume,
                Level1Fields.BidsCount,
                Level1Fields.BidsVolume,
                Level1Fields.HistoricalVolatility,
                Level1Fields.ImpliedVolatility,
                Level1Fields.MarginBuy,
                Level1Fields.MarginSell,
                Level1Fields.StepPrice,
                Level1Fields.PriceStep,
                Level1Fields.OpenInterest,
            });
        private void OnSecuritiesChanged(IEnumerable<Security> securities)
        {
            foreach (var security in securities)
            {
                var changeMessage = security.GetNewChanges(_level1Fields);
                if (!changeMessage.Changes.Any())
                    continue;
            }
        }
 
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					vk37 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Date: 11/29/2013
					
					
			
					 
					 
					
	
			vk37 Михаил Сухов Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.  SC.Time брать из  L1Msg.LocalTimeStamp?  Ответ:  http://stocksharp.com/posts/m/28536/
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Thanks:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 |