Пример #1
0
        public override NewsMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var message = new NewsMessage
            {
                Id         = reader.Read() ? reader.ReadString() : null,
                Headline   = reader.ReadString(),
                Story      = reader.Read() ? reader.ReadString() : null,
                Source     = reader.Read() ? reader.ReadString() : null,
                BoardCode  = reader.Read() ? reader.ReadString() : null,
                SecurityId = reader.Read() ? new SecurityId {
                    SecurityCode = reader.ReadString()
                } : (SecurityId?)null,
                Url = reader.Read() ? reader.ReadString().To <Uri>() : null,
            };

            var prevTime = metaInfo.FirstTime;

            message.ServerTime = reader.ReadTime(ref prevTime, true, true, metaInfo.ServerOffset);
            metaInfo.FirstTime = prevTime;

            return(message);
        }
Пример #2
0
        public override NewsMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var message = new NewsMessage
            {
                Id         = reader.ReadStringEx(),
                Headline   = reader.ReadString(),
                Story      = reader.ReadStringEx(),
                Source     = reader.ReadStringEx(),
                BoardCode  = reader.ReadStringEx(),
                SecurityId = reader.Read() ? new SecurityId {
                    SecurityCode = reader.ReadString()
                } : (SecurityId?)null,
                Url = reader.ReadStringEx().To <Uri>(),
            };

            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version46;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version47;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;

            message.ServerTime         = reader.ReadTime(ref prevTime, true, true, metaInfo.ServerOffset, allowDiffOffsets, isTickPrecision, ref lastOffset);
            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            return(message);
        }
        public override BoardStateMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var message = new BoardStateMessage();

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;

            message.ServerTime         = reader.ReadTime(ref prevTime, true, true, metaInfo.ServerOffset, true, true, ref lastOffset);
            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            message.BoardCode = reader.ReadStringEx();
            message.State     = (SessionStates)reader.ReadInt();

            return(message);
        }
Пример #4
0
        public override NewsMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var message = new NewsMessage
            {
                Id         = reader.ReadStringEx(),
                Headline   = reader.ReadString(),
                Story      = reader.ReadStringEx(),
                Source     = reader.ReadStringEx(),
                BoardCode  = reader.ReadStringEx(),
                SecurityId = reader.Read() ? new SecurityId {
                    SecurityCode = reader.ReadString()
                } : (SecurityId?)null,
                Url = reader.ReadStringEx(),
            };

            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version46;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version47;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;

            message.ServerTime         = reader.ReadTime(ref prevTime, true, true, metaInfo.ServerOffset, allowDiffOffsets, isTickPrecision, ref lastOffset);
            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            if (metaInfo.Version < MarketDataVersions.Version48)
            {
                return(message);
            }

            if (reader.Read())
            {
                message.Priority = (NewsPriorities)reader.ReadInt();
            }

            if (metaInfo.Version < MarketDataVersions.Version49)
            {
                return(message);
            }

            message.Language = reader.ReadStringEx();

            if (metaInfo.Version < MarketDataVersions.Version50)
            {
                return(message);
            }

            message.ExpiryDate = reader.Read() ? reader.ReadLong().To <DateTimeOffset>() : (DateTimeOffset?)null;

            var secBoard = reader.ReadStringEx();

            if (!secBoard.IsEmpty() && message.SecurityId != null)
            {
                var secId = message.SecurityId.Value;
                secId.BoardCode    = secBoard;
                message.SecurityId = secId;
            }

            return(message);
        }
Пример #5
0
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version48;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version50;
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version54;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version55;
            var useLong          = metaInfo.Version >= MarketDataVersions.Version56;

            metaInfo.FirstId += reader.ReadLong();

            var volume = metaInfo.Version < MarketDataVersions.Version53
                                ? reader.ReadVolume(metaInfo)
                                : reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var price = reader.ReadPriceEx(metaInfo, useLong);

            var orderDirection = reader.Read() ? (reader.Read() ? Sides.Buy : Sides.Sell) : (Sides?)null;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId, ExchangeInfoProvider), allowDiffOffsets, isTickPrecision, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var msg = new ExecutionMessage
            {
                //LocalTime = metaInfo.FirstTime,
                ExecutionType = ExecutionTypes.Tick,
                SecurityId    = SecurityId,
                TradeId       = metaInfo.FirstId == 0 ? (long?)null : metaInfo.FirstId,
                TradeVolume   = volume,
                OriginSide    = orderDirection,
                TradePrice    = price,
                ServerTime    = serverTime,
            };

            if (metaInfo.Version < MarketDataVersions.Version40)
            {
                return(msg);
            }

            if (metaInfo.Version < MarketDataVersions.Version47)
            {
                msg.LocalTime = msg.ServerTime - reader.ReadLong().To <TimeSpan>() + metaInfo.LocalOffset;
            }
            else
            {
                var hasLocalTime = true;

                if (metaInfo.Version >= MarketDataVersions.Version49)
                {
                    hasLocalTime = reader.Read();
                }

                if (hasLocalTime)
                {
                    var prevLocalTime = metaInfo.FirstLocalTime;
                    lastOffset = metaInfo.FirstLocalOffset;
                    var localTime = reader.ReadTime(ref prevLocalTime, allowNonOrdered, isUtc, metaInfo.LocalOffset, allowDiffOffsets, isTickPrecision, ref lastOffset);
                    metaInfo.FirstLocalTime   = prevLocalTime;
                    metaInfo.FirstLocalOffset = lastOffset;
                    msg.LocalTime             = localTime;
                }
                //else
                //	msg.LocalTime = msg.ServerTime;
            }

            if (metaInfo.Version < MarketDataVersions.Version42)
            {
                return(msg);
            }

            msg.IsSystem = metaInfo.Version < MarketDataVersions.Version51
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

            if (msg.IsSystem == false)
            {
                msg.TradeStatus = metaInfo.Version < MarketDataVersions.Version51
                                        ? reader.ReadInt()
                                        : reader.ReadNullableInt();
            }

            if (metaInfo.Version < MarketDataVersions.Version46 || reader.Read())
            {
                msg.OpenInterest = reader.ReadVolume(metaInfo);
            }

            if (metaInfo.Version < MarketDataVersions.Version45)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.IsUpTick = reader.Read();
            }

            if (metaInfo.Version >= MarketDataVersions.Version52)
            {
                if (reader.Read())
                {
                    msg.Currency = (CurrencyTypes)reader.ReadInt();
                }
            }

            return(msg);
        }
