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)); }
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); }
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); }