protected override void OnSave(BitArrayWriter writer, IEnumerable <NewsMessage> messages, NewsMetaInfo metaInfo) { var isMetaEmpty = metaInfo.IsEmpty(); writer.WriteInt(messages.Count()); var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version46; var isTickPrecision = metaInfo.Version >= MarketDataVersions.Version47; foreach (var news in messages) { if (isMetaEmpty) { metaInfo.ServerOffset = news.ServerTime.Offset; isMetaEmpty = false; } writer.WriteStringEx(news.Id); writer.WriteString(news.Headline); writer.WriteStringEx(news.Story); writer.WriteStringEx(news.Source); writer.WriteStringEx(news.BoardCode); writer.WriteStringEx(news.SecurityId?.SecurityCode); writer.WriteStringEx(news.Url.To <string>()); var lastOffset = metaInfo.LastServerOffset; metaInfo.LastTime = writer.WriteTime(news.ServerTime, metaInfo.LastTime, LocalizedStrings.News, true, true, metaInfo.ServerOffset, allowDiffOffsets, isTickPrecision, ref lastOffset); metaInfo.LastServerOffset = lastOffset; } }
public static void WritePriceEx <T>(this BitArrayWriter writer, decimal price, BinaryMetaInfo <T> info, SecurityId securityId) where T : BinaryMetaInfo <T> { if (info.Version < MarketDataVersions.Version41) { writer.WritePrice(price, info.LastPrice, info, securityId); info.LastPrice = price; } else { var isAligned = (price % info.PriceStep) == 0; writer.Write(isAligned); if (isAligned) { if (info.FirstPrice == 0) { info.FirstPrice = info.LastPrice = price; } writer.WritePrice(price, info.LastPrice, info, securityId); info.LastPrice = price; } else { if (info.FirstNonSystemPrice == 0) { info.FirstNonSystemPrice = info.LastNonSystemPrice = price; } info.LastNonSystemPrice = writer.WriteDecimal(price, info.LastNonSystemPrice); } } }
public static decimal WriteDecimal(this BitArrayWriter writer, decimal value, decimal prevValue) { var diff = value - prevValue; if (value != prevValue + diff) { throw new ArgumentOutOfRangeException(nameof(value), LocalizedStrings.Str1006Params.Put(value, prevValue)); } writer.Write(diff >= 0); if (diff < 0) { diff = -diff; } var decBits = decimal.GetBits(diff); writer.WriteInt(decBits[0]); writer.WriteInt(decBits[1]); writer.WriteInt(decBits[2]); writer.WriteInt((decBits[3] >> 16) & 0xff); return(value); }
protected void WriteItemLocalTime(BitArrayWriter writer, TMetaInfo metaInfo, Message message) { var lastLocalOffset = metaInfo.LastItemLocalOffset; metaInfo.LastItemLocalTime = writer.WriteTime(message.LocalTime, metaInfo.LastItemLocalTime, "local time", true, true, metaInfo.LocalOffset, true, ref lastLocalOffset); metaInfo.LastItemLocalOffset = lastLocalOffset; }
public static void WritePriceEx(this BitArrayWriter writer, decimal price, BinaryMetaInfo info, SecurityId securityId, bool useLong = false) { if (info.Version < MarketDataVersions.Version41) { var prevPrice = info.LastPrice; writer.WritePrice(price, ref prevPrice, info, securityId); info.LastPrice = price; } else { var isAligned = (price % info.LastPriceStep) == 0; writer.Write(isAligned); if (isAligned) { if (info.FirstPrice == 0) { info.FirstPrice = info.LastPrice = price; } var prevPrice = info.LastPrice; writer.WritePrice(price, ref prevPrice, info, securityId, useLong); info.LastPrice = price; } else { if (info.FirstFractionalPrice == 0) { info.FirstFractionalPrice = info.LastFractionalPrice = price; } info.LastFractionalPrice = writer.WriteDecimal(price, info.LastFractionalPrice); } } }
public static void WriteString(this BitArrayWriter writer, string value) { var bits = Encoding.UTF8.GetBytes(value).To <BitArray>().To <bool[]>(); writer.WriteInt(bits.Length); bits.ForEach(writer.Write); }
public static void WritePrice <T>(this BitArrayWriter writer, decimal price, decimal prevPrice, MetaInfo <T> info, SecurityId securityId, bool useLong = false) where T : MetaInfo <T> { if ((price % info.PriceStep) != 0) { throw new ArgumentException(LocalizedStrings.Str1007Params.Put(info.PriceStep, securityId, price), "info"); } try { var stepCount = (long)((price - prevPrice) / info.PriceStep); // ОЛ может содержать заявки с произвольно большими ценами if (useLong) { writer.WriteLong(stepCount); } else { writer.WriteInt((int)stepCount); } } catch (OverflowException ex) { throw new ArgumentException(LocalizedStrings.Str1008Params.Put(price, prevPrice, info.PriceStep, useLong), ex); } }
public static void WritePrice(this BitArrayWriter writer, decimal price, decimal prevPrice, MetaInfo info, SecurityId securityId, bool useLong = false) { var priceStep = info.PriceStep; if (priceStep == 0) { throw new InvalidOperationException(LocalizedStrings.Str2925); } if ((price % priceStep) != 0) { throw new ArgumentException(LocalizedStrings.Str1007Params.Put(priceStep, securityId, price), nameof(info)); } try { var stepCount = (long)((price - prevPrice) / priceStep); // ОЛ может содержать заявки с произвольно большими ценами if (useLong) { writer.WriteLong(stepCount); } else { writer.WriteInt((int)stepCount); } } catch (OverflowException ex) { throw new ArgumentException(LocalizedStrings.Str1008Params.Put(price, prevPrice, priceStep, useLong), ex); } }
public byte[] Serialize(IEnumerable <TData> data, IMarketDataMetaInfo metaInfo) { var writer = new BitArrayWriter(DataSize * data.Count() * 2); OnSave(writer, data, (TMetaInfo)metaInfo); return(writer.GetBytes()); }
public void Serialize(Stream stream, IEnumerable <TData> data, IMarketDataMetaInfo metaInfo) { //var temp = new MemoryStream { Capacity = DataSize * data.Count() * 2 }; using (var writer = new BitArrayWriter(stream)) OnSave(writer, data, (TMetaInfo)metaInfo); //return stream.To<byte[]>(); }
public byte[] Serialize(IEnumerable <TData> data, IMarketDataMetaInfo metaInfo) { var stream = new MemoryStream { Capacity = DataSize * data.Count() * 2 }; using (var writer = new BitArrayWriter(stream)) OnSave(writer, data, (TMetaInfo)metaInfo); return(stream.To <byte[]>()); }
public static void WriteNullableDecimal(this BitArrayWriter writer, decimal?value) { writer.Write(value != null); if (value is null) { return; } writer.WriteDecimal(value.Value); }
public static void WriteNullableSide(this BitArrayWriter writer, Sides?value) { writer.Write(value != null); if (value is null) { return; } writer.Write(value.Value == Sides.Buy); }
public static void WriteStringEx(this BitArrayWriter writer, string value) { if (value.IsEmpty()) { writer.Write(false); } else { writer.Write(true); writer.WriteString(value); } }
private static void SerializeChange(BitArrayWriter writer, RefPair <decimal, decimal> info, decimal price) { //if (price == 0) // throw new ArgumentOutOfRangeException(nameof(price)); if (info.First == 0) { info.First = info.Second = price; } info.Second = writer.WriteDecimal(price, info.Second); }
public static void WriteNullableLong(this BitArrayWriter writer, long?value) { if (value == null) { writer.Write(false); } else { writer.Write(true); writer.WriteLong(value.Value); } }
public static void WriteSide(this BitArrayWriter writer, Sides?direction) { if (direction == null) { writer.Write(false); } else { writer.Write(true); writer.Write(direction == Sides.Buy); } }
public static void WriteNullableInt(this BitArrayWriter writer, int?value) { if (value == null) { writer.Write(false); } else { writer.Write(true); writer.WriteInt(value.Value); } }
public static decimal WriteDecimal(this BitArrayWriter writer, decimal value, decimal prevValue) { var diff = value - prevValue; if (value != prevValue + diff) { throw new ArgumentOutOfRangeException(nameof(value), LocalizedStrings.Str1006Params.Put(value, prevValue)); } writer.WriteDecimal(diff); return(value); }
public static void WriteNullableInt <T>(this BitArrayWriter writer, T?value) where T : struct { if (value == null) { writer.Write(false); } else { writer.Write(true); writer.WriteInt(value.To <int>()); } }
public static void WriteBuildFrom(this BitArrayWriter writer, DataType buildFrom) { writer.Write(buildFrom != null); if (buildFrom == null) { return; } if (buildFrom == DataType.Level1) { writer.WriteInt(0); } else if (buildFrom == DataType.MarketDepth) { writer.WriteInt(1); } else if (buildFrom == DataType.OrderLog) { writer.WriteInt(2); } else if (buildFrom == DataType.Ticks) { writer.WriteInt(3); } else if (buildFrom == DataType.Transactions) { writer.WriteInt(4); } else { writer.WriteInt(5); var(messageType, arg1, arg2, arg3) = buildFrom.Extract(); writer.WriteInt(messageType); writer.WriteLong(arg1); if (arg2 == 0) { writer.Write(false); } else { writer.Write(true); writer.WriteDecimal(arg2, 0); } writer.WriteInt(arg3); } }
public static void WriteDto(this BitArrayWriter writer, DateTimeOffset?dto) { if (dto != null) { writer.Write(true); writer.WriteLong(dto.Value.Ticks); writer.WriteInt(dto.Value.Offset.Hours); writer.WriteInt(dto.Value.Offset.Minutes); } else { writer.Write(false); } }
private static void WriteString(BitArrayWriter writer, IList <string> items, string value) { if (value.IsEmpty()) { writer.Write(false); } else { writer.Write(true); items.TryAdd(value); writer.WriteInt(items.IndexOf(value)); } }
private static void WriteCommission(BitArrayWriter writer, TransactionSerializerMetaInfo metaInfo, decimal?value) { if (value == null) { writer.Write(false); } else { writer.Write(true); writer.WriteDecimal((decimal)value, metaInfo.LastCommission); metaInfo.LastCommission = (decimal)value; } }
private static decimal Write(BitArrayWriter writer, decimal?value, decimal last) { if (value == null) { writer.Write(false); return(last); } else { writer.Write(true); writer.WriteDecimal((decimal)value, last); return(value.Value); } }
private void SerializeQuotes(BitArrayWriter writer, QuoteChange[] quotes, QuoteMetaInfo metaInfo /*, bool isFull*/, bool useLong, bool nonAdjustPrice) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (quotes == null) { throw new ArgumentNullException(nameof(quotes)); } if (metaInfo == null) { throw new ArgumentNullException(nameof(metaInfo)); } writer.WriteInt(quotes.Count()); foreach (var quote in quotes) { // quotes for indices may have zero prices //if (quote.Price <= 0) // throw new ArgumentOutOfRangeException(nameof(quotes), quote.Price, LocalizedStrings.Str935); // some forex connectors do not translate volume // if (quote.Volume < 0 /* || (isFull && quote.Volume == 0)*/) { throw new ArgumentOutOfRangeException(nameof(quotes), quote.Volume, LocalizedStrings.Str936); } var pricePrice = metaInfo.LastPrice; writer.WritePrice(quote.Price, ref pricePrice, metaInfo, SecurityId, useLong, nonAdjustPrice); metaInfo.LastPrice = pricePrice; writer.WriteVolume(quote.Volume, metaInfo, SecurityId); if (metaInfo.Version < MarketDataVersions.Version56) { continue; } writer.WriteNullableInt(quote.OrdersCount); } }
private static bool TryWriteLargeDecimal(this BitArrayWriter writer, bool largeDecimal, decimal value) { if (largeDecimal) { if (value.Abs() > _largeDecLimit) { writer.Write(true); writer.WriteDecimal(value); return(true); } else { writer.Write(false); } } return(false); }
public static void WriteVolume(this BitArrayWriter writer, decimal volume, BinaryMetaInfo info, bool largeDecimal) { if (info.Version < MarketDataVersions.Version44) { var intVolume = volume.Truncate(); if (intVolume == volume) // объем целочисленный { writer.Write(true); writer.WriteLong((long)intVolume); } else { writer.Write(false); throw new NotSupportedException(LocalizedStrings.Str1010Params.Put(volume)); } } else { if (writer.TryWriteLargeDecimal(largeDecimal, volume)) { return; } var isAligned = (volume % info.VolumeStep) == 0; writer.Write(isAligned); if (isAligned) { writer.WriteLong((long)(volume / info.VolumeStep)); } else { if (info.FirstFractionalVolume == 0) { info.FirstFractionalVolume = info.LastFractionalVolume = volume; } info.LastFractionalVolume = writer.WriteDecimal(volume, info.LastFractionalVolume); } } }
private void SerializeQuotes(BitArrayWriter writer, IEnumerable <QuoteChange> quotes, QuoteMetaInfo metaInfo /*, bool isFull*/) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (quotes == null) { throw new ArgumentNullException(nameof(quotes)); } if (metaInfo == null) { throw new ArgumentNullException(nameof(metaInfo)); } var prevPrice = metaInfo.LastPrice; writer.WriteInt(quotes.Count()); foreach (var quote in quotes) { // quotes for spreads may be a zero cost or less than zero //if (quote.Price <= 0) // throw new ArgumentOutOfRangeException(nameof(quotes), quote.Price, LocalizedStrings.Str935); // some forex connectors do not translate volume // if (quote.Volume < 0 /* || (isFull && quote.Volume == 0)*/) { throw new ArgumentOutOfRangeException(nameof(quotes), quote.Volume, LocalizedStrings.Str936); } writer.WritePrice(quote.Price, prevPrice, metaInfo, SecurityId); writer.WriteVolume(quote.Volume, metaInfo, SecurityId); prevPrice = quote.Price; } }
private void SerializeQuotes(BitArrayWriter writer, IEnumerable <QuoteChange> quotes, QuoteMetaInfo metaInfo /*, bool isFull*/) { if (writer == null) { throw new ArgumentNullException("writer"); } if (quotes == null) { throw new ArgumentNullException("quotes"); } if (metaInfo == null) { throw new ArgumentNullException("metaInfo"); } var prevPrice = metaInfo.LastPrice; writer.WriteInt(quotes.Count()); foreach (var quote in quotes) { // quotes for spreads may be a zero cost or less than zero //if (quote.Price <= 0) // throw new ArgumentOutOfRangeException("quotes", quote.Price, LocalizedStrings.Str935); // котировки от Форекс истории не хранят объем // if (quote.Volume < 0 /* || (isFull && quote.Volume == 0)*/) { throw new ArgumentOutOfRangeException("quotes", quote.Volume, LocalizedStrings.Str936); } writer.WritePrice(quote.Price, prevPrice, metaInfo, SecurityId); writer.WriteVolume(quote.Volume, metaInfo, SecurityId); prevPrice = quote.Price; } }