Пример #6
0
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var execType = (ExecutionTypes)reader.ReadInt();
            var isTrade  = execType == ExecutionTypes.Trade;

            metaInfo.FirstTransactionId         += reader.ReadLong();
            metaInfo.FirstOriginalTransactionId += reader.ReadLong();

            string orderBoardId  = null;
            string orderStringId = null;
            string tradeStringId = null;

            if (!isTrade)
            {
                if (metaInfo.Version < MarketDataVersions.Version50)
                {
                    metaInfo.FirstOrderId += reader.ReadLong();
                }
                else
                {
                    if (reader.Read())
                    {
                        metaInfo.FirstOrderId += reader.ReadLong();
                    }
                    else
                    {
                        if (reader.Read())
                        {
                            orderStringId = reader.ReadString();
                        }
                    }

                    if (reader.Read())
                    {
                        orderBoardId = reader.ReadString();
                    }
                }
            }
            else
            {
                if (metaInfo.Version < MarketDataVersions.Version50)
                {
                    metaInfo.FirstTradeId += reader.ReadLong();
                }
                else
                {
                    if (reader.Read())
                    {
                        metaInfo.FirstTradeId += reader.ReadLong();
                    }
                    else
                    {
                        if (reader.Read())
                        {
                            tradeStringId = reader.ReadString();
                        }
                    }
                }
            }

            var side = reader.Read() ? Sides.Buy : Sides.Sell;

            var price  = reader.ReadPriceEx(metaInfo);
            var volume = (metaInfo.Version < MarketDataVersions.Version57 || reader.Read())
                                ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var visibleVolume = (metaInfo.Version < MarketDataVersions.Version54 || reader.Read())
                                ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var balance = (metaInfo.Version < MarketDataVersions.Version54 || reader.Read())
                                ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version48;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version51;
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version56;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId), allowDiffOffsets, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var type = reader.ReadInt().To <OrderTypes>();

            var state  = reader.ReadNullableInt <OrderStates>();
            var status = reader.ReadNullableInt <OrderStatus>();

            var tradeStatus = metaInfo.Version < MarketDataVersions.Version52
                                ? reader.ReadInt()
                                : reader.ReadNullableInt <int>();

            var timeInForce = metaInfo.Version < MarketDataVersions.Version53
                                ? reader.ReadInt().To <TimeInForce>()
                                : reader.Read() ? reader.ReadInt().To <TimeInForce>() : (TimeInForce?)null;

            var isSystem = metaInfo.Version < MarketDataVersions.Version52
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

            var expDate = reader.ReadLong();

            var commission = ReadCommission(reader, metaInfo);

            var portfolio   = ReadString(reader, metaInfo.Portfolios);
            var userOrderId = ReadString(reader, metaInfo.StrategyIds);
            var comment     = ReadString(reader, metaInfo.Comments);
            var error       = ReadString(reader, metaInfo.Errors);

            var msg = new ExecutionMessage
            {
                ExecutionType = execType,
                SecurityId    = SecurityId,

                ServerTime = serverTime,

                TransactionId         = metaInfo.FirstTransactionId,
                OriginalTransactionId = metaInfo.FirstOriginalTransactionId,

                Side          = side,
                Volume        = volume,
                VisibleVolume = visibleVolume,
                Balance       = balance,

                OrderType     = type,
                OrderState    = state,
                OrderStatus   = status,
                TimeInForce   = timeInForce,
                IsSystem      = isSystem,
                ExpiryDate    = expDate == 0 ? (DateTimeOffset?)null : expDate.To <DateTimeOffset>(),
                Commission    = commission,
                PortfolioName = portfolio,
                UserOrderId   = userOrderId,
                Comment       = comment,

                TradeStatus = tradeStatus,
            };

            if (!isTrade)
            {
                if (orderStringId == null)
                {
                    msg.OrderId = metaInfo.FirstOrderId;
                }
                else
                {
                    msg.OrderStringId = orderStringId;
                }

                msg.OrderBoardId = orderBoardId;
                msg.OrderPrice   = price;
            }
            else
            {
                if (tradeStringId == null)
                {
                    msg.TradeId = metaInfo.FirstTradeId;
                }
                else
                {
                    msg.TradeStringId = tradeStringId;
                }

                msg.TradePrice = price;
            }

            if (!error.IsEmpty())
            {
                msg.Error = new InvalidOperationException(error);
            }

            if (metaInfo.Version >= MarketDataVersions.Version55)
            {
                if (reader.Read())
                {
                    msg.Currency = (CurrencyTypes)reader.ReadInt();
                }
            }

            return(msg);
        }
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            metaInfo.FirstTransactionId         += reader.ReadLong();
            metaInfo.FirstOriginalTransactionId += reader.ReadLong();

            var hasOrderInfo = reader.Read();
            var hasTradeInfo = reader.Read();

            long?orderId = null;
            long?tradeId = null;

            string orderStringId = null;
            string tradeStringId = null;

            if (reader.Read())
            {
                metaInfo.FirstOrderId += reader.ReadLong();
                orderId = metaInfo.FirstOrderId;
            }
            else
            {
                orderStringId = reader.ReadStringEx();
            }

            var orderBoardId = reader.ReadStringEx();

            if (reader.Read())
            {
                metaInfo.FirstTradeId += reader.ReadLong();
                tradeId = metaInfo.FirstTradeId;
            }
            else
            {
                tradeStringId = reader.ReadStringEx();
            }

            var orderPrice = reader.Read() ? reader.ReadPriceEx(metaInfo) : (decimal?)null;
            var tradePrice = reader.Read() ? reader.ReadPriceEx(metaInfo) : (decimal?)null;

            var side = reader.Read() ? Sides.Buy : Sides.Sell;

            var orderVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var tradeVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var visibleVolume = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var balance       = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var isTickPrecision = metaInfo.Version >= MarketDataVersions.Version60;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, true, true, metaInfo.GetTimeZone(true, SecurityId, ExchangeInfoProvider), true, isTickPrecision, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var type        = (OrderTypes?)reader.ReadNullableInt();
            var state       = (OrderStates?)reader.ReadNullableInt();
            var status      = reader.ReadNullableLong();
            var tradeStatus = reader.ReadNullableInt();
            var timeInForce = (TimeInForce?)reader.ReadNullableInt();

            var isSystem = reader.Read() ? reader.Read() : (bool?)null;
            var isUpTick = reader.Read() ? reader.Read() : (bool?)null;

            var expDate = reader.ReadDto();

            var commission = reader.Read() ? metaInfo.FirstCommission = reader.ReadDecimal(metaInfo.FirstCommission) : (decimal?)null;
            var pnl        = reader.Read() ? metaInfo.FirstPnL = reader.ReadDecimal(metaInfo.FirstPnL) : (decimal?)null;
            var position   = reader.Read() ? metaInfo.FirstPosition = reader.ReadDecimal(metaInfo.FirstPosition) : (decimal?)null;
            var slippage   = reader.Read() ? metaInfo.FirstSlippage = reader.ReadDecimal(metaInfo.FirstSlippage) : (decimal?)null;

            var portfolio   = ReadString(reader, metaInfo.Portfolios);
            var clientCode  = ReadString(reader, metaInfo.ClientCodes);
            var brokerCode  = ReadString(reader, metaInfo.BrokerCodes);
            var depoName    = ReadString(reader, metaInfo.DepoNames);
            var userOrderId = ReadString(reader, metaInfo.UserOrderIds);
            var comment     = ReadString(reader, metaInfo.Comments);
            var sysComment  = ReadString(reader, metaInfo.SystemComments);

            var msg = new ExecutionMessage
            {
                ExecutionType = ExecutionTypes.Transaction,
                SecurityId    = SecurityId,

                ServerTime = serverTime,

                TransactionId         = metaInfo.FirstTransactionId,
                OriginalTransactionId = metaInfo.FirstOriginalTransactionId,

                Side          = side,
                OrderVolume   = orderVolume,
                TradeVolume   = tradeVolume,
                VisibleVolume = visibleVolume,
                Balance       = balance,

                OrderType     = type,
                OrderState    = state,
                OrderStatus   = status,
                TimeInForce   = timeInForce,
                IsSystem      = isSystem,
                IsUpTick      = isUpTick,
                ExpiryDate    = expDate,
                Commission    = commission,
                PnL           = pnl,
                Position      = position,
                Slippage      = slippage,
                PortfolioName = portfolio,
                ClientCode    = clientCode,
                BrokerCode    = brokerCode,
                DepoName      = depoName,
                UserOrderId   = userOrderId,
                Comment       = comment,
                SystemComment = sysComment,

                TradeStatus = tradeStatus,

                HasOrderInfo = hasOrderInfo,
                HasTradeInfo = hasTradeInfo,

                OrderPrice = orderPrice ?? 0,
                TradePrice = tradePrice,

                OrderId = orderId,
                TradeId = tradeId,

                OrderBoardId  = orderBoardId,
                OrderStringId = orderStringId,
                TradeStringId = tradeStringId,
            };

            var error = ReadString(reader, metaInfo.Errors);

            if (!error.IsEmpty())
            {
                msg.Error = new InvalidOperationException(error);
            }

            msg.Currency = (CurrencyTypes?)reader.ReadNullableInt();

            if (reader.Read())
            {
                msg.Latency = reader.ReadLong().To <TimeSpan>();
            }

            if (reader.Read())
            {
                msg.OriginSide = reader.Read() ? Sides.Buy : Sides.Sell;
            }

            if (metaInfo.Version < MarketDataVersions.Version59)
            {
                return(msg);
            }

            msg.LocalTime = ReadItemLocalTime(reader, metaInfo, isTickPrecision);

            if (metaInfo.Version < MarketDataVersions.Version61)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.IsMarketMaker = reader.Read();
            }

            if (metaInfo.Version < MarketDataVersions.Version62)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.IsMargin = reader.Read();
            }

            if (metaInfo.Version < MarketDataVersions.Version63)
            {
                return(msg);
            }

            msg.CommissionCurrency = reader.ReadStringEx();

            if (metaInfo.Version < MarketDataVersions.Version64)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.IsManual = reader.Read();
            }

            if (metaInfo.Version < MarketDataVersions.Version65)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.PositionEffect = (OrderPositionEffects)reader.ReadInt();
            }

            if (reader.Read())
            {
                msg.PostOnly = reader.Read();
            }

            if (reader.Read())
            {
                msg.Initiator = reader.Read();
            }

            if (metaInfo.Version < MarketDataVersions.Version66)
            {
                return(msg);
            }

            msg.SeqNum     = reader.ReadLong();
            msg.StrategyId = ReadString(reader, metaInfo.StrategyIds);

            if (metaInfo.Version < MarketDataVersions.Version67)
            {
                return(msg);
            }

            msg.BuildFrom = reader.ReadBuildFrom();

            if (metaInfo.Version < MarketDataVersions.Version68)
            {
                return(msg);
            }

            msg.Leverage = reader.ReadNullableInt();

            return(msg);
        }
