コード例 #1
0
        protected override void HandleUnexpectedLogout(MessageFIXT1_1 message)
        {
            bool handled   = false;
            var  message42 = (MessageFIX4_2)message;

            if (message42.Text != null)
            {
                // If our sequences numbers don't match, Lime sends a logout with a message
                // telling us what we should be at.  So if we can, we just use that when we reconnect.
                if (message42.Text.StartsWith("MsgSeqNum too low"))
                {
                    var match             = Regex.Match(message42.Text, "expecting (\\d+)");
                    int newSequenceNumber = 0;
                    if (match.Success && int.TryParse(match.Groups[1].Value, out newSequenceNumber) && newSequenceNumber >= OrderStore.LocalSequence)
                    {
                        log.Error(message42.Text);
                        OrderStore.SetSequences(OrderStore.RemoteSequence, newSequenceNumber);
                        Socket.Dispose();
                        handled          = true;
                        RetryStart       = 2;
                        ignoreRetryDelay = true;
                    }
                }
                else
                {
                    base.HandleUnexpectedLogout(message);
                    throw new LimeException(string.Format("Lime logged out with error '{0}'", message42.Text));
                }
            }
            if (!handled)
            {
                base.HandleUnexpectedLogout(message);
            }
        }
コード例 #2
0
        protected override void TryEndRecovery()
        {
            if (debug)
            {
                log.Debug("TryEndRecovery Status " + ConnectionStatus +
                          ", Session Status Online " + isOrderServerOnline +
                          ", Resend Complete " + IsResendComplete);
            }
            switch (ConnectionStatus)
            {
            case Status.Recovered:
            case Status.PendingLogOut:
            case Status.PendingLogin:
            case Status.PendingServerResend:
            case Status.Disconnected:
                return;

            case Status.PendingRecovery:
                if (IsResendComplete && isOrderServerOnline)
                {
                    OrderStore.RequestSnapshot();
                    EndRecovery();
                    //RequestPositions();
                    //RequestSessionUpdate();
                    StartPositionSync();
                    return;
                }
                break;

            default:
                throw new ApplicationException("Unexpected connection status for TryEndRecovery: " + ConnectionStatus);
            }
        }
コード例 #3
0
 public override void OnDisconnect()
 {
     HeartbeatDelay = int.MaxValue;
     if (ConnectionStatus == Status.PendingLogOut)
     {
         if (debug)
         {
             log.Debug("Sending RemoteShutdown confirmation back to provider manager.");
         }
     }
     else
     {
         OrderStore.ForceSnapshot();
         var message = "LimeFIXProvider disconnected.";
         if (SyncTicks.Enabled)
         {
             log.Notice(message);
         }
         else
         {
             log.Error(message);
         }
         log.Info("Logging out -- Sending EndBroker event.");
         TrySendEndBroker();
     }
 }
