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); }
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)); }
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); }
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); }
internal GenericResult SendRequest(TriggerContext context, IOrderCoreData coreData, IOrderEditableData editableData) { return(HandleCommand(OrderStateMachine.Trigger.SendRequest, context, editableData, null, coreData)); }
public GenericResult RejectPending(ITriggerContext context, IOrderEditableData editableData = null, IOrderDealingData dealingData = null) { return(HandlePendingReplyCommand(false, context, editableData, dealingData)); }
public GenericResult Update(ITriggerContext context, IOrderCoreData coreData, IOrderEditableData editableData) { return(HandleEditionCommand(OrderStateMachine.Trigger.Update, context, editableData, coreData)); }