コード例 #1
0
        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);
        }