/// <summary> /// Process <see cref="MarketDataMessage"/>. /// </summary> /// <param name="message">Market-data message (uses as a subscribe/unsubscribe in outgoing case, confirmation event in incoming case).</param> /// <param name="newOutMessage">New message event.</param> /// <returns>Market-data message (uses as a subscribe/unsubscribe in outgoing case, confirmation event in incoming case).</returns> public MarketDataMessage ProcessMarketData(MarketDataMessage message, Action <Message> newOutMessage) { if (message == null) { throw new ArgumentNullException(nameof(message)); } if (newOutMessage is null) { throw new ArgumentNullException(nameof(newOutMessage)); } if (message.From == null && Settings.DaysLoad == TimeSpan.Zero) { return(message); } if (message.IsSubscribe) { if (message.SecurityId.IsAllSecurity()) { return(message); } var transactionId = message.TransactionId; var lastTime = LoadMessages(message, message.From, message.To, transactionId, newOutMessage); if (message.To != null && lastTime != null && message.To <= lastTime) { _fullyProcessedSubscriptions.Add(transactionId); newOutMessage(new SubscriptionFinishedMessage { OriginalTransactionId = transactionId }); return(null); } if (lastTime != null) { if (!(message.DataType == MarketDataTypes.MarketDepth && message.From == null && message.To == null)) { var clone = message.TypedClone(); clone.From = lastTime; message = clone; message.ValidateBounds(); } } } else { if (_fullyProcessedSubscriptions.Remove(message.OriginalTransactionId)) { newOutMessage(new SubscriptionResponseMessage { OriginalTransactionId = message.TransactionId, }); return(null); } } return(message); }