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