Пример #8
0
 public abstract TData MoveNext(MarketDataEnumerator enumerator);
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            metaInfo.FirstTransactionId         += reader.ReadLong();
            metaInfo.FirstOriginalTransactionId += reader.ReadLong();

            var hasOrderInfo = reader.Read();
            var hasTradeInfo = reader.Read();

            long?orderId = null;
            long?tradeId = null;

            string orderBoardId  = null;
            string orderStringId = null;
            string tradeStringId = null;

            if (reader.Read())
            {
                metaInfo.FirstOrderId += reader.ReadLong();
                orderId = metaInfo.FirstOrderId;
            }
            else
            {
                if (reader.Read())
                {
                    orderStringId = reader.ReadString();
                }
            }

            if (reader.Read())
            {
                orderBoardId = reader.ReadString();
            }

            if (reader.Read())
            {
                metaInfo.FirstTradeId += reader.ReadLong();
                tradeId = metaInfo.FirstTradeId;
            }
            else
            {
                if (reader.Read())
                {
                    tradeStringId = reader.ReadString();
                }
            }

            var orderPrice = reader.Read() ? reader.ReadPriceEx(metaInfo) : (decimal?)null;
            var tradePrice = reader.Read() ? reader.ReadPriceEx(metaInfo) : (decimal?)null;

            var side = reader.Read() ? Sides.Buy : Sides.Sell;

            var orderVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var tradeVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var visibleVolume = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
            var balance       = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, true, true, metaInfo.GetTimeZone(true, SecurityId), true, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var type        = reader.ReadNullableInt <OrderTypes>();
            var state       = reader.ReadNullableInt <OrderStates>();
            var status      = reader.ReadNullableInt <OrderStatus>();
            var tradeStatus = reader.ReadNullableInt <int>();
            var timeInForce = reader.ReadNullableInt <TimeInForce>();

            var isSystem = reader.Read() ? reader.Read() : (bool?)null;
            var isUpTick = reader.Read() ? reader.Read() : (bool?)null;

            var expDate = reader.Read() ? reader.ReadLong().To <DateTime>().ApplyTimeZone(new TimeSpan(reader.ReadInt(), reader.ReadInt(), 0)) : (DateTimeOffset?)null;

            var commission = reader.Read() ? metaInfo.FirstCommission = reader.ReadDecimal(metaInfo.FirstCommission) : (decimal?)null;
            var pnl        = reader.Read() ? metaInfo.FirstPnL = reader.ReadDecimal(metaInfo.FirstPnL) : (decimal?)null;
            var position   = reader.Read() ? metaInfo.FirstPosition = reader.ReadDecimal(metaInfo.FirstPosition) : (decimal?)null;
            var slippage   = reader.Read() ? metaInfo.FirstSlippage = reader.ReadDecimal(metaInfo.FirstSlippage) : (decimal?)null;

            var portfolio   = ReadString(reader, metaInfo.Portfolios);
            var clientCode  = ReadString(reader, metaInfo.ClientCodes);
            var brokerCode  = ReadString(reader, metaInfo.BrokerCodes);
            var depoName    = ReadString(reader, metaInfo.DepoNames);
            var userOrderId = ReadString(reader, metaInfo.UserOrderIds);
            var comment     = ReadString(reader, metaInfo.Comments);
            var sysComment  = ReadString(reader, metaInfo.SystemComments);

            var msg = new ExecutionMessage
            {
                ExecutionType = ExecutionTypes.Transaction,
                SecurityId    = SecurityId,

                ServerTime = serverTime,

                TransactionId         = metaInfo.FirstTransactionId,
                OriginalTransactionId = metaInfo.FirstOriginalTransactionId,

                Side          = side,
                OrderVolume   = orderVolume,
                TradeVolume   = tradeVolume,
                VisibleVolume = visibleVolume,
                Balance       = balance,

                OrderType     = type,
                OrderState    = state,
                OrderStatus   = status,
                TimeInForce   = timeInForce,
                IsSystem      = isSystem,
                IsUpTick      = isUpTick,
                ExpiryDate    = expDate,
                Commission    = commission,
                PnL           = pnl,
                Position      = position,
                Slippage      = slippage,
                PortfolioName = portfolio,
                ClientCode    = clientCode,
                BrokerCode    = brokerCode,
                DepoName      = depoName,
                UserOrderId   = userOrderId,
                Comment       = comment,
                SystemComment = sysComment,

                TradeStatus = tradeStatus,

                HasOrderInfo = hasOrderInfo,
                HasTradeInfo = hasTradeInfo,

                OrderPrice = orderPrice ?? 0,
                TradePrice = tradePrice,

                OrderId = orderId,
                TradeId = tradeId,

                OrderBoardId  = orderBoardId,
                OrderStringId = orderStringId,
                TradeStringId = tradeStringId,
            };

            var error = ReadString(reader, metaInfo.Errors);

            if (!error.IsEmpty())
            {
                msg.Error = new InvalidOperationException(error);
            }

            msg.Currency = reader.ReadNullableInt <CurrencyTypes>();

            if (reader.Read())
            {
                msg.Latency = reader.ReadLong().To <TimeSpan>();
            }

            if (reader.Read())
            {
                msg.OriginSide = reader.Read() ? Sides.Buy : Sides.Sell;
            }

            return(msg);
        }