コード例 #4
0
        protected override async Task ExecuteLoadItemsCommand()
        {
            try
            {
                IsBusy = true;
                Items.Clear();

                string userId = DependencyService.Get <IConnectorProvider>()?.GetToken()?.UserId;

                var items = await OrderStore.GetItemsAsync();

                foreach (var item in items)
                {
                    bool isNotCurrentUserOrder = item.AuthorId.ToString() != userId;
                    if (isNotCurrentUserOrder)
                    {
                        Items.Add(item);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }
コード例 #5
0
        public void SendFill(MessageFIX4_2 packetFIX)
        {
            var clientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out clientOrderId);
            var originalClientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId);
            if (debug)
            {
                log.Debug("SendFill( " + packetFIX.ClientOrderId + ")");
            }
            var             symbolInfo = Factory.Symbol.LookupSymbol(packetFIX.Symbol);
            var             timeZone   = new SymbolTimeZone(symbolInfo);
            SymbolAlgorithm algorithm;

            if (!TryGetAlgorithm(symbolInfo.BinaryIdentifier, out algorithm))
            {
                log.Info("Fill received but OrderAlgorithm not found for " + symbolInfo + ". Ignoring.");
                return;
            }
            var fillPosition = packetFIX.LastQuantity * SideToSign(packetFIX.Side);

            if (GetSymbolStatus(symbolInfo))
            {
                CreateOrChangeOrder order;
                if (OrderStore.TryGetOrderById(clientOrderId, out order))
                {
                    TimeStamp executionTime;
                    if (UseLocalFillTime)
                    {
                        executionTime = TimeStamp.UtcNow;
                    }
                    else
                    {
                        executionTime = new TimeStamp(packetFIX.TransactionTime);
                    }
                    var configTime = executionTime;
                    configTime.AddSeconds(timeZone.UtcOffset(executionTime));
                    var fill = Factory.Utility.PhysicalFill(fillPosition, packetFIX.LastPrice, configTime, executionTime, order.BrokerOrder, false, packetFIX.OrderQuantity, packetFIX.CumulativeQuantity, packetFIX.LeavesQuantity, IsRecovered, true);
                    if (debug)
                    {
                        log.Debug("Sending physical fill: " + fill);
                    }
                    algorithm.OrderAlgorithm.ProcessFill(fill);
                    algorithm.OrderAlgorithm.ProcessOrders();
                    TrySendStartBroker(symbolInfo, "position sync on fill");
                }
                else
                {
                    algorithm.OrderAlgorithm.IncreaseActualPosition(fillPosition);
                    log.Notice("Fill id " + packetFIX.ClientOrderId + " not found. Must have been a manual trade.");
                    if (SyncTicks.Enabled)
                    {
                        var tickSync = SyncTicks.GetTickSync(symbolInfo.BinaryIdentifier);
                        tickSync.RemovePhysicalFill(packetFIX.ClientOrderId);
                    }
                }
            }
        }
コード例 #6
0
 private void cmbOrders_SelectedIndexChanged(object sender, EventArgs e)
 {
     foreach (var item in OrderStore.GetUnCompletedOrders())
     {
         if (item.OrderId.ToString() == cmbOrders.Text)
         {
             orderSelected = item;
         }
     }
 }
コード例 #7
0
ファイル: Prog.cs プロジェクト: OmaraliA/.NET-
        public List <Order> ReadOrder()
        {
            var orderStore = new OrderStore()
            {
                Path = ordersPath
            };
            var orderList = orderStore.GetCollection();

            return(orderList);
        }
コード例 #8
0
 public IActionResult GetOrder(int orderId) //получение информации о заказе
 {
     if (_repository.Orders.IsOrderExists(orderId))
     {
         OrderStore  orderFromStore = _repository.Orders.GetOrder(orderId);
         OrderReturn orderToReturn  = _mapper.Map <OrderReturn>(orderFromStore);
         return(Ok(orderToReturn));
     }
     return(NotFound());
 }
コード例 #9
0
        public override bool OnLogin()
        {
            if (debug)
            {
                log.Debug("LimeFIXProvider.Login()");
            }

            if (OrderStore.Recover())
            {
                // Reset the order algorithms
                lock (orderAlgorithmsLocker)
                {
                    var symbolIds = new List <long>();
                    foreach (var kvp in orderAlgorithms)
                    {
                        symbolIds.Add(kvp.Key);
                    }
                    orderAlgorithms.Clear();
                    foreach (var symbolId in symbolIds)
                    {
                        CreateAlgorithm(symbolId);
                    }
                }
                if (debug)
                {
                    log.Debug("Recovered from snapshot Local Sequence " + OrderStore.LocalSequence + ", Remote Sequence " + OrderStore.RemoteSequence);
                }
                if (debug)
                {
                    log.Debug("Recovered orders from snapshot: \n" + OrderStore.OrdersToString());
                }
                if (debug)
                {
                    log.Debug("Recovered symbol positions from snapshot:\n" + OrderStore.SymbolPositionsToString());
                }
                if (debug)
                {
                    log.Debug("Recovered strategy positions from snapshot:\n" + OrderStore.StrategyPositionsToString());
                }
                RemoteSequence = OrderStore.RemoteSequence;
                SendLogin(OrderStore.LocalSequence);
                OrderStore.RequestSnapshot();
            }
            else
            {
                if (debug)
                {
                    log.Debug("Unable to recover from snapshot. Beginning full recovery.");
                }
                OrderStore.SetSequences(0, 0);
                OrderStore.ForceSnapshot();
                SendLogin(OrderStore.LocalSequence);
            }
            return(true);
        }
コード例 #10
0
        public void ShowOrdersDropDown()
        {
            cmbOrders.Items.Clear();
            string b = "";

            foreach (var item in OrderStore.GetUnCompletedOrders())
            {
                b = item.OrderId.ToString();
                cmbOrders.Items.Add(b);
            }
        }
コード例 #11
0
 public IActionResult UpdateOrderPut(OrderUpdate orderUpdate) //полное обновление заказа
 {
     if (_repository.Orders.IsOrderExists(orderUpdate.Number))
     {
         OrderStore orderFromStore = _repository.Orders.GetOrder(orderUpdate.Number);
         _mapper.Map(orderUpdate, orderFromStore);
         _repository.Orders.UpdateOrder(orderFromStore);
         return(NoContent());
     }
     return(NotFound());
 }
コード例 #12
0
        public void LoadOrders()
        {
            mainScrollView.Controls.Clear();
            OrderContainer obj;             //347 hieght
            int            x = 5;
            int            y = 1;

            foreach (var item in OrderStore.GetUnCompletedOrders())
            {
                obj          = new OrderContainer(item);
                obj.Location = new Point(x, y);
                x           += 349;
                mainScrollView.Controls.Add(obj);
            }
        }
コード例 #13
0
        //TODO: Could be moved to common class
        private string GetOpenOrders()
        {
            var sb   = new StringBuilder();
            var list = OrderStore.GetOrders((x) => true);

            foreach (var order in list)
            {
                sb.Append("    ");
                sb.Append(order.BrokerOrder);
                sb.Append(" ");
                sb.Append(order);
                sb.AppendLine();
            }
            return(sb.ToString());
        }
コード例 #14
0
 private void btnKrijo_Click(object sender, EventArgs e)
 {
     if (cmbTables.Text.Length >= 1)
     {
         try
         {
             OrderStore.CreateNewOrder(new Order(tableSelected, DateTime.Now, TempEmployee.currentEmployee));
             ShowOrdersDropDown();
             LoadOrders();
         }
         catch (Exception)
         {
             MessageBox.Show("Nje gabim ndodhi");
         }
     }
 }
コード例 #15
0
ファイル: OrderList.cs プロジェクト: pxmarc/dp2
        // return:
        //      true    主要字段相同,需要合并
        //      false   不需要合并
        public static bool Compare(OrderStore order1, OrderStore order2)
        {
            Hashtable value_table1 = GetValues(order1);
            Hashtable value_table2 = GetValues(order2);

            if ((string)value_table1["seller"] != (string)value_table2["seller"])
            {
                return(false);
            }

            if ((string)value_table1["price"] != (string)value_table2["price"])
            {
                return(false);
            }

            if ((string)value_table1["acceptPrice"] != (string)value_table2["acceptPrice"])
            {
                return(false);
            }

            if ((string)value_table1["catalogNo"] != (string)value_table2["catalogNo"])
            {
                return(false);
            }

            if ((string)value_table1["issueCount"] != (string)value_table2["issueCount"])
            {
                return(false);
            }

            if ((string)value_table1["range"] != (string)value_table2["range"])
            {
                return(false);
            }

            if ((int)value_table1["subcopy"] != (int)value_table2["subcopy"])
            {
                return(false);
            }

            if (CompareAddress((string)value_table1["sellerAddress"], (string)value_table1["sellerAddress"]) != 0)
            {
                return(false);
            }

            return(true);
        }
コード例 #16
0
 public IActionResult CreateOrder(OrderCreate orderToCreate) //создание заказа
 {
     if (ModelState.IsValid)
     {
         if (!_repository.Orders.IsOrderExists(orderToCreate.Number))
         {
             if (_repository.Postamats.IsPostamatExists(orderToCreate.PostamatNumber) &&
                 _repository.Postamats.IsPostamatActive(orderToCreate.PostamatNumber))
             {
                 OrderStore orderToStore = _mapper.Map <OrderStore>(orderToCreate);
                 _repository.Orders.CreateOrder(orderToStore);
                 return(NoContent());
             }
             return(StatusCode(403));
         }
     }
     return(BadRequest());
 }
コード例 #17
0
        public IActionResult Test()
        {
            var orderStore = new OrderStore()
            {
                Path = orderPath
            };
            var orderList = orderStore.GetCollection();
            var val       = orderList.Sum(x => x.Amount * x.Price);
            var orderCopy = orderList.GroupBy(x => x.Id).Select(y => new Order
            {
                Id     = y.First().Id,
                Name   = y.First().Name,
                Price  = y.First().Price,
                Amount = y.Key
            });

            ViewData["TotalAmount"] = val;
            return(View(orderList));
        }
コード例 #18
0
        public IActionResult UpdateOrderPatch(int orderId, JsonPatchDocument <OrderUpdate> patcher) //частичное обновление заказа
        {
            if (_repository.Orders.IsOrderExists(orderId))
            {
                OrderStore  orderFromStore = _repository.Orders.GetOrder(orderId);
                OrderUpdate orderToPatch   = _mapper.Map <OrderUpdate>(orderFromStore);
                patcher.ApplyTo(orderToPatch, ModelState);

                if (!TryValidateModel(orderToPatch))
                {
                    return(ValidationProblem(ModelState));
                }

                _mapper.Map(orderToPatch, orderFromStore);
                return(NoContent());
            }

            return(NotFound());
        }
コード例 #19
0
ファイル: Startup.cs プロジェクト: will14smith/PactTest
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var store = new OrderStore();

            store.Add(new Order {
                Person = "Will", Item = "Hat"
            });
            store.Add(new Order {
                Person = "Will", Item = "Laptop"
            });
            store.Add(new Order {
                Person = "Bob", Item = "Bus"
            });
            store.Add(new Order {
                Person = "Jane", Item = "Spade"
            });

            services.AddControllers();
            services.AddSingleton(store);
        }
