void ISnapshotSerializer <ExecutionMessage> .Serialize(Version version, ExecutionMessage message, byte[] buffer)
        {
            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var snapshot = new TransactionSnapshot
            {
                SecurityId = message.SecurityId.ToStringId(),
                Portfolio  = message.PortfolioName,
                ServerTime = message.ServerTime.To <long>(),
                LocalTime  = message.LocalTime.To <long>(),
            };



            var ptr = snapshot.StructToPtr();

            Marshal.Copy(ptr, buffer, 0, _snapshotSize);
            Marshal.FreeHGlobal(ptr);
        }
        private CategoryMonthKey GetCategoryMonthKey(TransactionSnapshot transaction, SubTransactionSnapshot subTransaction)
        {
            if (subTransaction.Category == null)
            {
                return(null);
            }

            return(new CategoryMonthKey(subTransaction.Category, transaction.TransactionDate));
        }
        void ISnapshotSerializer <ExecutionMessage> .Serialize(Version version, ExecutionMessage message, byte[] buffer)
        {
            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var snapshot = new TransactionSnapshot
            {
                SecurityId           = message.SecurityId.ToStringId(),
                Portfolio            = message.PortfolioName,
                LastChangeServerTime = message.ServerTime.To <long>(),
                LastChangeLocalTime  = message.LocalTime.To <long>(),

                BrokerCode    = message.BrokerCode,
                ClientCode    = message.ClientCode,
                Comment       = message.Comment,
                SystemComment = message.SystemComment,
                Currency      = message.Currency == null ? (short)-1 : (short)message.Currency.Value,
                // TODO
                //Condition = message.Condition,
                DepoName              = message.DepoName,
                Error                 = message.Error?.Message,
                ExpiryDate            = message.ExpiryDate?.To <long>() ?? 0,
                PortfolioName         = message.PortfolioName,
                IsMarketMaker         = message.IsMarketMaker,
                IsMargin              = message.IsMargin,
                Side                  = (byte)message.Side,
                OrderStringId         = message.OrderStringId,
                OrderBoardId          = message.OrderBoardId,
                OrderPrice            = message.OrderPrice,
                OrderVolume           = message.OrderVolume ?? 0,
                VisibleVolume         = message.VisibleVolume,
                OrderState            = message.OrderState == null ? (sbyte)-1 : (sbyte)message.OrderState.Value,
                OrderStatus           = message.OrderStatus ?? 0,
                Balance               = message.Balance ?? 0,
                UserOrderId           = message.UserOrderId,
                OriginSide            = message.OriginSide == null ? (sbyte)-1 : (sbyte)message.OriginSide.Value,
                Latency               = (int)(message.Latency?.Ticks ?? 0),
                PnL                   = message.PnL ?? 0,
                Position              = message.Position ?? 0,
                Slippage              = message.Slippage ?? 0,
                Commission            = message.Commission ?? 0,
                TradePrice            = message.TradePrice ?? 0,
                TradeVolume           = message.TradeVolume ?? 0,
                TradeStatus           = message.TradeStatus ?? 0,
                TradeId               = message.TradeId ?? 0,
                TradeStringId         = message.TradeStringId,
                OpenInterest          = message.OpenInterest ?? 0,
                OriginalTransactionId = message.OriginalTransactionId,
                TransactionId         = message.TransactionId,
            };

            var ptr = snapshot.StructToPtr();

            Marshal.Copy(ptr, buffer, 0, _snapshotSize);
            Marshal.FreeHGlobal(ptr);
        }
        byte[] ISnapshotSerializer <string, ExecutionMessage> .Serialize(Version version, ExecutionMessage message)
        {
            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (message.ExecutionType != ExecutionTypes.Transaction)
            {
                throw new ArgumentOutOfRangeException(nameof(message), message.ExecutionType, LocalizedStrings.Str1695Params.Put(message));
            }

            if (message.TransactionId == 0)
            {
                throw new InvalidOperationException("TransId == 0");
            }

            var snapshot = new TransactionSnapshot
            {
                SecurityId           = message.SecurityId.ToStringId().VerifySize(Sizes.S100),
                PortfolioName        = message.PortfolioName.VerifySize(Sizes.S100),
                LastChangeServerTime = message.ServerTime.To <long>(),
                LastChangeLocalTime  = message.LocalTime.To <long>(),

                //OriginalTransactionId = message.OriginalTransactionId,
                TransactionId = message.TransactionId,

                HasOrderInfo = message.HasOrderInfo,
                HasTradeInfo = message.HasTradeInfo,

                BrokerCode    = message.BrokerCode.VerifySize(Sizes.S100),
                ClientCode    = message.ClientCode.VerifySize(Sizes.S100),
                Comment       = message.Comment.VerifySize(Sizes.S100),
                SystemComment = message.SystemComment.VerifySize(Sizes.S100),
                Currency      = message.Currency == null ? (short?)null : (short)message.Currency.Value,
                DepoName      = message.DepoName.VerifySize(Sizes.S100),
                Error         = (message.Error?.Message).VerifySize(Sizes.S200),
                ExpiryDate    = message.ExpiryDate?.To <long>(),
                IsMarketMaker = message.IsMarketMaker == null ? (byte?)null : (byte)(message.IsMarketMaker.Value ? 1 : 0),
                IsMargin      = message.IsMargin == null ? (byte?)null : (byte)(message.IsMargin.Value ? 1 : 0),
                IsManual      = message.IsManual == null ? (byte?)null : (byte)(message.IsManual.Value ? 1 : 0),
                Side          = (byte)message.Side,
                OrderId       = message.OrderId,
                OrderStringId = message.OrderStringId.VerifySize(Sizes.S100),
                OrderBoardId  = message.OrderBoardId.VerifySize(Sizes.S100),
                OrderPrice    = (BlittableDecimal)message.OrderPrice,
                OrderVolume   = (BlittableDecimal?)message.OrderVolume,
                VisibleVolume = (BlittableDecimal?)message.VisibleVolume,
                OrderType     = message.OrderType == null ? (byte?)null : (byte)message.OrderType.Value,
                OrderState    = message.OrderState == null ? (byte?)null : (byte)message.OrderState.Value,
                OrderStatus   = message.OrderStatus,
                Balance       = (BlittableDecimal?)message.Balance,
                UserOrderId   = message.UserOrderId.VerifySize(Sizes.S100),
                OriginSide    = message.OriginSide == null ? (byte?)null : (byte)message.OriginSide.Value,
                Latency       = message.Latency?.Ticks,
                PnL           = (BlittableDecimal?)message.PnL,
                Position      = (BlittableDecimal?)message.Position,
                Slippage      = (BlittableDecimal?)message.Slippage,
                Commission    = (BlittableDecimal?)message.Commission,
                TradePrice    = (BlittableDecimal?)message.TradePrice,
                TradeVolume   = (BlittableDecimal?)message.TradeVolume,
                TradeStatus   = message.TradeStatus,
                TradeId       = message.TradeId,
                TradeStringId = message.TradeStringId.VerifySize(Sizes.S100),
                OpenInterest  = (BlittableDecimal?)message.OpenInterest,
                IsSystem      = message.IsSystem == null ? (byte?)null : (byte)(message.IsSystem.Value ? 1 : 0),
                OrderTif      = message.TimeInForce == null ? (byte?)null : (byte)message.TimeInForce.Value,
                ConditionType = (message.Condition?.GetType().GetTypeName(false)).VerifySize(Sizes.S256),
            };

            var conParams = message.Condition?.Parameters.Where(p => p.Value != null).ToArray() ?? ArrayHelper.Empty <KeyValuePair <string, object> >();

            snapshot.ConditionParamsCount = conParams.Length;

            var paramSize = typeof(TransactionConditionParamV21).SizeOf();

            var result = new List <byte>();

            var buffer = new byte[typeof(TransactionSnapshot).SizeOf()];

            var ptr = snapshot.StructToPtr();

            ptr.CopyTo(buffer);
            ptr.FreeHGlobal();

            result.AddRange(buffer);

            foreach (var conParam in conParams)
            {
                var paramType = conParam.Value.GetType();

                var paramTypeName = paramType.GetTypeAsString(false);

                var param = new TransactionConditionParamV21
                {
                    ValueTypeLen = paramTypeName.UTF8().Length,
                    Name         = conParam.Key.VerifySize(Sizes.S32)
                };

                byte[] stringValue = null;

                switch (conParam.Value)
                {
                case byte b:
                    param.NumValue = b;
                    break;

                case sbyte sb:
                    param.NumValue = sb;
                    break;

                case int i:
                    param.NumValue = i;
                    break;

                case short s:
                    param.NumValue = s;
                    break;

                case long l:
                    param.NumValue = l;
                    break;

                case uint ui:
                    param.NumValue = ui;
                    break;

                case ushort us:
                    param.NumValue = us;
                    break;

                case ulong ul:
                    param.NumValue = (long)ul;
                    break;

                case DateTimeOffset dto:
                    param.NumValue = dto.To <long>();
                    break;

                case DateTime dt:
                    param.NumValue = dt.To <long>();
                    break;

                case TimeSpan ts:
                    param.NumValue = ts.To <long>();
                    break;

                case float f:
                    param.DecimalValue = (BlittableDecimal)(decimal)f;
                    break;

                case double d:
                    param.DecimalValue = (BlittableDecimal)(decimal)d;
                    break;

                case decimal dec:
                    param.DecimalValue = (BlittableDecimal)dec;
                    break;

                case bool bln:
                    param.BoolValue = bln;
                    break;

                case Enum e:
                    param.NumValue = e.To <long>();
                    break;

                case IRange r:
                {
                    var storage = new SettingsStorage();

                    if (r.HasMinValue)
                    {
                        storage.SetValue(nameof(r.Min), r.Min);
                    }

                    if (r.HasMaxValue)
                    {
                        storage.SetValue(nameof(r.Max), r.Max);
                    }

                    if (storage.Count > 0)
                    {
                        stringValue = new XmlSerializer <SettingsStorage>().Serialize(storage);
                    }

                    break;
                }

                case IPersistable p:
                {
                    var storage = p.Save();

                    if (storage.Count > 0)
                    {
                        stringValue = new XmlSerializer <SettingsStorage>().Serialize(storage);
                    }

                    break;
                }

                default:
                    stringValue = typeof(XmlSerializer <>).Make(paramType).CreateInstance <ISerializer>().Serialize(conParam.Value);
                    break;
                }

                if (stringValue != null)
                {
                    param.StringValueLen = stringValue.Length;
                }

                var paramBuff = new byte[paramSize];

                var rowPtr = param.StructToPtr();
                rowPtr.CopyTo(paramBuff);
                rowPtr.FreeHGlobal();

                result.AddRange(paramBuff);

                if (version > SnapshotVersions.V20)
                {
                    result.AddRange(paramTypeName.UTF8());
                }

                if (stringValue == null)
                {
                    continue;
                }

                result.AddRange(stringValue);
            }

            return(result.ToArray());
        }
 private decimal GetTransactionAmount(TransactionSnapshot snapshot)
 {
     return(CurrencyConverter.ToDecimalValue(snapshot.Amount, snapshot.Amount_Denominator));
 }