Пример #10
0
        public override QuoteChangeMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var metaInfo = enumerator.MetaInfo;
            var reader   = enumerator.Reader;

            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version47;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version50;
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version52;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version53;
            var nonAdjustPrice   = metaInfo.Version >= MarketDataVersions.Version54;
            var useLong          = metaInfo.Version >= MarketDataVersions.Version55;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId, ExchangeInfoProvider), allowDiffOffsets, isTickPrecision, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var isFull    = reader.Read();
            var prevDepth = enumerator.Previous;

            var bids = DeserializeQuotes(reader, metaInfo, useLong, nonAdjustPrice);
            var asks = DeserializeQuotes(reader, metaInfo, useLong, nonAdjustPrice);

            var diff = new QuoteChangeMessage
            {
                LocalTime  = metaInfo.FirstTime,
                SecurityId = SecurityId,
                ServerTime = serverTime,
                Bids       = bids,
                Asks       = asks,
                IsSorted   = true,
            };

            if (metaInfo.Version < MarketDataVersions.Version48)
            {
                diff.Bids = diff.Bids.OrderByDescending(q => q.Price).ToArray();
                diff.Asks = diff.Asks.OrderBy(q => q.Price).ToArray();
            }

            var quoteMsg = isFull ? diff : prevDepth.AddDelta(diff);

            //if (depth.BestBid != null && depth.BestAsk != null && depth.BestBid.Price >= depth.BestAsk.Price)
            //	throw new InvalidOperationException("Лучший бид {0} больше или равен лучшему офферу {1}.".Put(depth.BestBid.Price, depth.BestAsk.Price));

            //metaInfo.FirstPrice = GetDepthPrice(quoteMsg);

            if (metaInfo.Version < MarketDataVersions.Version40)
            {
                return(quoteMsg);
            }

            if (metaInfo.Version < MarketDataVersions.Version46)
            {
                quoteMsg.LocalTime = quoteMsg.ServerTime - reader.ReadLong().To <TimeSpan>() + metaInfo.LocalOffset;
            }
            else
            {
                var hasLocalTime = true;

                if (metaInfo.Version >= MarketDataVersions.Version49)
                {
                    hasLocalTime = reader.Read();
                }

                if (hasLocalTime)
                {
                    var prevLocalTime = metaInfo.FirstLocalTime;
                    lastOffset = metaInfo.FirstLocalOffset;
                    var localTime = reader.ReadTime(ref prevLocalTime, allowNonOrdered, isUtc, metaInfo.LocalOffset, allowDiffOffsets, isTickPrecision, ref lastOffset);
                    metaInfo.FirstLocalTime   = prevLocalTime;
                    quoteMsg.LocalTime        = localTime;
                    metaInfo.FirstLocalOffset = lastOffset;
                }
                //else
                //	quoteMsg.LocalTime = quoteMsg.Time;
            }

            if (metaInfo.Version >= MarketDataVersions.Version51)
            {
                if (reader.Read())
                {
                    quoteMsg.Currency = (CurrencyTypes)reader.ReadInt();
                }
            }

            return(quoteMsg);
        }
Пример #11
0
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            metaInfo.FirstOrderId += reader.ReadLong();

            decimal price;

            if (metaInfo.Version < MarketDataVersions.Version45)
            {
                price = reader.ReadPriceEx(metaInfo);
            }
            else
            {
                if (reader.Read())
                {
                    price = metaInfo.FirstOrderPrice = reader.ReadPrice(metaInfo.FirstOrderPrice, metaInfo, true);
                }
                else
                {
                    price = metaInfo.FirstNonSystemPrice = reader.ReadDecimal(metaInfo.FirstNonSystemPrice);
                }
            }

            var volume = reader.ReadVolume(metaInfo);

            var orderDirection = reader.Read() ? Sides.Buy : Sides.Sell;

            var allowNonOrdered = metaInfo.Version >= MarketDataVersions.Version47;
            var isUtc           = metaInfo.Version >= MarketDataVersions.Version48;

            var prevTime   = metaInfo.FirstTime;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId));

            metaInfo.FirstTime = prevTime;

            var execMsg = new ExecutionMessage
            {
                //LocalTime = metaInfo.FirstTime,
                ExecutionType = ExecutionTypes.OrderLog,
                SecurityId    = SecurityId,
                OrderId       = metaInfo.FirstOrderId,
                Volume        = volume,
                Side          = orderDirection,
                ServerTime    = serverTime,
                Price         = price,
            };

            if (reader.Read())
            {
                metaInfo.FirstTradeId += reader.ReadLong();
                price = reader.ReadPriceEx(metaInfo);

                execMsg.TradeId    = metaInfo.FirstTradeId;
                execMsg.TradePrice = price;

                execMsg.OrderState = OrderStates.Done;
            }
            else
            {
                var active = reader.Read();
                execMsg.OrderState  = active ? OrderStates.Active : OrderStates.Done;
                execMsg.IsCancelled = !active;
            }

            if (metaInfo.Version >= MarketDataVersions.Version31)
            {
                execMsg.OrderStatus = reader.ReadNullableInt <OrderStatus>();

                if (execMsg.OrderStatus != null)
                {
                    var status = (int)execMsg.OrderStatus.Value;

                    if (status.HasBits(0x01))
                    {
                        execMsg.TimeInForce = TimeInForce.PutInQueue;
                    }
                    else if (status.HasBits(0x02))
                    {
                        execMsg.TimeInForce = TimeInForce.CancelBalance;
                    }
                }

                // Лучше ExecCond писать отдельным полем так как возможно только Плаза пишет это в статус
                if (metaInfo.Version >= MarketDataVersions.Version33)
                {
                    execMsg.TimeInForce = (TimeInForce)reader.ReadInt();
                    execMsg.IsSystem    = metaInfo.Version < MarketDataVersions.Version49
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

                    if (metaInfo.Version >= MarketDataVersions.Version34)
                    {
                        metaInfo.FirstTransactionId += reader.ReadLong();
                        execMsg.TransactionId        = metaInfo.FirstTransactionId;
                    }
                }
                else
                {
                    if (execMsg.OrderStatus != null)
                    {
                        execMsg.IsSystem = !((int)execMsg.OrderStatus).HasBits(0x04);
                    }
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version40)
            {
                if (metaInfo.Version < MarketDataVersions.Version46)
                {
                    /*item.Latency =*/ reader.ReadLong();                   //.To<TimeSpan>();
                }
                if (reader.Read())
                {
                    execMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];
                }
            }

            //if (order.Portfolio == null)
            //	order.Portfolio = Portfolio.AnonymousPortfolio;

            return(execMsg);
        }
Пример #12
0
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            metaInfo.FirstId += reader.ReadLong();
            var volume = reader.ReadVolume(metaInfo);
            var price  = reader.ReadPriceEx(metaInfo);

            var orderDirection = reader.Read() ? (reader.Read() ? Sides.Buy : Sides.Sell) : (Sides?)null;

            var allowNonOrdered = metaInfo.Version >= MarketDataVersions.Version48;
            var isUtc           = metaInfo.Version >= MarketDataVersions.Version50;

            var prevTime   = metaInfo.FirstTime;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId));

            metaInfo.FirstTime = prevTime;

            var msg = new ExecutionMessage
            {
                //LocalTime = metaInfo.FirstTime,
                ExecutionType = ExecutionTypes.Tick,
                SecurityId    = SecurityId,
                TradeId       = metaInfo.FirstId,
                Volume        = volume,
                OriginSide    = orderDirection,
                TradePrice    = price,
                ServerTime    = serverTime,
            };

            if (metaInfo.Version < MarketDataVersions.Version40)
            {
                return(msg);
            }

            if (metaInfo.Version < MarketDataVersions.Version47)
            {
                msg.LocalTime = msg.ServerTime.LocalDateTime - reader.ReadLong().To <TimeSpan>() + metaInfo.LocalOffset;
            }
            else
            {
                var hasLocalTime = true;

                if (metaInfo.Version >= MarketDataVersions.Version49)
                {
                    hasLocalTime = reader.Read();
                }

                if (hasLocalTime)
                {
                    var prevLocalTime = metaInfo.FirstLocalTime;
                    var localTime     = reader.ReadTime(ref prevLocalTime, allowNonOrdered, isUtc, metaInfo.LocalOffset);
                    metaInfo.FirstLocalTime = prevLocalTime;
                    msg.LocalTime           = localTime.LocalDateTime;
                }
                //else
                //	msg.LocalTime = msg.ServerTime;
            }

            if (metaInfo.Version < MarketDataVersions.Version42)
            {
                return(msg);
            }

            msg.IsSystem = metaInfo.Version < MarketDataVersions.Version51
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

            if (msg.IsSystem == false)
            {
                msg.TradeStatus = metaInfo.Version < MarketDataVersions.Version51
                                        ? reader.ReadInt()
                                        : reader.ReadNullableInt <int>();
            }

            if (metaInfo.Version < MarketDataVersions.Version46 || reader.Read())
            {
                msg.OpenInterest = reader.ReadVolume(metaInfo);
            }

            if (metaInfo.Version < MarketDataVersions.Version45)
            {
                return(msg);
            }

            if (reader.Read())
            {
                msg.IsUpTick = reader.Read();
            }

            return(msg);
        }
