internal static List <Command> ToCommand(this OrderChange orderChange) { List <Command> result = new List <Command>(); if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Placed || orderChange.ChangeType == Protocal.Commands.OrderChangeType.Placing) { PlaceCommand placeCommand = new PlaceCommand(); placeCommand.InstrumentID = orderChange.InstrumentId; placeCommand.AccountID = orderChange.AccountId; placeCommand.IsAutoFill = orderChange.Source.IsAutoFill; XElement placeNode = new XElement("Place"); placeNode.Add(((Transaction)orderChange.Source.Owner).ToXml()); placeCommand.Content = placeNode.ToXmlNode(); result.Add(placeCommand); Logger.InfoFormat("create place command {0}", placeCommand.Content.OuterXml); } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Canceled) { CancelCommand cancelCommand = new CancelCommand(); cancelCommand.InstrumentID = orderChange.InstrumentId; cancelCommand.AccountID = orderChange.AccountId; cancelCommand.TransactionID = orderChange.TranId; if (orderChange.Source.CancelReason != null) { cancelCommand.CancelReason = orderChange.Source.CancelReason.Value; Logger.InfoFormat("Create cancel command, accountId = {0}, tranId={1}, cancelReason = {2}", cancelCommand.AccountID, cancelCommand.TransactionID, cancelCommand.CancelReason); } cancelCommand.ErrorCode = TransactionError.OK; result.Add(cancelCommand); } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Deleted) { //DeleteCommand deleteCommand = new DeleteCommand(); //deleteCommand.AccountID = orderChange.Source.Owner.Owner.Id; //deleteCommand.InstrumentID = orderChange.Source.Owner.InstrumentId; //deleteCommand.Content = orderChange.CreateDeleteXml().ToXmlNode(); //result.Add(deleteCommand); //Logger.InfoFormat("delete command content1 = {0}", deleteCommand.Content.OuterXml); DeleteCommand deleteCommand2 = new DeleteCommand(); deleteCommand2.AccountID = orderChange.Source.Owner.Owner.Id; deleteCommand2.InstrumentID = orderChange.Source.Owner.InstrumentId; var root = orderChange.CreateDeleteXmlForTrader(); XElement affectedOrderNode = new XElement("AffectedOrders"); foreach (var eachTran in orderChange.AffectedTrans) { affectedOrderNode.Add(eachTran.ToXml()); } root.Add(affectedOrderNode); deleteCommand2.Content = root.ToXmlNode(); result.Add(deleteCommand2); Logger.InfoFormat("delete command content2 = {0}", deleteCommand2.Content.OuterXml); //此处实现有问题,新系统如何通知删单时受影响的单,现在还不清楚 } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Executed) { ExecuteCommand executeCommand = new ExecuteCommand(); executeCommand.AccountID = orderChange.AccountId; executeCommand.InstrumentID = orderChange.InstrumentId; executeCommand.TranID = orderChange.TranId; executeCommand.Content = orderChange.CreateExecuteXml().ToXmlNode(); result.Add(executeCommand); Logger.InfoFormat("create execute command {0}", executeCommand.Content.OuterXml); } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Cut) { result.Add(orderChange.CreateOrderCutCommand()); } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Changed) { result.Add(orderChange.CreateOrderChangedCommand()); } else if (orderChange.ChangeType == Protocal.Commands.OrderChangeType.Hit) { result.Add(orderChange.CreateHitCommand()); } else { throw new NotSupportedException(string.Format("Change Type {0} is not supported yet", orderChange.ChangeType)); } return(result); }