示例#6
0
        byte[] ISnapshotSerializer <string, ExecutionMessage> .Serialize(Version version, ExecutionMessage message)
        {
            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (message.ExecutionType != ExecutionTypes.Transaction)
            {
                throw new ArgumentOutOfRangeException(nameof(message), message.ExecutionType, LocalizedStrings.Str1695Params.Put(message));
            }

            if (message.TransactionId == 0)
            {
                throw new InvalidOperationException("TransId == 0");
            }

            var snapshot = new TransactionSnapshot
            {
                SecurityId           = message.SecurityId.ToStringId(),
                Portfolio            = message.PortfolioName,
                LastChangeServerTime = message.ServerTime.To <long>(),
                LastChangeLocalTime  = message.LocalTime.To <long>(),

                //OriginalTransactionId = message.OriginalTransactionId,
                TransactionId = message.TransactionId,

                HasOrderInfo = message.HasOrderInfo,
                HasTradeInfo = message.HasTradeInfo,

                BrokerCode    = message.BrokerCode,
                ClientCode    = message.ClientCode,
                Comment       = message.Comment,
                SystemComment = message.SystemComment,
                Currency      = message.Currency == null ? (short?)null : (short)message.Currency.Value,
                DepoName      = message.DepoName,
                Error         = message.Error?.Message,
                ExpiryDate    = message.ExpiryDate?.To <long>(),
                PortfolioName = message.PortfolioName,
                IsMarketMaker = message.IsMarketMaker == null ? (byte?)null : (byte)(message.IsMarketMaker.Value ? 1 : 0),
                IsMargin      = message.IsMargin == null ? (byte?)null : (byte)(message.IsMargin.Value ? 1 : 0),
                Side          = (byte)message.Side,
                OrderId       = message.OrderId,
                OrderStringId = message.OrderStringId,
                OrderBoardId  = message.OrderBoardId,
                OrderPrice    = message.OrderPrice,
                OrderVolume   = message.OrderVolume,
                VisibleVolume = message.VisibleVolume,
                OrderType     = message.OrderType == null ? (byte?)null : (byte)message.OrderType.Value,
                OrderState    = message.OrderState == null ? (byte?)null : (byte)message.OrderState.Value,
                OrderStatus   = message.OrderStatus,
                Balance       = message.Balance,
                UserOrderId   = message.UserOrderId,
                OriginSide    = message.OriginSide == null ? (byte?)null : (byte)message.OriginSide.Value,
                Latency       = message.Latency?.Ticks,
                PnL           = message.PnL,
                Position      = message.Position,
                Slippage      = message.Slippage,
                Commission    = message.Commission,
                TradePrice    = message.TradePrice,
                TradeVolume   = message.TradeVolume,
                TradeStatus   = message.TradeStatus,
                TradeId       = message.TradeId,
                TradeStringId = message.TradeStringId,
                OpenInterest  = message.OpenInterest,
                IsSystem      = message.IsSystem == null ? (byte?)null : (byte)(message.IsSystem.Value ? 1 : 0),
                OrderTif      = message.TimeInForce == null ? (byte?)null : (byte)message.TimeInForce.Value,
                ConditionType = message.Condition?.GetType().GetTypeName(false),
            };

            var conParams = message.Condition?.Parameters.Where(p => p.Value != null).ToArray() ?? ArrayHelper.Empty <KeyValuePair <string, object> >();

            snapshot.ConditionParamsCount = conParams.Length;

            var paramSize    = typeof(TransactionConditionParam).SizeOf();
            var snapshotSize = typeof(TransactionSnapshot).SizeOf();

            var buffer = new byte[snapshotSize + snapshot.ConditionParamsCount * paramSize];

            var ptr = snapshot.StructToPtr();

            Marshal.Copy(ptr, buffer, 0, snapshotSize);
            Marshal.FreeHGlobal(ptr);

            var offset = snapshotSize;

            foreach (var conParam in conParams)
            {
                var param = new TransactionConditionParam
                {
                    Name      = conParam.Key,
                    ValueType = conParam.Value.GetType().GetTypeAsString(false),
                };

                switch (conParam.Value)
                {
                case byte b:
                    param.NumValue = b;
                    break;

                case sbyte sb:
                    param.NumValue = sb;
                    break;

                case int i:
                    param.NumValue = i;
                    break;

                case short s:
                    param.NumValue = s;
                    break;

                case long l:
                    param.NumValue = l;
                    break;

                case uint ui:
                    param.NumValue = ui;
                    break;

                case ushort us:
                    param.NumValue = us;
                    break;

                case ulong ul:
                    param.NumValue = (long)ul;
                    break;

                case DateTimeOffset dto:
                    param.NumValue = dto.To <long>();
                    break;

                case DateTime dt:
                    param.NumValue = dt.To <long>();
                    break;

                case TimeSpan ts:
                    param.NumValue = ts.To <long>();
                    break;

                case float f:
                    param.DecimalValue = (decimal)f;
                    break;

                case double d:
                    param.DecimalValue = (decimal)d;
                    break;

                case decimal dec:
                    param.DecimalValue = dec;
                    break;

                case bool bln:
                    param.BoolValue = bln;
                    break;

                case Enum e:
                    param.NumValue = e.To <long>();
                    break;

                default:
                    param.StringValue = conParam.Value.To <string>();
                    break;
                }

                var rowPtr = param.StructToPtr();
                Marshal.Copy(rowPtr, buffer, offset, paramSize);
                Marshal.FreeHGlobal(rowPtr);

                offset += paramSize;
            }

            return(buffer);
        }