Пример #13
0
        public override PositionChangeMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var posMsg = new PositionChangeMessage {
                SecurityId = SecurityId
            };

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;

            posMsg.ServerTime          = reader.ReadTime(ref prevTime, true, true, metaInfo.GetTimeZone(true, SecurityId, ExchangeInfoProvider), true, true, ref lastOffset);
            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            if (reader.Read())
            {
                prevTime                  = metaInfo.FirstLocalTime;
                lastOffset                = metaInfo.FirstLocalOffset;
                posMsg.LocalTime          = reader.ReadTime(ref prevTime, true, true, metaInfo.LocalOffset, true, true, ref lastOffset);
                metaInfo.FirstLocalTime   = prevTime;
                metaInfo.FirstLocalOffset = lastOffset;
            }

            posMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];

            if (reader.Read())
            {
                posMsg.ClientCode = metaInfo.ClientCodes[reader.ReadInt()];
            }

            if (reader.Read())
            {
                posMsg.DepoName = metaInfo.DepoNames[reader.ReadInt()];
            }

            if (reader.Read())
            {
                posMsg.LimitType = (TPlusLimits)reader.ReadInt();
            }

            var changeCount = reader.ReadInt();

            for (var i = 0; i < changeCount; i++)
            {
                var type = (PositionChangeTypes)reader.ReadInt();

                switch (type)
                {
                case PositionChangeTypes.BeginValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.BeginValue));
                    break;

                case PositionChangeTypes.CurrentValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentValue));
                    break;

                case PositionChangeTypes.BlockedValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.BlockedValue));
                    break;

                case PositionChangeTypes.CurrentPrice:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentPrice));
                    break;

                case PositionChangeTypes.AveragePrice:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.AveragePrice));
                    break;

                case PositionChangeTypes.UnrealizedPnL:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.UnrealizedPnL));
                    break;

                case PositionChangeTypes.RealizedPnL:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.RealizedPnL));
                    break;

                case PositionChangeTypes.VariationMargin:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.VariationMargin));
                    break;

                case PositionChangeTypes.Currency:
                    posMsg.Add(type, (CurrencyTypes)reader.ReadInt());
                    break;

                case PositionChangeTypes.Leverage:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.Leverage));
                    break;

                case PositionChangeTypes.Commission:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.Commission));
                    break;

                case PositionChangeTypes.CurrentValueInLots:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentValueInLots));
                    break;

                case PositionChangeTypes.State:
                    posMsg.Add(type, (PortfolioStates)reader.ReadInt());
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            return(posMsg);
        }
Пример #14
0
        public override TCandleMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var candle = new TCandleMessage
            {
                SecurityId     = SecurityId,
                TotalVolume    = reader.ReadVolume(metaInfo),
                RelativeVolume = metaInfo.Version < MarketDataVersions.Version52 || !reader.Read() ? (decimal?)null : reader.ReadVolume(metaInfo),
                LowPrice       = reader.ReadPrice(metaInfo.FirstPrice, metaInfo),
                Arg            = _arg
            };

            candle.OpenPrice  = reader.ReadPrice(candle.LowPrice, metaInfo);
            candle.ClosePrice = reader.ReadPrice(candle.LowPrice, metaInfo);
            candle.HighPrice  = reader.ReadPrice(candle.LowPrice, metaInfo);

            var prevTime         = metaInfo.FirstTime;
            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version49;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version50;
            var timeZone         = metaInfo.GetTimeZone(isUtc, SecurityId);
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version53;

            var lastOffset = metaInfo.FirstServerOffset;

            candle.OpenTime            = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);
            metaInfo.FirstServerOffset = lastOffset;

            if (metaInfo.Version >= MarketDataVersions.Version46)
            {
                if (reader.Read())
                {
                    var isOrdered = reader.Read();

                    var first  = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);
                    var second = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);

                    candle.HighTime = isOrdered ? first : second;
                    candle.LowTime  = isOrdered ? second : first;
                }
                else
                {
                    if (reader.Read())
                    {
                        candle.HighTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);
                    }

                    if (reader.Read())
                    {
                        candle.LowTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);
                    }
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version47)
            {
                if (reader.Read())
                {
                    candle.CloseTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, ref lastOffset);
                }
            }
            else
            {
                candle.CloseTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.LocalOffset, allowDiffOffsets, ref lastOffset);
            }

            if (metaInfo.Version >= MarketDataVersions.Version46)
            {
                if (metaInfo.Version < MarketDataVersions.Version51)
                {
                    candle.OpenVolume  = reader.ReadVolume(metaInfo);
                    candle.HighVolume  = reader.ReadVolume(metaInfo);
                    candle.LowVolume   = reader.ReadVolume(metaInfo);
                    candle.CloseVolume = reader.ReadVolume(metaInfo);
                }
                else
                {
                    candle.OpenVolume  = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.HighVolume  = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.LowVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.CloseVolume = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                }
            }

            candle.State = (CandleStates)reader.ReadInt();

            metaInfo.FirstPrice = candle.LowPrice;
            metaInfo.FirstTime  = metaInfo.Version <= MarketDataVersions.Version40 ? candle.OpenTime.LocalDateTime : prevTime;

            if (metaInfo.Version >= MarketDataVersions.Version45)
            {
                if (metaInfo.Version < MarketDataVersions.Version48 || reader.Read())
                {
                    candle.OpenInterest = reader.ReadVolume(metaInfo);
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version52)
            {
                candle.DownTicks  = reader.Read() ? reader.ReadInt() : (int?)null;
                candle.UpTicks    = reader.Read() ? reader.ReadInt() : (int?)null;
                candle.TotalTicks = reader.Read() ? reader.ReadInt() : (int?)null;
            }

            return(candle);
        }