コード例 #20
0
ファイル: OrderList.cs プロジェクト: pxmarc/dp2
        // 根据 BiblioStore 对象拆分出 OrderListItem 对象数组
        public static List <OrderListItem> SplitOrderListItems(BiblioStore biblio)
        {
            List <OrderListItem> results = new List <OrderListItem>();

            List <OrderStore> orders = new List <OrderStore>();

            // orders.AddRange(biblio.Orders);
            foreach (OrderStore order in biblio.Orders)
            {
                if (order.Type == "deleted")
                {
                    continue;
                }
                if (string.IsNullOrEmpty(order.GetFieldValue("state")))
                {
                    orders.Add(order);
                }
            }

            while (orders.Count > 0)
            {
                OrderListItem item  = new OrderListItem();
                OrderStore    start = orders[0];
                item.Merge(start);
                orders.RemoveAt(0);
                for (int i = 0; i < orders.Count; i++)
                {
                    OrderStore order = orders[i];
                    if (Compare(start, order) == true)
                    {
                        item.Merge(order);
                        orders.RemoveAt(i);
                        i--;
                    }
                }

                results.Add(item);
            }

            return(results);
        }
コード例 #21
0
        public IActionResult Answer(int ProductID, int ID)
        {
            int ProduxtAmount = int.Parse(Request.Form["Amount"].ToString());

            var productStore = new ProductStore()
            {
                Path = productPath
            };
            var orderStore = new OrderStore()
            {
                Path = orderPath
            };

            var productList = productStore.GetCollection();
            var orderList   = orderStore.GetCollection();

            ViewData["ID"]        = ID;
            ViewData["ProductID"] = ProductID;
            if (productList.Where(x => x.Id == ProductID).First().Amount < ProduxtAmount)
            {
                ViewData["Answer"] = "Error. We don't have so many items";
            }
            else
            {
                var c = productList.Where(x => x.Id == ProductID).First();


                int val = orderList.Where(x => x.Id == ProductID).Sum(x => x.Amount);
                if (val + ProduxtAmount > c.Amount)
                {
                    ViewData["Answer"] = "Error. We don't have so many items";
                }
                else
                {
                    orderStore.WriteData(c.Id, c.Name, c.Price, ProduxtAmount);
                    ViewData["Answer"] = "Ok. Your request is in process";
                }
            }
            return(View());
        }
