示例#1
0
        /// <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);
        }