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