コード例 #22
0
        protected override async Task ExecuteLoadItemsCommand()
        {
            IsBusy = true;

            try
            {
                Items.Clear();
                var items = await OrderStore.GetCurrentUserItemsAsync();

                foreach (var item in items)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }
コード例 #23
0
        private void SendCancelOrder(CreateOrChangeOrder order, bool resend)
        {
            var fixMsg = (FIXMessage4_2)(resend ? FixFactory.Create(order.Sequence) : FixFactory.Create());

            order.Sequence = fixMsg.Sequence;
            OrderStore.SetOrder(order);
            var newClientOrderId = order.BrokerOrder;

            fixMsg.SetOriginalClientOrderId(order.OriginalOrder.BrokerOrder.ToString());
            fixMsg.SetClientOrderId(newClientOrderId.ToString());
#if NOT_LIME
            fixMsg.SetAccount(AccountNumber);
            fixMsg.SetSide(GetOrderSide(order.OriginalOrder.Side));
            fixMsg.SetSymbol(order.Symbol.Symbol);
            fixMsg.SetTransactTime(TimeStamp.UtcNow);
#endif
            fixMsg.AddHeader("F");
            if (resend)
            {
                fixMsg.SetDuplicate(true);
            }
            SendMessage(fixMsg);
        }
コード例 #24
0
        public ProviderStateMiddleware(RequestDelegate next, OrderStore store)
        {
            _next           = next;
            _providerStates = new Dictionary <string, Action>
            {
                {
                    "There are 2 orders in the store",
                    () =>
                    {
                        foreach (var order in store.GetAll())
                        {
                            store.Delete(order.Id);
                        }

                        store.Add(new Order {
                            Person = "person1", Item = "item1", Delivered = true
                        });
                        store.Add(new Order {
                            Person = "person2", Item = "item2", Delivered = false
                        });
                    }
                }
            };
        }
コード例 #25
0
        public bool OnCancelBrokerOrder(CreateOrChangeOrder order)
        {
            if (!IsRecovered)
            {
                return(false);
            }
            if (debug)
            {
                log.Debug("OnCancelBrokerOrder " + order + ". Connection " + ConnectionStatus + ", IsOrderServerOnline " + isOrderServerOnline);
            }
            OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
            CreateOrChangeOrder createOrChangeOrder;

            try {
                createOrChangeOrder = OrderStore.GetOrderById(order.OriginalOrder.BrokerOrder);
            } catch (ApplicationException ex) {
                if (LogRecovery || !IsRecovery)
                {
                    log.Info("Order probably already canceled. " + ex.Message);
                }
                if (SyncTicks.Enabled)
                {
                    var tickSync = SyncTicks.GetTickSync(order.Symbol.BinaryIdentifier);
                    tickSync.RemovePhysicalOrder();
                }
                return(true);
            }
            createOrChangeOrder.ReplacedBy = order;
            if (!object.ReferenceEquals(order.OriginalOrder, createOrChangeOrder))
            {
                throw new ApplicationException("Different objects!");
            }

            SendCancelOrder(order, false);
            return(true);
        }
コード例 #26
0
 /// <summary>
 /// Initializes a new instance of the <see cref="OrderStoreTests"/> class.
 /// </summary>
 public OrderStoreTests()
 {
     this._sut = new OrderStore();
 }
コード例 #27
0
 public OrderController(OrderStore store)
 {
     _store = store;
 }
コード例 #28
0
 public OrderControllerTests()
 {
     _store = new OrderStore();
     _sut   = new OrderController(_store);
 }
コード例 #29
0
        private void CancelRejected(MessageFIX4_2 packetFIX)
        {
            var clientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out clientOrderId);
            var originalClientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId);
            if (debug && (LogRecovery || !IsRecovery))
            {
                log.Debug("CancelRejected: " + packetFIX);
            }
            string orderStatus = packetFIX.OrderStatus;

            switch (orderStatus)
            {
            case "2":      //Filled
                var rejectReason = false;

                if (packetFIX.Text.Contains("Unknown order") || packetFIX.Text.Contains("Order is completed"))
                {
                    rejectReason = true;
                    log.Warn("RemoveOriginal=FALSE for: " + packetFIX.Text);
                    //removeOriginal = true;
                }
                else
                {
                    log.Error("Unknown text meesage in CancelReject: " + packetFIX.Text);
                }


                CreateOrChangeOrder order;
                if (OrderStore.TryGetOrderById(clientOrderId, out order))
                {
                    var             symbol = order.Symbol;
                    SymbolAlgorithm algorithm;
                    if (!TryGetAlgorithm(symbol.BinaryIdentifier, out algorithm))
                    {
                        log.Info("Cancel rejected but OrderAlgorithm not found for " + symbol + ". Ignoring.");
                        break;
                    }
                    var retryImmediately = true;
                    algorithm.OrderAlgorithm.RejectOrder(clientOrderId, IsRecovered, retryImmediately);
                }
                else
                {
                    if (debug)
                    {
                        log.Debug("Order not found for " + clientOrderId + ". Probably allready filled or canceled.");
                    }
                }

                if (!rejectReason && IsRecovered)
                {
                    var message  = "Order Rejected: " + packetFIX.Text + "\n" + packetFIX;
                    var stopping = "The cancel reject error message '" + packetFIX.Text + "' was unrecognized. ";
                    log.Warn(message);
                    log.Error(stopping);
                }
                else
                {
                    if (LogRecovery || !IsRecovery)
                    {
                        log.Info("CancelReject(" + packetFIX.Text + ") Removed cancel order: " + packetFIX.ClientOrderId);
                    }
                }
                break;

            default:
                throw new ApplicationException("Unknown cancel rejected order status: '" + orderStatus + "'");
            }
        }
