public override void Serialize(Stream stream, IEnumerable <QuoteChangeMessage> data, IMarketDataMetaInfo metaInfo) { var list = data.SelectMany(d => { var items = new List <NullableTimeQuoteChange>(); items.AddRange(d.Bids.OrderByDescending(q => q.Price).Select(q => ToNullQuote(Sides.Buy, q, d))); if (items.Count == 0) { items.Add(new NullableTimeQuoteChange { Side = Sides.Buy, ServerTime = d.ServerTime, }); } var bidsCount = items.Count; items.AddRange(d.Asks.OrderBy(q => q.Price).Select(q => ToNullQuote(Sides.Sell, q, d))); if (items.Count == bidsCount) { items.Add(new NullableTimeQuoteChange { Side = Sides.Sell, ServerTime = d.ServerTime, }); } return(items); }); _quoteSerializer.Serialize(stream, list, metaInfo); }
public override void Serialize(Stream stream, IEnumerable <QuoteChangeMessage> data, IMarketDataMetaInfo metaInfo) { var csvInfo = (CsvMetaInfo)metaInfo; var incOnly = csvInfo.IncrementalOnly; var list = data.SelectMany(d => { if (incOnly != null) { if (incOnly.Value) { if (d.State == null) { throw new InvalidOperationException(LocalizedStrings.StorageRequiredIncremental.Put(true)); } } else { if (d.State != null) { throw new InvalidOperationException(LocalizedStrings.StorageRequiredIncremental.Put(false)); } } } var items = new List <NullableTimeQuoteChange>(); items.AddRange(d.Bids.OrderByDescending(q => q.Price).Select(q => ToNullQuote(Sides.Buy, q, d))); if (items.Count == 0) { items.Add(new NullableTimeQuoteChange { Side = Sides.Buy, ServerTime = d.ServerTime, State = d.State, BuildFrom = d.BuildFrom, SeqNum = d.SeqNum.DefaultAsNull(), }); } var bidsCount = items.Count; items.AddRange(d.Asks.OrderBy(q => q.Price).Select(q => ToNullQuote(Sides.Sell, q, d))); if (items.Count == bidsCount) { items.Add(new NullableTimeQuoteChange { Side = Sides.Sell, ServerTime = d.ServerTime, State = d.State, BuildFrom = d.BuildFrom, SeqNum = d.SeqNum.DefaultAsNull(), }); } return(items); }); _quoteSerializer.Serialize(stream, list, metaInfo); }