Пример #15
0
        public override QuoteChangeMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var metaInfo = enumerator.MetaInfo;
            var reader   = enumerator.Reader;

            var allowNonOrdered = metaInfo.Version >= MarketDataVersions.Version47;
            var isUtc           = metaInfo.Version >= MarketDataVersions.Version50;

            var prevTime   = metaInfo.FirstTime;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId));

            metaInfo.FirstTime = prevTime;

            var isFull    = reader.Read();
            var prevDepth = enumerator.Previous;

            var bids = DeserializeQuotes(reader, metaInfo, Sides.Buy);
            var asks = DeserializeQuotes(reader, metaInfo, Sides.Sell);

            var diff = new QuoteChangeMessage
            {
                LocalTime  = metaInfo.FirstTime,
                SecurityId = SecurityId,
                ServerTime = serverTime,
                Bids       = bids,
                Asks       = asks,
                IsSorted   = true,
            };

            if (metaInfo.Version < MarketDataVersions.Version48)
            {
                diff.Bids = diff.Bids.OrderByDescending(q => q.Price);
                diff.Asks = diff.Asks.OrderBy(q => q.Price);
            }

            var quoteMsg = isFull ? diff : prevDepth.AddDelta(diff);

            //if (depth.BestBid != null && depth.BestAsk != null && depth.BestBid.Price >= depth.BestAsk.Price)
            //	throw new InvalidOperationException("Лучший бид {0} больше или равен лучшему офферу {1}.".Put(depth.BestBid.Price, depth.BestAsk.Price));

            metaInfo.FirstPrice = GetDepthPrice(quoteMsg);

            if (metaInfo.Version < MarketDataVersions.Version40)
            {
                return(quoteMsg);
            }

            if (metaInfo.Version < MarketDataVersions.Version46)
            {
                quoteMsg.LocalTime = quoteMsg.ServerTime.LocalDateTime - reader.ReadLong().To <TimeSpan>() + metaInfo.LocalOffset;
            }
            else
            {
                var hasLocalTime = true;

                if (metaInfo.Version >= MarketDataVersions.Version49)
                {
                    hasLocalTime = reader.Read();
                }

                if (hasLocalTime)
                {
                    var prevLocalTime = metaInfo.FirstLocalTime;
                    var localTime     = reader.ReadTime(ref prevLocalTime, allowNonOrdered, isUtc, metaInfo.LocalOffset);
                    metaInfo.FirstLocalTime = prevLocalTime;
                    quoteMsg.LocalTime      = localTime.LocalDateTime;
                }
                //else
                //	quoteMsg.LocalTime = quoteMsg.Time;
            }

            return(quoteMsg);
        }
Пример #16
0
        public override TCandleMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var candle = new TCandleMessage
            {
                SecurityId     = SecurityId,
                TotalVolume    = reader.ReadVolume(metaInfo),
                RelativeVolume = metaInfo.Version < MarketDataVersions.Version52 || !reader.Read() ? (decimal?)null : reader.ReadVolume(metaInfo),
                Arg            = Arg
            };

            var prevTime         = metaInfo.FirstTime;
            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version49;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version50;
            var timeZone         = metaInfo.GetTimeZone(isUtc, SecurityId, ExchangeInfoProvider);
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version53;
            var useLevels        = metaInfo.Version >= MarketDataVersions.Version54;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version57;
            var useLong          = metaInfo.Version >= MarketDataVersions.Version58;
            var buildFrom        = metaInfo.Version >= MarketDataVersions.Version59;
            var seqNum           = metaInfo.Version >= MarketDataVersions.Version60;

            if (metaInfo.Version < MarketDataVersions.Version56)
            {
                var prevPrice = metaInfo.FirstPrice;
                candle.LowPrice     = reader.ReadPrice(ref prevPrice, metaInfo);
                metaInfo.FirstPrice = prevPrice;

                prevPrice        = metaInfo.FirstPrice;
                candle.OpenPrice = reader.ReadPrice(ref prevPrice, metaInfo);

                prevPrice         = metaInfo.FirstPrice;
                candle.ClosePrice = reader.ReadPrice(ref prevPrice, metaInfo);

                prevPrice        = metaInfo.FirstPrice;
                candle.HighPrice = reader.ReadPrice(ref prevPrice, metaInfo);
            }
            else
            {
                candle.LowPrice = reader.ReadPriceEx(metaInfo, useLong);

                if (reader.Read())
                {
                    candle.OpenPrice  = reader.ReadPriceEx(metaInfo, useLong);
                    candle.ClosePrice = reader.ReadPriceEx(metaInfo, useLong);
                }
                else
                {
                    candle.ClosePrice = reader.ReadPriceEx(metaInfo, useLong);
                    candle.OpenPrice  = reader.ReadPriceEx(metaInfo, useLong);
                }

                candle.HighPrice = reader.ReadPriceEx(metaInfo, useLong);
            }

            var lastOffset = metaInfo.FirstServerOffset;

            candle.OpenTime            = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);
            metaInfo.FirstServerOffset = lastOffset;

            if (metaInfo.Version >= MarketDataVersions.Version46)
            {
                if (reader.Read())
                {
                    var isOrdered = reader.Read();

                    var first  = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);
                    var second = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);

                    candle.HighTime = isOrdered ? first : second;
                    candle.LowTime  = isOrdered ? second : first;
                }
                else
                {
                    if (reader.Read())
                    {
                        candle.HighTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);
                    }

                    if (reader.Read())
                    {
                        candle.LowTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);
                    }
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version47)
            {
                if (reader.Read())
                {
                    candle.CloseTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, timeZone, allowDiffOffsets, isTickPrecision, ref lastOffset);
                }
            }
            else
            {
                candle.CloseTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.LocalOffset, allowDiffOffsets, false, ref lastOffset);
            }

            if (metaInfo.Version >= MarketDataVersions.Version46)
            {
                if (metaInfo.Version < MarketDataVersions.Version51)
                {
                    candle.OpenVolume  = reader.ReadVolume(metaInfo);
                    candle.HighVolume  = reader.ReadVolume(metaInfo);
                    candle.LowVolume   = reader.ReadVolume(metaInfo);
                    candle.CloseVolume = reader.ReadVolume(metaInfo);
                }
                else
                {
                    candle.OpenVolume  = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.HighVolume  = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.LowVolume   = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                    candle.CloseVolume = reader.Read() ? reader.ReadVolume(metaInfo) : (decimal?)null;
                }
            }

            candle.State = (CandleStates)reader.ReadInt();

            metaInfo.FirstTime = metaInfo.Version <= MarketDataVersions.Version40 ? candle.OpenTime.LocalDateTime : prevTime;

            if (metaInfo.Version >= MarketDataVersions.Version45)
            {
                if (metaInfo.Version < MarketDataVersions.Version48 || reader.Read())
                {
                    candle.OpenInterest = reader.ReadVolume(metaInfo);
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version52)
            {
                candle.DownTicks  = reader.Read() ? reader.ReadInt() : (int?)null;
                candle.UpTicks    = reader.Read() ? reader.ReadInt() : (int?)null;
                candle.TotalTicks = reader.Read() ? reader.ReadInt() : (int?)null;
            }

            if (!useLevels)
            {
                return(candle);
            }

            if (reader.Read())
            {
                var priceLevels = new CandlePriceLevel[reader.ReadInt()];

                for (var i = 0; i < priceLevels.Length; i++)
                {
                    var prevPrice = metaInfo.FirstPrice;

                    var priceLevel = new CandlePriceLevel
                    {
                        Price = metaInfo.Version < MarketDataVersions.Version56
                                                                ? reader.ReadPrice(ref prevPrice, metaInfo)
                                                                : reader.ReadPriceEx(metaInfo),
                        BuyCount   = reader.ReadInt(),
                        SellCount  = reader.ReadInt(),
                        BuyVolume  = reader.ReadVolume(metaInfo),
                        SellVolume = reader.ReadVolume(metaInfo)
                    };

                    if (metaInfo.Version >= MarketDataVersions.Version55)
                    {
                        priceLevel.TotalVolume = reader.ReadVolume(metaInfo);
                    }

                    if (reader.Read())
                    {
                        var volumes = new decimal[reader.ReadInt()];

                        for (var j = 0; j < volumes.Length; j++)
                        {
                            volumes[j] = reader.ReadVolume(metaInfo);
                        }

                        priceLevel.BuyVolumes = volumes;
                    }

                    if (reader.Read())
                    {
                        var volumes = new decimal[reader.ReadInt()];

                        for (var j = 0; j < volumes.Length; j++)
                        {
                            volumes[j] = reader.ReadVolume(metaInfo);
                        }

                        priceLevel.SellVolumes = volumes;
                    }

                    priceLevels[i] = priceLevel;
                }

                candle.PriceLevels = priceLevels;
            }

            if (!buildFrom)
            {
                return(candle);
            }

            candle.BuildFrom = reader.ReadBuildFrom();

            if (!seqNum)
            {
                return(candle);
            }

            reader.ReadSeqNum(candle, metaInfo);

            return(candle);
        }
