private void ProcessMarketDataMessage(MarketDataMessage mdMsg)
        {
            if (!mdMsg.IsSubscribe)
            {
                return;
            }

            if (mdMsg.SecurityId.Native == null)
            {
                throw new InvalidOperationException(LocalizedStrings.Str3392Params.Put(mdMsg.SecurityId.SecurityCode));
            }

            var lmaxId = (long)mdMsg.SecurityId.Native;

            switch (mdMsg.DataType)
            {
            case MarketDataTypes.Level1:
            case MarketDataTypes.Trades:
            {
                _session.Subscribe(new OrderBookStatusSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookStatusSubscriptionRequest"));
                break;
            }

            case MarketDataTypes.MarketDepth:
            {
                _session.Subscribe(new OrderBookSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookSubscriptionRequest"));
                break;
            }

            case MarketDataTypes.CandleTimeFrame:
            {
                IHistoricMarketDataRequest request;

                var tf   = (TimeSpan)mdMsg.Arg;
                var from = (mdMsg.From ?? DateTimeOffset.MinValue).UtcDateTime;
                var to   = (mdMsg.To ?? DateTimeOffset.MaxValue).UtcDateTime;

                if (tf.Ticks == 1)
                {
                    request = new TopOfBookHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, from, to, Format.Csv);
                }
                else
                {
                    Resolution resolution;

                    if (tf == TimeSpan.FromMinutes(1))
                    {
                        resolution = Resolution.Minute;
                    }
                    else if (tf == TimeSpan.FromDays(1))
                    {
                        resolution = Resolution.Day;
                    }
                    else
                    {
                        throw new InvalidOperationException(LocalizedStrings.Str3393Params.Put(tf));
                    }

                    request = new AggregateHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, from, to, resolution, Format.Csv, Option.Bid, Option.Ask);
                }

                if (!_isHistoricalSubscribed)
                {
                    _session.Subscribe(new HistoricMarketDataSubscriptionRequest(), () => { }, CreateErrorHandler("HistoricMarketDataSubscriptionRequest"));
                    _isHistoricalSubscribed = true;
                }

                _session.RequestHistoricMarketData(request, () => { }, CreateErrorHandler("RequestHistoricMarketData"));
                break;
            }

            default:
            {
                SendOutMarketDataNotSupported(mdMsg.TransactionId);
                return;
            }
            }

            var result = (MarketDataMessage)mdMsg.Clone();

            result.OriginalTransactionId = mdMsg.TransactionId;
            SendOutMessage(result);
        }
		private void ProcessMarketDataMessage(MarketDataMessage mdMsg)
		{
			if (!mdMsg.IsSubscribe)
				return;

			if (mdMsg.SecurityId.Native == null)
				throw new InvalidOperationException(LocalizedStrings.Str3392Params.Put(mdMsg.SecurityId.SecurityCode));

			var lmaxId = (long)mdMsg.SecurityId.Native;

			switch (mdMsg.DataType)
			{
				case MarketDataTypes.Level1:
				case MarketDataTypes.Trades:
				{
					_session.Subscribe(new OrderBookStatusSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookStatusSubscriptionRequest"));
					break;
				}
				case MarketDataTypes.MarketDepth:
				{
					_session.Subscribe(new OrderBookSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookSubscriptionRequest"));
					break;
				}
				case MarketDataTypes.CandleTimeFrame:
				{
					IHistoricMarketDataRequest request;

					var tf = (TimeSpan)mdMsg.Arg;
					var from = (mdMsg.From ?? DateTimeOffset.MinValue).UtcDateTime;
					var to = (mdMsg.To ?? DateTimeOffset.MaxValue).UtcDateTime;

					if (tf.Ticks == 1)
						request = new TopOfBookHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, from, to, Format.Csv);
					else
					{
						Resolution resolution;

						if (tf == TimeSpan.FromMinutes(1))
							resolution = Resolution.Minute;
						else if (tf == TimeSpan.FromDays(1))
							resolution = Resolution.Day;
						else
							throw new InvalidOperationException(LocalizedStrings.Str3393Params.Put(tf));

						request = new AggregateHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, from, to, resolution, Format.Csv, Option.Bid, Option.Ask);
					}

					if (!_isHistoricalSubscribed)
					{
						_session.Subscribe(new HistoricMarketDataSubscriptionRequest(), () => { }, CreateErrorHandler("HistoricMarketDataSubscriptionRequest"));
						_isHistoricalSubscribed = true;
					}

					_session.RequestHistoricMarketData(request, () => { }, CreateErrorHandler("RequestHistoricMarketData"));
					break;
				}
				default:
				{
					SendOutMarketDataNotSupported(mdMsg.TransactionId);
					return;
				}
			}

			var result = (MarketDataMessage)mdMsg.Clone();
			result.OriginalTransactionId = mdMsg.TransactionId;
			SendOutMessage(result);
		}
Пример #3
0
        private void ProcessMarketDataMessage(MarketDataMessage mdMsg)
        {
            if (!mdMsg.IsSubscribe)
            {
                return;
            }

            if (mdMsg.SecurityId.Native == null)
            {
                throw new InvalidOperationException(LocalizedStrings.Str3392Params.Put(mdMsg.SecurityId.SecurityCode));
            }

            var lmaxId = (long)mdMsg.SecurityId.Native;

            switch (mdMsg.DataType)
            {
            case MarketDataTypes.Level1:
            {
                Session.Subscribe(new OrderBookStatusSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookStatusSubscriptionRequest"));
                break;
            }

            case MarketDataTypes.MarketDepth:
            {
                Session.Subscribe(new OrderBookSubscriptionRequest(lmaxId), () => { }, CreateErrorHandler("OrderBookSubscriptionRequest"));
                break;
            }

            case MarketDataTypes.CandleTimeFrame:
            {
                IHistoricMarketDataRequest request;

                var tf = (TimeSpan)mdMsg.Arg;

                if (tf.Ticks == 1)
                {
                    request = new TopOfBookHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, mdMsg.From.UtcDateTime, mdMsg.To.UtcDateTime, Format.Csv);
                }
                else
                {
                    Resolution resolution;

                    if (tf == TimeSpan.FromMinutes(1))
                    {
                        resolution = Resolution.Minute;
                    }
                    else if (tf == TimeSpan.FromDays(1))
                    {
                        resolution = Resolution.Day;
                    }
                    else
                    {
                        throw new InvalidOperationException(LocalizedStrings.Str3393Params.Put(tf));
                    }

                    request = new AggregateHistoricMarketDataRequest(mdMsg.TransactionId, lmaxId, mdMsg.From.UtcDateTime, mdMsg.To.UtcDateTime, resolution, Format.Csv, Option.Bid, Option.Ask);
                }

                Session.RequestHistoricMarketData(request, () => { }, CreateErrorHandler("RequestHistoricMarketData"));
                break;
            }

            case MarketDataTypes.Trades:
                break;

            default:
                throw new ArgumentOutOfRangeException("mdMsg", mdMsg.DataType, LocalizedStrings.Str1618);
            }

            var result = (MarketDataMessage)mdMsg.Clone();

            result.OriginalTransactionId = mdMsg.TransactionId;
            SendOutMessage(result);
        }