コード例 #30
0
        private void ExecutionReport(MessageFIX4_2 packetFIX)
        {
            var clientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out clientOrderId);
            var originalClientOrderId = 0L;

            long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId);
            if (packetFIX.Text == "END")
            {
                throw new ApplicationException("Unexpected END in FIX Text field. Never sent a 35=AF message.");
            }
            SymbolAlgorithm algorithm  = null;
            SymbolInfo      symbolInfo = packetFIX.Symbol != null?Factory.Symbol.LookupSymbol(packetFIX.Symbol) : null;

            if (symbolInfo != null)
            {
                TryGetAlgorithm(symbolInfo.BinaryIdentifier, out algorithm);
            }

            string orderStatus = packetFIX.OrderStatus;

            switch (orderStatus)
            {
            case "0":     // New
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport New: " + packetFIX);
                }
                if (algorithm == null)
                {
                    log.Info("New order but OrderAlgorithm not found for " + symbolInfo + ". Ignoring.");
                    break;
                }
                CreateOrChangeOrder order = null;
                OrderStore.TryGetOrderById(clientOrderId, out order);
                if (order != null && symbolInfo.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder)     // Stop Order
                {
                    if (order.Type == OrderType.BuyStop || order.Type == OrderType.SellStop)
                    {
                        if (debug)
                        {
                            log.Debug("New order message for Forex Stop: " + packetFIX);
                        }
                        break;
                    }
                }
                algorithm.OrderAlgorithm.ConfirmCreate(clientOrderId, IsRecovered);
                TrySendStartBroker(symbolInfo, "sync on confirm cancel");
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "1":     // Partial
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Partial: " + packetFIX);
                }
                //UpdateOrder(packetFIX, OrderState.Active, null);
                SendFill(packetFIX);
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "2":      // Filled
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Filled: " + packetFIX);
                }
                if (packetFIX.CumulativeQuantity < packetFIX.LastQuantity)
                {
                    log.Warn("Ignoring message due to CumQty " + packetFIX.CumulativeQuantity + " less than " + packetFIX.LastQuantity + ". This is a workaround for a MBT FIX server which sends an extra invalid fill message on occasion.");
                    break;
                }
                SendFill(packetFIX);
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "5":     // Replaced
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Replaced: " + packetFIX);
                }
                if (algorithm == null)
                {
                    log.Info("ConfirmChange but OrderAlgorithm not found for " + symbolInfo + ". Ignoring.");
                    break;
                }
                algorithm.OrderAlgorithm.ConfirmChange(clientOrderId, IsRecovered);
                TrySendStartBroker(symbolInfo, "sync on confirm change");
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "4":     // Canceled
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Canceled: " + packetFIX);
                }
                if (algorithm == null)
                {
                    log.Info("Order Canceled but OrderAlgorithm not found for " + symbolInfo + ". Ignoring.");
                    break;
                }
                if (clientOrderId != 0)
                {
                    algorithm.OrderAlgorithm.ConfirmCancel(clientOrderId, IsRecovered);
                    TrySendStartBroker(symbolInfo, "sync on confirm cancel");
                }
                else if (originalClientOrderId != 0)
                {
                    algorithm.OrderAlgorithm.ConfirmCancel(originalClientOrderId, IsRecovered);
                    TrySendStartBroker(symbolInfo, "sync on confirm cancel orig order");
                }
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "6":     // Pending Cancel
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Pending Cancel: " + packetFIX);
                }
                if (!string.IsNullOrEmpty(packetFIX.Text) && packetFIX.Text.Contains("multifunction order"))
                {
                    if (debug && (LogRecovery || IsRecovered))
                    {
                        log.Debug("Pending cancel of multifunction order, so removing " + packetFIX.ClientOrderId + " and " + packetFIX.OriginalClientOrderId);
                    }
                    if (clientOrderId != 0L)
                    {
                        OrderStore.RemoveOrder(clientOrderId);
                    }
                    if (originalClientOrderId != 0L)
                    {
                        OrderStore.RemoveOrder(originalClientOrderId);
                    }
                    break;
                }
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                TryHandlePiggyBackFill(packetFIX);
                break;

            case "8":     // Rejected
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Reject: " + packetFIX);
                }
                RejectOrder(packetFIX);
                break;

            case "9":     // Suspended
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Suspended: " + packetFIX);
                }
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "A":     // PendingNew
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Pending New: " + packetFIX);
                }
                if (algorithm == null)
                {
                    log.Info("PendingNew but OrderAlgorithm not found for " + symbolInfo + ". Ignoring.");
                    break;
                }

                OrderStore.TryGetOrderById(clientOrderId, out order);
                if (order != null && symbolInfo.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder &&
                    (order.Type == OrderType.BuyStop || order.Type == OrderType.SellStop))
                {
                    if (packetFIX.ExecutionType == "D")      // Restated
                    {
                        if (debug)
                        {
                            log.Debug("Ignoring restated message 150=D for Forex stop execution report 39=A.");
                        }
                    }
                    else
                    {
                        algorithm.OrderAlgorithm.ConfirmCreate(originalClientOrderId, IsRecovered);
                    }
                }
                else
                {
                    algorithm.OrderAlgorithm.ConfirmActive(originalClientOrderId, IsRecovered);
                }
                TrySendStartBroker(symbolInfo, "sync on confirm cancel orig order");
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                break;

            case "E":     // Pending Replace
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Pending Replace: " + packetFIX);
                }
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                TryHandlePiggyBackFill(packetFIX);
                break;

            case "R":     // Resumed.
                if (debug && (LogRecovery || !IsRecovery))
                {
                    log.Debug("ExecutionReport Resumed: " + packetFIX);
                }
                OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence);
                //UpdateOrder(packetFIX, OrderState.Active, null);
                // Ignore
                break;

            default:
                throw new ApplicationException("Unknown order status: '" + orderStatus + "'");
            }
        }