Example #1
0
        /// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            Message extra = null;

            switch (message.Type)
            {
            case MessageTypes.SubscriptionResponse:
            {
                var responseMsg = (SubscriptionResponseMessage)message;
                var originId    = responseMsg.OriginalTransactionId;

                lock (_syncObject)
                {
                    if (_liveRequests.TryGetAndRemove(originId, out var isPartial))
                    {
                        if (responseMsg.IsOk())
                        {
                            if (!this.IsOutMessageSupported(MessageTypes.SubscriptionOnline))
                            {
                                if (isPartial)
                                {
                                    // reply was sent previously for the first partial request,
                                    // now sending "online" message
                                    message = new SubscriptionOnlineMessage
                                    {
                                        OriginalTransactionId = originId
                                    };
                                }
                                else
                                {
                                    extra = new SubscriptionOnlineMessage
                                    {
                                        OriginalTransactionId = originId
                                    };
                                }
                            }
                        }

                        break;
                    }

                    if (!_partialRequests.TryGetValue(originId, out var info))
                    {
                        break;
                    }

                    var requestId = info.Origin.TransactionId;

                    if (!responseMsg.IsOk())
                    {
                        _original.Remove(requestId);
                        _partialRequests.RemoveWhere(p => p.Value == info);

                        if (info.ReplyReceived)
                        {
                            // unexpected subscription stop
                            responseMsg.OriginalTransactionId = requestId;
                            break;
                        }
                    }

                    if (info.ReplyReceived)
                    {
                        return;
                    }

                    info.ReplyReceived = true;

                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

            case MessageTypes.SubscriptionFinished:
            {
                var finishMsg = (SubscriptionFinishedMessage)message;

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetAndRemove(finishMsg.OriginalTransactionId, out var info))
                    {
                        var origin = info.Origin;

                        if (info.LastIteration)
                        {
                            _original.Remove(origin.TransactionId);
                            _partialRequests.RemoveWhere(p => p.Value == info);

                            finishMsg.OriginalTransactionId = origin.TransactionId;
                        }
                        else
                        {
                            message = new PartialDownloadMessage {
                                OriginalTransactionId = origin.TransactionId
                            }.LoopBack(this);
                        }
                    }
                }

                break;
            }

            case MessageTypes.Execution:
            {
                var execMsg = (ExecutionMessage)message;

                if (!execMsg.IsMarketData())
                {
                    break;
                }

                TryUpdateSubscriptionResult(execMsg);
                break;
            }

            case MessageTypes.Level1Change:
            {
                TryUpdateSubscriptionResult((Level1ChangeMessage)message);
                break;
            }

            case MessageTypes.QuoteChange:
            {
                TryUpdateSubscriptionResult((QuoteChangeMessage)message);
                break;
            }

            default:
            {
                if (message is CandleMessage candleMsg)
                {
                    TryUpdateSubscriptionResult(candleMsg);
                }

                break;
            }
            }

            base.OnInnerAdapterNewOutMessage(message);

            if (extra != null)
            {
                base.OnInnerAdapterNewOutMessage(extra);
            }
        }
        /// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            Message extra = null;

            switch (message.Type)
            {
            case MessageTypes.PortfolioLookupResult:
            case MessageTypes.OrderStatus:
            {
                var responseMsg = (IOriginalTransactionIdMessage)message;
                var originId    = responseMsg.OriginalTransactionId;

                lock (_syncObject)
                {
                    if (_liveRequests.TryGetAndRemove(originId, out var isPartial))
                    {
                        if (isPartial)
                        {
                            if (((IErrorMessage)responseMsg).Error == null)
                            {
                                // reply was sent prev for first partial request,
                                // now sending "online" message
                                message = new SubscriptionOnlineMessage
                                {
                                    OriginalTransactionId = originId
                                };
                            }
                        }
                        else
                        {
                            extra = new SubscriptionOnlineMessage
                            {
                                OriginalTransactionId = originId
                            };
                        }
                    }
                }

                break;
            }

            case MessageTypes.SubscriptionResponse:
            {
                var responseMsg = (SubscriptionResponseMessage)message;
                var originId    = responseMsg.OriginalTransactionId;

                lock (_syncObject)
                {
                    if (_liveRequests.TryGetAndRemove(originId, out var isPartial))
                    {
                        if (responseMsg.IsOk())
                        {
                            if (isPartial)
                            {
                                // reply was sent prev for first partial request,
                                // now sending "online" message
                                message = new SubscriptionOnlineMessage
                                {
                                    OriginalTransactionId = originId
                                };
                            }
                            else
                            {
                                extra = new SubscriptionOnlineMessage
                                {
                                    OriginalTransactionId = originId
                                };
                            }
                        }

                        break;
                    }

                    if (!_partialRequests.TryGetValue(originId, out var info))
                    {
                        break;
                    }

                    if (info.ReplyReceived)
                    {
                        return;
                    }

                    info.ReplyReceived = true;

                    var requestId = info.Origin.TransactionId;

                    if (!responseMsg.IsOk())
                    {
                        _original.Remove(requestId);
                        _partialRequests.RemoveWhere(p => p.Value == info);
                    }

                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

            case MessageTypes.SubscriptionFinished:
            {
                var finishMsg = (SubscriptionFinishedMessage)message;

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetAndRemove(finishMsg.OriginalTransactionId, out var info))
                    {
                        var origin = info.Origin;

                        if (info.LastIteration)
                        {
                            _original.Remove(origin.TransactionId);
                            _partialRequests.RemoveWhere(p => p.Value == info);

                            finishMsg.OriginalTransactionId = origin.TransactionId;
                        }
                        else
                        {
                            message = new PartialDownloadMessage {
                                OriginalTransactionId = origin.TransactionId
                            }.LoopBack(this);
                        }
                    }
                }

                break;
            }

            case MessageTypes.CandleTimeFrame:
            case MessageTypes.CandlePnF:
            case MessageTypes.CandleRange:
            case MessageTypes.CandleRenko:
            case MessageTypes.CandleTick:
            case MessageTypes.CandleVolume:
            {
                TryUpdateSubscriptionResult((CandleMessage)message);
                break;
            }

            case MessageTypes.Execution:
            {
                var execMsg = (ExecutionMessage)message;

                if (!execMsg.IsMarketData())
                {
                    break;
                }

                TryUpdateSubscriptionResult(execMsg);
                break;
            }

            case MessageTypes.Level1Change:
            {
                TryUpdateSubscriptionResult((Level1ChangeMessage)message);
                break;
            }

            case MessageTypes.QuoteChange:
            {
                TryUpdateSubscriptionResult((QuoteChangeMessage)message);
                break;
            }
            }

            base.OnInnerAdapterNewOutMessage(message);

            if (extra != null)
            {
                base.OnInnerAdapterNewOutMessage(extra);
            }
        }