Пример #1
0
        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);
                }
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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;
        }
Пример #5
0
        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);
                }
            }
        }
Пример #6
0
        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);
            }
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
        public byte[] Serialize(IEnumerable <TData> data, IMarketDataMetaInfo metaInfo)
        {
            var writer = new BitArrayWriter(DataSize * data.Count() * 2);

            OnSave(writer, data, (TMetaInfo)metaInfo);

            return(writer.GetBytes());
        }
Пример #10
0
        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[]>();
        }
Пример #11
0
        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[]>());
        }
Пример #12
0
        public static void WriteNullableDecimal(this BitArrayWriter writer, decimal?value)
        {
            writer.Write(value != null);

            if (value is null)
            {
                return;
            }

            writer.WriteDecimal(value.Value);
        }
Пример #13
0
        public static void WriteNullableSide(this BitArrayWriter writer, Sides?value)
        {
            writer.Write(value != null);

            if (value is null)
            {
                return;
            }

            writer.Write(value.Value == Sides.Buy);
        }
Пример #14
0
 public static void WriteStringEx(this BitArrayWriter writer, string value)
 {
     if (value.IsEmpty())
     {
         writer.Write(false);
     }
     else
     {
         writer.Write(true);
         writer.WriteString(value);
     }
 }
Пример #15
0
        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);
        }
Пример #16
0
 public static void WriteNullableLong(this BitArrayWriter writer, long?value)
 {
     if (value == null)
     {
         writer.Write(false);
     }
     else
     {
         writer.Write(true);
         writer.WriteLong(value.Value);
     }
 }
Пример #17
0
 public static void WriteSide(this BitArrayWriter writer, Sides?direction)
 {
     if (direction == null)
     {
         writer.Write(false);
     }
     else
     {
         writer.Write(true);
         writer.Write(direction == Sides.Buy);
     }
 }
Пример #18
0
 public static void WriteNullableInt(this BitArrayWriter writer, int?value)
 {
     if (value == null)
     {
         writer.Write(false);
     }
     else
     {
         writer.Write(true);
         writer.WriteInt(value.Value);
     }
 }
Пример #19
0
        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);
        }
Пример #20
0
 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>());
     }
 }
Пример #21
0
        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);
            }
        }
Пример #22
0
 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);
     }
 }
Пример #23
0
        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));
            }
        }
Пример #24
0
        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);
            }
        }
Пример #26
0
        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);
            }
        }
Пример #27
0
        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);
        }
Пример #28
0
        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);
                }
            }
        }
Пример #29
0
        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;
            }
        }
Пример #30
0
        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;
            }
        }