Пример #1
0
        /// <inheritdoc />
        public Event Deserialize(byte[] dataBytes)
        {
            var unpacked = MessagePackSerializer.Deserialize <Dictionary <string, byte[]> >(dataBytes);

            var @event    = ObjectDeserializer.AsString(unpacked[nameof(Event.Type)]);
            var id        = ObjectDeserializer.AsGuid(unpacked[nameof(Event.Id)]);
            var timestamp = ObjectDeserializer.AsZonedDateTime(unpacked[nameof(Event.Timestamp)]);

            switch (@event)
            {
            case nameof(AccountStateEvent):
                var currency = ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(AccountStateEvent.Currency)]);
                return(new AccountStateEvent(
                           this.identifierCache.AccountId(unpacked),
                           currency,
                           ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashBalance)], currency),
                           ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashStartDay)], currency),
                           ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.CashActivityDay)], currency),
                           ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.MarginUsedLiquidation)], currency),
                           ObjectDeserializer.AsMoney(unpacked[nameof(AccountStateEvent.MarginUsedMaintenance)], currency),
                           ObjectDeserializer.AsDecimal(unpacked[nameof(AccountStateEvent.MarginRatio)]),
                           ObjectDeserializer.AsString(unpacked[nameof(AccountStateEvent.MarginCallStatus)]),
                           id,
                           timestamp));

            case nameof(OrderInitialized):
                return(new OrderInitialized(
                           ObjectDeserializer.AsOrderId(unpacked),
                           this.identifierCache.Symbol(unpacked),
                           ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderInitialized.OrderSide)]),
                           ObjectDeserializer.AsEnum <OrderType>(unpacked[nameof(OrderInitialized.OrderType)]),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderInitialized.Quantity)]),
                           ObjectDeserializer.AsNullablePrice(unpacked[nameof(OrderInitialized.Price)]),
                           ObjectDeserializer.AsEnum <TimeInForce>(unpacked[nameof(OrderInitialized.TimeInForce)]),
                           ObjectDeserializer.AsNullableZonedDateTime(unpacked[nameof(OrderInitialized.ExpireTime)]),
                           id,
                           timestamp));

            case nameof(OrderInvalid):
                return(new OrderInvalid(
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsString(unpacked[nameof(OrderInvalid.InvalidReason)]),
                           id,
                           timestamp));

            case nameof(OrderDenied):
                return(new OrderDenied(
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsString(unpacked[nameof(OrderDenied.DeniedReason)]),
                           id,
                           timestamp));

            case nameof(OrderSubmitted):
                return(new OrderSubmitted(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderSubmitted.SubmittedTime)]),
                           id,
                           timestamp));

            case nameof(OrderAccepted):
                return(new OrderAccepted(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsOrderIdBroker(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderAccepted.AcceptedTime)]),
                           id,
                           timestamp));

            case nameof(OrderRejected):
                return(new OrderRejected(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderRejected.RejectedTime)]),
                           ObjectDeserializer.AsString(unpacked[nameof(OrderRejected.RejectedReason)]),
                           id,
                           timestamp));

            case nameof(OrderWorking):
                return(new OrderWorking(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsOrderIdBroker(unpacked),
                           this.identifierCache.Symbol(unpacked),
                           ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderWorking.OrderSide)]),
                           ObjectDeserializer.AsEnum <OrderType>(unpacked[nameof(OrderWorking.OrderType)]),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderWorking.Quantity)]),
                           ObjectDeserializer.AsPrice(unpacked[nameof(OrderWorking.Price)]),
                           ObjectDeserializer.AsEnum <TimeInForce>(unpacked[nameof(OrderWorking.TimeInForce)]),
                           ObjectDeserializer.AsNullableZonedDateTime(unpacked[nameof(OrderWorking.ExpireTime)]),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderWorking.WorkingTime)]),
                           id,
                           timestamp));

            case nameof(OrderCancelled):
                return(new OrderCancelled(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderCancelled.CancelledTime)]),
                           id,
                           timestamp));

            case nameof(OrderCancelReject):
                return(new OrderCancelReject(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderCancelReject.RejectedTime)]),
                           ObjectDeserializer.AsString(unpacked[nameof(OrderCancelReject.RejectedResponseTo)]),
                           ObjectDeserializer.AsString(unpacked[nameof(OrderCancelReject.RejectedReason)]),
                           id,
                           timestamp));

            case nameof(OrderModified):
                return(new OrderModified(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsOrderIdBroker(unpacked),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderModified.ModifiedQuantity)]),
                           ObjectDeserializer.AsPrice(unpacked[nameof(OrderModified.ModifiedPrice)]),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderModified.ModifiedTime)]),
                           id,
                           timestamp));

            case nameof(OrderExpired):
                return(new OrderExpired(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderExpired.ExpiredTime)]),
                           id,
                           timestamp));

            case nameof(OrderPartiallyFilled):
                return(new OrderPartiallyFilled(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsExecutionId(unpacked),
                           ObjectDeserializer.AsPositionIdBroker(unpacked),
                           this.identifierCache.Symbol(unpacked),
                           ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderPartiallyFilled.OrderSide)]),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderPartiallyFilled.FilledQuantity)]),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderPartiallyFilled.LeavesQuantity)]),
                           ObjectDeserializer.AsPrice(unpacked[nameof(OrderPartiallyFilled.AveragePrice)]),
                           ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(OrderPartiallyFilled.Currency)]),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderPartiallyFilled.ExecutionTime)]),
                           id,
                           timestamp));

            case nameof(OrderFilled):
                return(new OrderFilled(
                           this.identifierCache.AccountId(unpacked),
                           ObjectDeserializer.AsOrderId(unpacked),
                           ObjectDeserializer.AsExecutionId(unpacked),
                           ObjectDeserializer.AsPositionIdBroker(unpacked),
                           this.identifierCache.Symbol(unpacked),
                           ObjectDeserializer.AsEnum <OrderSide>(unpacked[nameof(OrderFilled.OrderSide)]),
                           ObjectDeserializer.AsQuantity(unpacked[nameof(OrderFilled.FilledQuantity)]),
                           ObjectDeserializer.AsPrice(unpacked[nameof(OrderFilled.AveragePrice)]),
                           ObjectDeserializer.AsEnum <Currency>(unpacked[nameof(OrderFilled.Currency)]),
                           ObjectDeserializer.AsZonedDateTime(unpacked[nameof(OrderFilled.ExecutionTime)]),
                           id,
                           timestamp));

            default:
                throw ExceptionFactory.InvalidSwitchArgument(@event, nameof(@event));
            }
        }