Пример #1
0
            /// <summary>
            /// Copy the message into the <paramref name="destination" />.
            /// </summary>
            /// <param name="destination">The object, to which copied information.</param>
            /// <returns>The object, to which copied information.</returns>
            private PartialDownloadMessage CopyTo(PartialDownloadMessage destination)
            {
                destination.OriginalTransactionId = OriginalTransactionId;

                this.CopyExtensionInfo(destination);

                return(destination);
            }
Пример #2
0
        /// <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.TryGetValue(originId, out var isPartial))
                    {
                        _liveRequests.Remove(originId);

                        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.MarketData:
            {
                var responseMsg = (MarketDataMessage)message;
                var originId    = responseMsg.OriginalTransactionId;

                lock (_syncObject)
                {
                    if (_liveRequests.TryGetValue(originId, out var isPartial))
                    {
                        _liveRequests.Remove(originId);

                        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;
                    }

                    long requestId;

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

                        requestId = tuple.Item1;
                        info      = tuple.Item2;

                        _original.Remove(info.Origin.TransactionId);
                        _partialRequests.RemoveWhere(p => p.Value == info);
                        _unsubscribeRequests.Remove(originId);
                    }
                    else
                    {
                        if (info.ReplyReceived)
                        {
                            return;
                        }

                        info.ReplyReceived = true;

                        requestId = info.Origin.TransactionId;

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

                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

            case MessageTypes.MarketDataFinished:
            {
                var finishMsg = (MarketDataFinishedMessage)message;

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetValue(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;
                            break;
                        }

                        _partialRequests.Remove(finishMsg.OriginalTransactionId);

                        message = new PartialDownloadMessage
                        {
                            Adapter = this,
                            IsBack  = true,
                            OriginalTransactionId = origin.TransactionId,
                        };
                    }
                }

                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);
            }
        }
Пример #3
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;
                    }

                    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);
            }
        }