示例#7
0
        byte[] ISnapshotSerializer <long, ExecutionMessage> .Serialize(Version version, ExecutionMessage message)
        {
            if (version == null)
            {
                throw new ArgumentNullException(nameof(version));
            }

            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (message.ExecutionType != ExecutionTypes.Transaction)
            {
                throw new ArgumentOutOfRangeException(nameof(message), message.ExecutionType, LocalizedStrings.Str1695Params.Put(message));
            }

            var snapshot = new TransactionSnapshot
            {
                SecurityId           = message.SecurityId.ToStringId(),
                Portfolio            = message.PortfolioName,
                LastChangeServerTime = message.ServerTime.To <long>(),
                LastChangeLocalTime  = message.LocalTime.To <long>(),

                OriginalTransactionId = message.OriginalTransactionId,
                TransactionId         = message.TransactionId,

                BrokerCode    = message.BrokerCode,
                ClientCode    = message.ClientCode,
                Comment       = message.Comment,
                SystemComment = message.SystemComment,
                Currency      = message.Currency == null ? (short?)null : (short)message.Currency.Value,
                DepoName      = message.DepoName,
                Error         = message.Error?.Message,
                ExpiryDate    = message.ExpiryDate?.To <long>(),
                PortfolioName = message.PortfolioName,
                IsMarketMaker = message.IsMarketMaker == null ? (byte?)null : (byte)(message.IsMarketMaker.Value ? 1 : 0),
                IsMargin      = message.IsMargin == null ? (byte?)null : (byte)(message.IsMargin.Value ? 1 : 0),
                Side          = (byte)message.Side,
                OrderId       = message.OrderId,
                OrderStringId = message.OrderStringId,
                OrderBoardId  = message.OrderBoardId,
                OrderPrice    = message.OrderPrice,
                OrderVolume   = message.OrderVolume,
                VisibleVolume = message.VisibleVolume,
                OrderType     = message.OrderType == null ? (byte?)null : (byte)message.OrderType.Value,
                OrderState    = message.OrderState == null ? (byte?)null : (byte)message.OrderState.Value,
                OrderStatus   = message.OrderStatus,
                Balance       = message.Balance,
                UserOrderId   = message.UserOrderId,
                OriginSide    = message.OriginSide == null ? (byte?)null : (byte)message.OriginSide.Value,
                Latency       = message.Latency?.Ticks,
                PnL           = message.PnL,
                Position      = message.Position,
                Slippage      = message.Slippage,
                Commission    = message.Commission,
                TradePrice    = message.TradePrice,
                TradeVolume   = message.TradeVolume,
                TradeStatus   = message.TradeStatus,
                TradeId       = message.TradeId,
                TradeStringId = message.TradeStringId,
                OpenInterest  = message.OpenInterest,
                IsSystem      = message.IsSystem == null ? (byte?)null : (byte)(message.IsSystem.Value ? 1 : 0),
                OrderTif      = message.TimeInForce == null ? (byte?)null : (byte)message.TimeInForce.Value,
                ConditionType = message.Condition?.GetType().GetTypeName(false),
            };

            var conParams = message.Condition?.Parameters.Where(p => p.Value != null).ToArray() ?? ArrayHelper.Empty <KeyValuePair <string, object> >();

            snapshot.ConditionParamsCount = conParams.Length;

            var paramSize    = typeof(TransactionConditionParam).SizeOf();
            var snapshotSize = typeof(TransactionSnapshot).SizeOf();

            var buffer = new byte[snapshotSize + snapshot.ConditionParamsCount * paramSize];

            var ptr = snapshot.StructToPtr();

            Marshal.Copy(ptr, buffer, 0, snapshotSize);
            Marshal.FreeHGlobal(ptr);

            var offset = snapshotSize;

            foreach (var conParam in conParams)
            {
                var param = new TransactionConditionParam
                {
                    Name      = conParam.Key,
                    ValueType = conParam.Value.GetType().GetTypeAsString(false),
                    Value     = conParam.Value.To <string>(),
                };

                var rowPtr = param.StructToPtr();
                Marshal.Copy(rowPtr, buffer, offset, paramSize);
                Marshal.FreeHGlobal(rowPtr);

                offset += paramSize;
            }

            return(buffer);
        }