Пример #17
0
        public override PositionChangeMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var buildFrom = metaInfo.Version >= MarketDataVersions.Version35;
            var side      = metaInfo.Version >= MarketDataVersions.Version36;

            var posMsg = new PositionChangeMessage {
                SecurityId = SecurityId
            };

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;

            posMsg.ServerTime          = reader.ReadTime(ref prevTime, true, true, metaInfo.GetTimeZone(true, SecurityId, ExchangeInfoProvider), true, true, ref lastOffset);
            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            if (reader.Read())
            {
                prevTime                  = metaInfo.FirstLocalTime;
                lastOffset                = metaInfo.FirstLocalOffset;
                posMsg.LocalTime          = reader.ReadTime(ref prevTime, true, true, metaInfo.LocalOffset, true, true, ref lastOffset);
                metaInfo.FirstLocalTime   = prevTime;
                metaInfo.FirstLocalOffset = lastOffset;
            }

            posMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];

            if (reader.Read())
            {
                posMsg.ClientCode = metaInfo.ClientCodes[reader.ReadInt()];
            }

            if (reader.Read())
            {
                posMsg.DepoName = metaInfo.DepoNames[reader.ReadInt()];
            }

            if (reader.Read())
            {
                posMsg.LimitType = (TPlusLimits)reader.ReadInt();
            }

            var changeCount = reader.ReadInt();

            for (var i = 0; i < changeCount; i++)
            {
                var type = (PositionChangeTypes)reader.ReadInt();

                switch (type)
                {
                case PositionChangeTypes.BeginValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.BeginValue));
                    break;

                case PositionChangeTypes.CurrentValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentValue));
                    break;

                case PositionChangeTypes.BlockedValue:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.BlockedValue));
                    break;

                case PositionChangeTypes.CurrentPrice:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentPrice));
                    break;

                case PositionChangeTypes.AveragePrice:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.AveragePrice));
                    break;

                case PositionChangeTypes.UnrealizedPnL:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.UnrealizedPnL));
                    break;

                case PositionChangeTypes.RealizedPnL:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.RealizedPnL));
                    break;

                case PositionChangeTypes.VariationMargin:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.VariationMargin));
                    break;

                case PositionChangeTypes.Currency:
                    posMsg.Add(type, (CurrencyTypes)reader.ReadInt());
                    break;

                case PositionChangeTypes.Leverage:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.Leverage));
                    break;

                case PositionChangeTypes.Commission:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.Commission));
                    break;

                case PositionChangeTypes.CurrentValueInLots:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.CurrentValueInLots));
                    break;

                case PositionChangeTypes.State:
                    posMsg.Add(type, (PortfolioStates)reader.ReadInt());
                    break;

                case PositionChangeTypes.ExpirationDate:
                    posMsg.Add(type, reader.ReadDto().Value);
                    break;

                case PositionChangeTypes.CommissionMaker:
                case PositionChangeTypes.CommissionTaker:
                case PositionChangeTypes.BuyOrdersMargin:
                case PositionChangeTypes.SellOrdersMargin:
                case PositionChangeTypes.OrdersMargin:
                    posMsg.Add(type, reader.ReadDecimal(0));
                    break;

                case PositionChangeTypes.SettlementPrice:
                    posMsg.Add(type, DeserializeChange(reader, metaInfo.SettlementPrice));
                    break;

                case PositionChangeTypes.BuyOrdersCount:
                case PositionChangeTypes.SellOrdersCount:
                case PositionChangeTypes.OrdersCount:
                case PositionChangeTypes.TradesCount:
                    posMsg.Add(type, reader.ReadInt());
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (metaInfo.Version < MarketDataVersions.Version34)
            {
                return(posMsg);
            }

            posMsg.Description = reader.ReadStringEx();
            posMsg.StrategyId  = reader.ReadStringEx();

            if (!buildFrom)
            {
                return(posMsg);
            }

            posMsg.BuildFrom = reader.ReadBuildFrom();

            if (!side)
            {
                return(posMsg);
            }

            posMsg.Side = reader.ReadNullableSide();

            return(posMsg);
        }