Пример #4
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))
                    {
                        if (_finished.Contains(originId))
                        {
                            this.AddWarningLog("Subscription {0} already finished.", originId);
                        }

                        break;
                    }

                    var requestId = info.Origin.TransactionId;

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

                        if (info.ReplyReceived)
                        {
                            // unexpected subscription stop

                            message = responseMsg = responseMsg.TypedClone();
                            responseMsg.OriginalTransactionId = requestId;
                            break;
                        }
                    }

                    if (info.ReplyReceived)
                    {
                        return;
                    }

                    info.ReplyReceived = true;

                    message = responseMsg = responseMsg.TypedClone();
                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

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

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetAndRemove(finishMsg.OriginalTransactionId, out var info))
                    {
                        _finished.Add(finishMsg.OriginalTransactionId);

                        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);
                        }
                    }
                    else
                    {
                        if (_finished.Contains(finishMsg.OriginalTransactionId))
                        {
                            this.AddWarningLog("Subscription {0} already finished.", finishMsg.OriginalTransactionId);
                        }

                        break;
                    }
                }

                this.AddInfoLog("Partial {0} finished.", finishMsg.OriginalTransactionId);

                break;
            }

            case MessageTypes.Execution:
            {
                TryUpdateSubscriptionResult((ExecutionMessage)message);
                break;
            }

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

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

            case MessageTypes.PositionChange:
            {
                TryUpdateSubscriptionResult((PositionChangeMessage)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)
        {
            switch (message.Type)
            {
            case MessageTypes.MarketData:
            {
                var responseMsg = (MarketDataMessage)message;

                lock (_syncObject)
                {
                    long requestId;

                    if (!_partialRequests.TryGetValue(responseMsg.OriginalTransactionId, out var info))
                    {
                        if (!_unsubscribeRequests.TryGetValue(responseMsg.OriginalTransactionId, out var tuple))
                        {
                            break;
                        }

                        requestId = tuple.Item1;
                        info      = tuple.Item2;

                        var originId = info.Origin.TransactionId;
                        _original.Remove(originId);
                        _partialRequests.RemoveWhere(p => p.Value == info);
                        _unsubscribeRequests.Remove(responseMsg.OriginalTransactionId);
                    }
                    else
                    {
                        if (info.ReplyReceived)
                        {
                            return;
                        }

                        info.ReplyReceived = true;

                        requestId = info.Origin.TransactionId;

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

                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

            case MessageTypes.MarketDataFinished:
            {
                var finishMsg = (MarketDataFinishedMessage)message;

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetValue(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;
                            break;
                        }

                        _partialRequests.Remove(finishMsg.OriginalTransactionId);

                        message = new PartialDownloadMessage
                        {
                            Adapter = this,
                            IsBack  = true,
                            OriginalTransactionId = origin.TransactionId,
                        };
                    }
                }

                break;
            }

            case MessageTypes.CandleTimeFrame:
            case MessageTypes.CandlePnF:
            case MessageTypes.CandleRange:
            case MessageTypes.CandleRenko:
            case MessageTypes.CandleTick:
            case MessageTypes.CandleVolume:
            {
                var candleMsg = (CandleMessage)message;

                lock (_syncObject)
                {
                    if (!_partialRequests.TryGetValue(candleMsg.OriginalTransactionId, out var info))
                    {
                        break;
                    }

                    info.TryUpdateNextFrom(candleMsg.OpenTime);
                    candleMsg.OriginalTransactionId = info.Origin.TransactionId;
                }

                break;
            }

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

                if (execMsg.OriginalTransactionId == 0 || (execType != ExecutionTypes.OrderLog && execType != ExecutionTypes.Tick))
                {
                    break;
                }

                lock (_syncObject)
                {
                    if (!_partialRequests.TryGetValue(execMsg.OriginalTransactionId, out var info))
                    {
                        break;
                    }

                    info.TryUpdateNextFrom(execMsg.ServerTime);
                    execMsg.OriginalTransactionId = info.Origin.TransactionId;
                }

                break;
            }
            }

            base.OnInnerAdapterNewOutMessage(message);
        }
        /// <inheritdoc />
        protected override void OnInnerAdapterNewOutMessage(Message message)
        {
            switch (message.Type)
            {
            case MessageTypes.MarketData:
            {
                var responseMsg = (MarketDataMessage)message;

                lock (_syncObject)
                {
                    if (_liveRequests.Contains(responseMsg.OriginalTransactionId))
                    {
                        _liveRequests.Remove(responseMsg.OriginalTransactionId);

                        responseMsg.IsOnline = true;
                        break;
                    }

                    long requestId;

                    if (!_partialRequests.TryGetValue(responseMsg.OriginalTransactionId, out var info))
                    {
                        if (!_unsubscribeRequests.TryGetValue(responseMsg.OriginalTransactionId, out var tuple))
                        {
                            break;
                        }

                        requestId = tuple.Item1;
                        info      = tuple.Item2;

                        var originId = info.Origin.TransactionId;
                        _original.Remove(originId);
                        _partialRequests.RemoveWhere(p => p.Value == info);
                        _unsubscribeRequests.Remove(responseMsg.OriginalTransactionId);
                    }
                    else
                    {
                        if (info.ReplyReceived)
                        {
                            return;
                        }

                        info.ReplyReceived = true;

                        requestId = info.Origin.TransactionId;

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

                    responseMsg.OriginalTransactionId = requestId;
                }

                break;
            }

            case MessageTypes.MarketDataFinished:
            {
                var finishMsg = (MarketDataFinishedMessage)message;

                lock (_syncObject)
                {
                    if (_partialRequests.TryGetValue(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;
                            break;
                        }

                        _partialRequests.Remove(finishMsg.OriginalTransactionId);

                        message = new PartialDownloadMessage
                        {
                            Adapter = this,
                            IsBack  = true,
                            OriginalTransactionId = origin.TransactionId,
                        };
                    }
                }

                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);
        }