/// <summary> /// Добавить первый уровень маркет-данных. /// </summary> /// <param name="security">Инструмент.</param> /// <param name="message">Первый уровень маркет-данных.</param> protected virtual void AddLevel1Change(Security security, Level1ChangeMessage message) { if (security == null) { throw new ArgumentNullException("security"); } if (message == null) { throw new ArgumentNullException("message"); } message = (Level1ChangeMessage)message.Clone(); foreach (var change in message.Changes.ToArray()) { if (!_task.Settings.SupportedLevel1Fields.Contains(change.Key)) { message.Changes.Remove(change.Key); } } if (message.Changes.Count > 0) { _level1Buffer.Add(security, message); } }
private void ProcessLevel1ChangeMessage(Level1ChangeMessage message) { var security = LookupSecurity(message.SecurityId); if (UpdateSecurityByLevel1) { security.ApplyChanges(message); RaiseSecurityChanged(security); } var values = GetSecurityValues(security); lock (values.SyncRoot) { foreach (var change in message.Changes) values[(int)change.Key] = change.Value; } RaiseValuesChanged(security, message.Changes, message.ServerTime, message.LocalTime); if (CreateDepthFromLevel1) { // генерация стакана из Level1 var quoteMsg = GetBuilder(message.SecurityId).Process(message); if (quoteMsg != null) { ProcessQuotesMessage(security, quoteMsg, true); CreateAssociatedSecurityQuotes(quoteMsg); } } if (CreateAssociatedSecurity && !IsAssociated(message.SecurityId.BoardCode)) { // обновление BestXXX для ALL из конкретных тикеров var clone = (Level1ChangeMessage)message.Clone(); clone.SecurityId = CreateAssociatedId(clone.SecurityId); ProcessLevel1ChangeMessage(clone); } }