Esempio n. 1
0
 /// <inheritdoc />
 public Subscription SubscribeMarketDepth(Security security, DateTimeOffset?from = null, DateTimeOffset?to = null, long?count = null, MarketDataBuildModes buildMode = MarketDataBuildModes.LoadAndBuild, DataType buildFrom = null, int?maxDepth = null, TimeSpan?refreshSpeed = null, IOrderLogMarketDepthBuilder depthBuilder = null, bool passThroughOrderBookInrement = false, IMessageAdapter adapter = null)
 {
     return(SubscribeMarketData(security, DataType.MarketDepth, from, to, count, buildMode, buildFrom, null, maxDepth, refreshSpeed, depthBuilder, passThroughOrderBookInrement, adapter));
 }
Esempio n. 2
0
 private Subscription SubscribeMarketData(Security security, DataType type, DateTimeOffset?from = null, DateTimeOffset?to = null, long?count = null, MarketDataBuildModes buildMode = MarketDataBuildModes.LoadAndBuild, DataType buildFrom = null, Level1Fields?buildField = null, int?maxDepth = null, TimeSpan?refreshSpeed = null, IOrderLogMarketDepthBuilder depthBuilder = null, bool passThroughOrderBookInrement = false, IMessageAdapter adapter = null)
 {
     return(SubscribeMarketData(security, new MarketDataMessage
     {
         DataType2 = type,
         IsSubscribe = true,
         From = from,
         To = to,
         Count = count,
         BuildMode = buildMode,
         BuildFrom = buildFrom,
         BuildField = buildField,
         MaxDepth = maxDepth,
         RefreshSpeed = refreshSpeed,
         DepthBuilder = depthBuilder,
         PassThroughOrderBookInrement = passThroughOrderBookInrement,
         Adapter = adapter
     }));
 }
Esempio n. 3
0
 /// <summary>
 /// Build market depths from order log.
 /// </summary>
 /// <param name="items">Orders log lines.</param>
 /// <param name="builder">Order log to market depth builder.</param>
 /// <param name="interval">The interval of the order book generation. The default is <see cref="TimeSpan.Zero"/>, which means order books generation at each new item of orders log.</param>
 /// <param name="maxDepth">The maximal depth of order book. The default is <see cref="Int32.MaxValue"/>, which means endless depth.</param>
 /// <returns>Market depths.</returns>
 public static IEnumerable <QuoteChangeMessage> ToOrderBooks(this IEnumerable <ExecutionMessage> items, IOrderLogMarketDepthBuilder builder, TimeSpan interval = default, int maxDepth = int.MaxValue)
 {
     return(new DepthEnumerable(items, builder, interval, maxDepth));
 }
Esempio n. 4
0
 /// <summary>
 /// To build level1 from the orders log.
 /// </summary>
 /// <param name="items">Orders log lines.</param>
 /// <param name="builder">Order log to market depth builder.</param>
 /// <param name="interval">The interval of the order book generation. The default is <see cref="TimeSpan.Zero"/>, which means order books generation at each new item of orders log.</param>
 /// <returns>Tick trades.</returns>
 public static IEnumerable <Level1ChangeMessage> ToLevel1(this IEnumerable <ExecutionMessage> items, IOrderLogMarketDepthBuilder builder, TimeSpan interval = default)
 {
     if (builder == null)
     {
         return(new TickLevel1Enumerable(items));
     }
     else
     {
         return(items.ToOrderBooks(builder, interval, 1).BuildIfNeed().ToLevel1());
     }
 }
Esempio n. 5
0
        /// <summary>
        /// Build market depths from order log.
        /// </summary>
        /// <param name="items">Orders log lines.</param>
        /// <param name="builder">Order log to market depth builder.</param>
        /// <param name="interval">The interval of the order book generation. The default is <see cref="TimeSpan.Zero"/>, which means order books generation at each new item of orders log.</param>
        /// <param name="maxDepth">The maximal depth of order book. The default is <see cref="Int32.MaxValue"/>, which means endless depth.</param>
        /// <returns>Market depths.</returns>
        public static IEnumerable <MarketDepth> ToOrderBooks(this IEnumerable <OrderLogItem> items, IOrderLogMarketDepthBuilder builder, TimeSpan interval = default, int maxDepth = int.MaxValue)
        {
            var first = items.FirstOrDefault();

            if (first == null)
            {
                return(Enumerable.Empty <MarketDepth>());
            }

            return(items.ToMessages <OrderLogItem, ExecutionMessage>()
                   .ToOrderBooks(builder, interval)
                   .BuildIfNeed()
                   .ToEntities <QuoteChangeMessage, MarketDepth>(first.Order.Security));
        }
