/// <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)); }
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 })); }
/// <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)); }
/// <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()); } }
/// <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)); }
/// <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()); }
/// <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; } }
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); }
Subscription IMarketDataProviderEx.SubscribeMarketDepth(Security security, DateTimeOffset?from, DateTimeOffset?to, long?count, MarketDataBuildModes buildMode, MarketDataTypes?buildFrom, int?maxDepth, TimeSpan?refreshSpeed, IOrderLogMarketDepthBuilder depthBuilder, IMessageAdapter adapter) => null;