Beispiel #1
0
        private GenericResult HandleCommand(
            OrderStateMachine.Trigger trigger,
            ITriggerContext context,
            IOrderEditableData editableData = null,
            IOrderDealingData dealingData   = null,
            IOrderCoreData coreData         = null,
            TriggerStatus status            = TriggerStatus.Done)
        {
            Contract.Requires(context != null, "context != null");

            _workingData = CurrentData.Clone()
                           .SetRoutingData(dealingData)
                           .SetEditableData(editableData)
                           .SetTrigger(trigger)
                           .SetPendingTrigger(status.IsPendingReply() && this.PendingTrigger == trigger ? null : this.PendingTrigger);
            var result = EnforceTriggerStatus(trigger, ref status);

            if (result.IsFailure())
            {
                return(result);
            }
            if (status == TriggerStatus.Rejected)
            {
                result = GenericResult.Success();
            }
            else
            {
                var triggerSucceeded = status == TriggerStatus.Pending ? _stateMachine.CanFireTrigger(trigger) : _stateMachine.TryFireTrigger(trigger);
                result = triggerSucceeded ? GenericResult.Success() : GenericResult.Failure(string.Concat(_workingData.StateMachineErrorMessage, String.Format("The commmand {0} is not allowed when the order is in {1} state", trigger, OrderState)));
            }
            if (result.IsSuccess())
            {
                _workingData.SetOrderState(_stateMachine.GetState);
                if (editableData != null)
                {
                    if (coreData != null)
                    {
                        this.InsertDataFrom(coreData);
                    }
                    EventLogs.Add(new OrderParameterEventLog <IOrderEditableData>(context, trigger, status, _workingData.OrderState, this, editableData));
                }
                else if (dealingData != null)
                {
                    EventLogs.Add(new OrderParameterEventLog <IOrderDealingData>(context, trigger, status, _workingData.OrderState, this, dealingData));
                    if (dealingData.Trade != null)
                    {
                        _workingData.SetExecutionQuantity(ComputeExecutionQuantity(_workingData.Side));
                    }
                }
                else
                {
                    EventLogs.Add(new OrderEventLog(context, trigger, status, _workingData.OrderState, this));
                }
                _workingData.SetOrderStatus(ComputeOrderStatus(_workingData));
                RefreshCurrentData(_workingData);
            }
            _workingData = null;
            return(result);
        }
Beispiel #2
0
 private GenericResult HandlePendingReplyCommand(
     bool isAccept,
     ITriggerContext context,
     IOrderEditableData editableData = null,
     IOrderDealingData dealingData   = null,
     IOrderCoreData coreData         = null)
 {
     if (PendingTrigger == null)
     {
         return(GenericResult.FailureFormat("There is no pending command to {0}", isAccept ? "accept" : "reject"));
     }
     return(HandleCommand(PendingTrigger.Value, context, editableData, dealingData, coreData, isAccept ? TriggerStatus.Accepted : TriggerStatus.Rejected));
 }
Beispiel #3
0
        public GenericResult HandleEditionCommand(OrderStateMachine.Trigger trigger,
                                                  ITriggerContext context,
                                                  IOrderEditableData editableData = null,
                                                  IOrderCoreData coreData         = null,
                                                  TriggerStatus status            = TriggerStatus.Done)
        {
            var resultCore = OrderValidator.OrderCoreValidator.IsValid(coreData);

            if (resultCore.IsSuccess())
            {
                var resultEditable = OrderValidator.OrderEditableValidator.IsValid(editableData);
                return(resultEditable.IsSuccess() ? HandleCommand(trigger, context, editableData, null, coreData, status) : resultEditable);
            }
            return(resultCore);
        }
Beispiel #4
0
 public OrderData SetEditableData(IOrderEditableData editableData)
 {
     if (editableData != null)
     {
         Quantity       = editableData.Quantity;
         PriceLimit     = editableData.PriceLimit;
         Side           = editableData.Side;
         Security       = editableData.Security;
         OrderType      = editableData.OrderType;
         OrderValidity  = editableData.OrderValidity;
         ExpiryDate     = editableData.ExpiryDate;
         Fund           = editableData.Fund;
         PriceStop      = editableData.PriceStop;
         SettlementDate = editableData.SettlementDate;
     }
     return(this);
 }
Beispiel #5
0
 internal GenericResult SendRequest(TriggerContext context, IOrderCoreData coreData, IOrderEditableData editableData)
 {
     return(HandleCommand(OrderStateMachine.Trigger.SendRequest, context, editableData, null, coreData));
 }
Beispiel #6
0
 public GenericResult RejectPending(ITriggerContext context, IOrderEditableData editableData = null, IOrderDealingData dealingData = null)
 {
     return(HandlePendingReplyCommand(false, context, editableData, dealingData));
 }
Beispiel #7
0
 public GenericResult Update(ITriggerContext context, IOrderCoreData coreData, IOrderEditableData editableData)
 {
     return(HandleEditionCommand(OrderStateMachine.Trigger.Update, context, editableData, coreData));
 }