private static IObservable <OrderBook> DetectAndFilterAnomaliesAssumingSingleInstrument(
            this IObservable <OrderBook> source,
            ILog log)
        {
            string DetectAnomaly(MidPrice?previousMidPrice, MidPrice?midPrice)
            {
                if (previousMidPrice == null)
                {
                    return(null);
                }
                if (midPrice == null)
                {
                    return(null);
                }

                if (midPrice.Value.Mid / previousMidPrice.Value.Mid > 10M ||
                    previousMidPrice.Value.Mid / midPrice.Value.Mid > 10M)
                {
                    return($"Found anomaly, orderbook skipped. " +
                           $"Current midPrice is " +
                           $"{previousMidPrice.Value}, the new one is {midPrice.Value}");
                }
                else
                {
                    return(null);
                }
            }

            return(Observable.Create <OrderBook>(async(obs, ct) =>
            {
                MidPrice?prevMid = null;

                await source.ForEachAsync(orderBook =>
                {
                    var newMidPrice = MidPrice.Get(orderBook);
                    var anomaly = DetectAnomaly(prevMid, newMidPrice);

                    if (anomaly != null)
                    {
                        log.Warning(anomaly);
                    }
                    else
                    {
                        prevMid = newMidPrice ?? prevMid;
                        obs.OnNext(orderBook);
                    }
                }, ct);
            }));
        }