Пример #18
0
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            metaInfo.FirstOrderId += reader.ReadLong();

            decimal price;

            if (metaInfo.Version < MarketDataVersions.Version45)
            {
                price = reader.ReadPriceEx(metaInfo);
            }
            else
            {
                if (reader.Read())
                {
                    price = metaInfo.FirstOrderPrice = reader.ReadPrice(metaInfo.FirstOrderPrice, metaInfo, true);
                }
                else
                {
                    price = metaInfo.FirstFractionalPrice = reader.ReadDecimal(metaInfo.FirstFractionalPrice);
                }
            }

            var volume = reader.ReadVolume(metaInfo);

            var orderDirection = reader.Read() ? Sides.Buy : Sides.Sell;

            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version47;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version48;
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version52;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version53;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId, ExchangeInfoProvider), allowDiffOffsets, isTickPrecision, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var execMsg = new ExecutionMessage
            {
                //LocalTime = metaInfo.FirstTime,
                ExecutionType = ExecutionTypes.OrderLog,
                SecurityId    = SecurityId,
                OrderId       = metaInfo.FirstOrderId,
                OrderVolume   = volume,
                Side          = orderDirection,
                ServerTime    = serverTime,
                OrderPrice    = price,
            };

            if (reader.Read())
            {
                metaInfo.FirstTradeId += reader.ReadLong();
                price = reader.ReadPriceEx(metaInfo);

                execMsg.TradeId    = metaInfo.FirstTradeId;
                execMsg.TradePrice = price;

                execMsg.OrderState = OrderStates.Done;
            }
            else
            {
                var active = reader.Read();
                execMsg.OrderState  = active ? OrderStates.Active : OrderStates.Done;
                execMsg.IsCancelled = !active;
            }

            if (metaInfo.Version >= MarketDataVersions.Version31)
            {
                execMsg.OrderStatus = reader.ReadNullableInt <long>();

                if (execMsg.OrderStatus != null)
                {
                    execMsg.TimeInForce = execMsg.OrderStatus.Value.GetPlazaTimeInForce();
                }

                // Лучше ExecCond писать отдельным полем так как возможно только Плаза пишет это в статус
                if (metaInfo.Version >= MarketDataVersions.Version33)
                {
                    if (metaInfo.Version < MarketDataVersions.Version50)
                    {
                        execMsg.TimeInForce = (TimeInForce)reader.ReadInt();
                    }
                    else
                    {
                        execMsg.TimeInForce = reader.Read() ? (TimeInForce)reader.ReadInt() : (TimeInForce?)null;
                    }

                    execMsg.IsSystem = metaInfo.Version < MarketDataVersions.Version49
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

                    if (metaInfo.Version >= MarketDataVersions.Version34)
                    {
                        metaInfo.FirstTransactionId += reader.ReadLong();
                        execMsg.TransactionId        = metaInfo.FirstTransactionId;
                    }
                }
                else
                {
                    if (execMsg.OrderStatus != null)
                    {
                        execMsg.IsSystem = execMsg.OrderStatus.Value.IsPlazaSystem();
                    }
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version40)
            {
                if (metaInfo.Version < MarketDataVersions.Version46)
                {
                    /*item.Latency =*/ reader.ReadLong();                   //.To<TimeSpan>();
                }
                if (reader.Read())
                {
                    execMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];
                }
            }

            //if (order.Portfolio == null)
            //	order.Portfolio = Portfolio.AnonymousPortfolio;

            if (metaInfo.Version >= MarketDataVersions.Version51)
            {
                if (reader.Read())
                {
                    execMsg.Currency = (CurrencyTypes)reader.ReadInt();
                }
            }

            return(execMsg);
        }
        public override ExecutionMessage MoveNext(MarketDataEnumerator enumerator)
        {
            var reader   = enumerator.Reader;
            var metaInfo = enumerator.MetaInfo;

            var allowNonOrdered  = metaInfo.Version >= MarketDataVersions.Version47;
            var isUtc            = metaInfo.Version >= MarketDataVersions.Version48;
            var allowDiffOffsets = metaInfo.Version >= MarketDataVersions.Version52;
            var isTickPrecision  = metaInfo.Version >= MarketDataVersions.Version53;
            var useBalance       = metaInfo.Version >= MarketDataVersions.Version54;
            var buildFrom        = metaInfo.Version >= MarketDataVersions.Version55;
            var seqNum           = metaInfo.Version >= MarketDataVersions.Version56;
            var useLong          = metaInfo.Version >= MarketDataVersions.Version57;
            var largeDecimal     = metaInfo.Version >= MarketDataVersions.Version57;
            var stringId         = metaInfo.Version >= MarketDataVersions.Version58;

            metaInfo.FirstOrderId += reader.ReadLong();

            decimal price;

            if (metaInfo.Version < MarketDataVersions.Version45)
            {
                price = reader.ReadPriceEx(metaInfo, false, false);
            }
            else
            {
                if (reader.Read())
                {
                    var prevPrice = metaInfo.FirstOrderPrice;
                    price = reader.ReadPrice(ref prevPrice, metaInfo, true);
                    metaInfo.FirstOrderPrice = prevPrice;
                }
                else
                {
                    price = metaInfo.FirstFractionalPrice = reader.ReadDecimal(metaInfo.FirstFractionalPrice);
                }
            }

            var volume = reader.ReadVolume(metaInfo, largeDecimal);

            var orderDirection = reader.Read() ? Sides.Buy : Sides.Sell;

            var prevTime   = metaInfo.FirstTime;
            var lastOffset = metaInfo.FirstServerOffset;
            var serverTime = reader.ReadTime(ref prevTime, allowNonOrdered, isUtc, metaInfo.GetTimeZone(isUtc, SecurityId, ExchangeInfoProvider), allowDiffOffsets, isTickPrecision, ref lastOffset);

            metaInfo.FirstTime         = prevTime;
            metaInfo.FirstServerOffset = lastOffset;

            var execMsg = new ExecutionMessage
            {
                //LocalTime = metaInfo.FirstTime,
                DataTypeEx  = DataType.OrderLog,
                SecurityId  = SecurityId,
                OrderId     = metaInfo.FirstOrderId,
                OrderVolume = volume,
                Side        = orderDirection,
                ServerTime  = serverTime,
                OrderPrice  = price,
            };

            if (reader.Read())
            {
                metaInfo.FirstTradeId += reader.ReadLong();
                price = reader.ReadPriceEx(metaInfo, useLong, largeDecimal);

                execMsg.TradeId    = metaInfo.FirstTradeId;
                execMsg.TradePrice = price;

                if (metaInfo.Version >= MarketDataVersions.Version54)
                {
                    execMsg.OrderState = (OrderStates)reader.ReadInt();
                }
                else
                {
                    execMsg.OrderState = OrderStates.Done;
                }
            }
            else
            {
                if (metaInfo.Version >= MarketDataVersions.Version54)
                {
                    execMsg.OrderState = (OrderStates)reader.ReadInt();
                }
                else
                {
                    execMsg.OrderState = reader.Read() ? OrderStates.Active : OrderStates.Done;
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version31)
            {
                execMsg.OrderStatus = reader.ReadNullableInt();

                if (execMsg.OrderStatus != null)
                {
                    execMsg.TimeInForce = execMsg.OrderStatus.Value.GetPlazaTimeInForce();
                }

                // Лучше ExecCond писать отдельным полем так как возможно только Плаза пишет это в статус
                if (metaInfo.Version >= MarketDataVersions.Version33)
                {
                    if (metaInfo.Version < MarketDataVersions.Version50)
                    {
                        execMsg.TimeInForce = (TimeInForce)reader.ReadInt();
                    }
                    else
                    {
                        execMsg.TimeInForce = reader.Read() ? (TimeInForce)reader.ReadInt() : null;
                    }

                    execMsg.IsSystem = metaInfo.Version < MarketDataVersions.Version49
                                                ? reader.Read()
                                                : (reader.Read() ? reader.Read() : (bool?)null);

                    if (metaInfo.Version >= MarketDataVersions.Version34)
                    {
                        metaInfo.FirstTransactionId += reader.ReadLong();
                        execMsg.TransactionId        = metaInfo.FirstTransactionId;
                    }
                }
                else
                {
                    if (execMsg.OrderStatus != null)
                    {
                        execMsg.IsSystem = execMsg.OrderStatus.Value.IsPlazaSystem();
                    }
                }
            }

            if (metaInfo.Version >= MarketDataVersions.Version40)
            {
                if (metaInfo.Version < MarketDataVersions.Version46)
                {
                    /*item.Latency =*/ reader.ReadLong();                   //.To<TimeSpan>();
                }
                if (reader.Read())
                {
                    if (metaInfo.Version >= MarketDataVersions.Version54)
                    {
                        if (reader.Read())
                        {
                            execMsg.PortfolioName = Portfolio.AnonymousPortfolio.Name;
                        }
                        else
                        {
                            execMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];
                        }
                    }
                    else
                    {
                        execMsg.PortfolioName = metaInfo.Portfolios[reader.ReadInt()];
                    }
                }
            }

            //if (order.Portfolio == null)
            //	order.Portfolio = Portfolio.AnonymousPortfolio;

            if (metaInfo.Version >= MarketDataVersions.Version51)
            {
                if (reader.Read())
                {
                    execMsg.Currency = (CurrencyTypes)reader.ReadInt();
                }
            }

            if (!useBalance)
            {
                return(execMsg);
            }

            if (reader.Read())
            {
                execMsg.Balance = reader.Read() ? reader.ReadDecimal(0) : 0M;
            }

            if (!buildFrom)
            {
                return(execMsg);
            }

            execMsg.BuildFrom = reader.ReadBuildFrom();

            if (!seqNum)
            {
                return(execMsg);
            }

            reader.ReadSeqNum(execMsg, metaInfo);

            if (!stringId)
            {
                return(execMsg);
            }

            if (reader.Read())
            {
                execMsg.OrderId = null;
            }

            execMsg.OrderStringId = reader.ReadStringEx();

            if (reader.Read())
            {
                execMsg.TradeId = null;
            }

            execMsg.TradeStringId = reader.ReadStringEx();

            if (reader.Read())
            {
                metaInfo.FirstOrderId += reader.ReadLong();
                execMsg.OrderBuyId     = metaInfo.FirstOrderId;
            }

            if (reader.Read())
            {
                metaInfo.FirstOrderId += reader.ReadLong();
                execMsg.OrderSellId    = metaInfo.FirstOrderId;
            }

            execMsg.IsUpTick     = reader.ReadNullableBool();
            execMsg.Yield        = reader.ReadNullableDecimal();
            execMsg.TradeStatus  = reader.ReadNullableInt();
            execMsg.OpenInterest = reader.ReadNullableDecimal();
            execMsg.OriginSide   = (Sides?)reader.ReadNullableInt();

            return(execMsg);
        }