Esempio n. 6
0
 /// <summary>
 /// To build level1 from the orders log.
 /// </summary>
 /// <param name="items">Orders log lines.</param>
 /// <param name="builder">Order log to market depth builder.</param>
 /// <param name="interval">The interval of the order book generation. The default is <see cref="TimeSpan.Zero"/>, which means order books generation at each new item of orders log.</param>
 /// <param name="maxDepth">The maximal depth of order book. The default is <see cref="Int32.MaxValue"/>, which means endless depth.</param>
 /// <returns>Tick trades.</returns>
 public static IEnumerable <Level1ChangeMessage> ToLevel1(this IEnumerable <ExecutionMessage> items, IOrderLogMarketDepthBuilder builder, TimeSpan interval = default, int maxDepth = int.MaxValue)
 {
     return(items.ToOrderBooks(builder, interval, maxDepth).ToLevel1());
 }
Esempio n. 7
0
        /// <summary>
        /// Build market depths from order log.
        /// </summary>
        /// <param name="items">Orders log lines.</param>
        /// <param name="builder">Order log to market depth builder.</param>
        /// <param name="interval">The interval of the order book generation. The default is <see cref="TimeSpan.Zero"/>, which means order books generation at each new item of orders log.</param>
        /// <param name="maxDepth">The maximal depth of order book. The default is <see cref="Int32.MaxValue"/>, which means endless depth.</param>
        /// <returns>Market depths.</returns>
        public static IEnumerable <QuoteChangeMessage> ToOrderBooks(this IEnumerable <ExecutionMessage> items, IOrderLogMarketDepthBuilder builder, TimeSpan interval = default, int maxDepth = int.MaxValue)
        {
            var snapshotSent = false;
            var prevTime     = default(DateTimeOffset?);

            foreach (var item in items)
            {
                if (!snapshotSent)
                {
                    yield return(builder.Snapshot.TypedClone());

                    snapshotSent = true;
                }

                var depth = builder.Update(item);
                if (depth is null)
                {
                    continue;
                }

                if (prevTime != null && (depth.ServerTime - prevTime.Value) < interval)
                {
                    continue;
                }

                depth = depth.TypedClone();

                if (maxDepth < int.MaxValue)
                {
                    depth.Bids = depth.Bids.Take(maxDepth).ToArray();
                    depth.Asks = depth.Asks.Take(maxDepth).ToArray();
                }

                yield return(depth);

                prevTime = depth.ServerTime;
            }
        }
Esempio n. 8
0
        private MarketDataMessage ProcessMarketDataRequest(MarketDataMessage message)
        {
            if (message.IsSubscribe)
            {
                if (!InnerAdapter.IsMarketDataTypeSupported(MarketDataTypes.OrderLog))
                {
                    return(message);
                }

                var isBuild = message.BuildMode == MarketDataBuildModes.Build && message.BuildFrom == MarketDataTypes.OrderLog;

                switch (message.DataType)
                {
                case MarketDataTypes.MarketDepth:
                {
                    if (isBuild || !InnerAdapter.IsMarketDataTypeSupported(message.DataType))
                    {
                        var secId = GetSecurityId(message.SecurityId);

                        IOrderLogMarketDepthBuilder builder = null;

                        if (InnerAdapter.IsSecurityRequired(DataType.OrderLog))
                        {
                            builder = InnerAdapter.CreateOrderLogMarketDepthBuilder(secId);
                        }

                        _subscriptionIds.Add(message.TransactionId, RefTuple.Create(secId, true, builder));

                        message          = (MarketDataMessage)message.Clone();
                        message.DataType = MarketDataTypes.OrderLog;

                        this.AddInfoLog("OL->MD subscribed {0}/{1}.", secId, message.TransactionId);
                    }

                    break;
                }

                case MarketDataTypes.Trades:
                {
                    if (isBuild || !InnerAdapter.IsMarketDataTypeSupported(message.DataType))
                    {
                        var secId = GetSecurityId(message.SecurityId);

                        _subscriptionIds.Add(message.TransactionId, RefTuple.Create(secId, false, (IOrderLogMarketDepthBuilder)null));

                        message          = (MarketDataMessage)message.Clone();
                        message.DataType = MarketDataTypes.OrderLog;

                        this.AddInfoLog("OL->TICK subscribed {0}/{1}.", secId, message.TransactionId);
                    }

                    break;
                }
                }
            }
            else
            {
                if (_subscriptionIds.TryGetAndRemove(message.OriginalTransactionId, out var tuple))
                {
                    this.AddInfoLog("OL->{0} unsubscribed {1}/{2}.", tuple.Second ? "MD" : "TICK", tuple.First, message.OriginalTransactionId);
                }
            }

            return(message);
        }
Esempio n. 9
0
 Subscription IMarketDataProviderEx.SubscribeMarketDepth(Security security, DateTimeOffset?from, DateTimeOffset?to, long?count, MarketDataBuildModes buildMode, MarketDataTypes?buildFrom, int?maxDepth, TimeSpan?refreshSpeed, IOrderLogMarketDepthBuilder depthBuilder, IMessageAdapter adapter) => null;