예제 #1
0
        private static void Subscribe()
        {
            try
            {
                Console.WriteLine("Try connect to MCSDR .....");

                //  if(m_clientMcsd == null)



                subRequest.Username            = m_MCSDUserName;
                subRequest.Password            = m_MCSD_Password;
                subRequest.QueueName           = m_MCSDresponseQueueName;
                subRequest.QueueIP             = m_MCSDresponseQueueIP;
                subRequest.FlushUpdatesOffline = false;

                m_clientMcsd = m_factory.CreateChannel();


                adminMsg = m_clientMcsd.Subscribe(subRequest);

                _IsMcsdSessionUp = true;

                ((ICommunicationObject)m_clientMcsd).Closed  += MCSDManager_Closed;
                ((ICommunicationObject)m_clientMcsd).Faulted += MCSDManager_Faulted;
                ((ICommunicationObject)m_clientMcsd).Opened  += McsdGatwayManager_Opened;

                SystemLogger.LogEventAsync("Connected to MCSD successfully !");
                SystemLogger.WriteOnConsoleAsync(true, "Connected to MCSD successfully !", ConsoleColor.Green, ConsoleColor.Black, false);
            }
            catch (Exception exp)
            {
                //SystemLogger.LogErrorAsync("Subscribtion to MCSD Service Failed. Error : " + exp.ToString());
                SystemLogger.WriteOnConsoleAsync(true, "Subscribtion to MCSD Service Failed. Error : " + exp.Message, ConsoleColor.Red, ConsoleColor.Black, false);
            }

            finally
            {
                if (_IsMcsdSessionUp == false)
                {
                    System.Threading.Thread.Sleep(3000);
                    Subscribe();
                }
            }
        }
 public static void Push(string username, IFromAdminMsg[] msgs)
 {
     try
     {
         if (!_username_Session.ContainsKey(username))
         {
             return;
         }
         SessionInfo session = _username_Session[username];
         if (session.Callback != null && session.IsOnline)
         {
             session.Callback.PushAdminMsg(msgs);
         }
     }
     catch (Exception inEx)
     {
         Counters.IncrementCounter(CountersConstants.ExceptionMessages);
         SystemLogger.LogEventAsync(string.Format("Error sending admin msg to session {0}, Error: {1}", username, inEx.Message));
     }
 }
        public bool Handle(IRequestMessage msg)
        {
            Type msgType = msg.GetType();

            if (typeof(IRequestMessage).IsAssignableFrom(msgType))
            {
                if (typeof(CancelSingleOrder) == msgType)
                {
                    CancelSingleOrder cancelOrder = (CancelSingleOrder)msg;

                    if (cancelOrder.ClientKey == Guid.Empty || cancelOrder.ClientKey == null)
                    {
                        SystemLogger.LogEventAsync(string.Format("ClientKey[0] not valid! ", cancelOrder.ClientKey.ToString()));
                        return(true);
                    }
                    string username = Sessions.GetUsername(cancelOrder.ClientKey);
                    if (!Sessions.IsSubscribedToSendMsg(username))
                    {
                        SystemLogger.LogEventAsync(string.Format("ClientKey not subscribed", cancelOrder.ClientKey));
                        return(true);
                    }
                    SingleOrder order = OrdersManager.GetOrder(cancelOrder.RequesterOrderID);
                    if (order == null)
                    {
                        Sessions.Push(Sessions.GetUsername(cancelOrder.ClientKey), new IResponseMessage[] { new Fix_OrderCancelRefusedByService()
                                                                                                            {
                                                                                                                ClientKey = cancelOrder.ClientKey, Message = "order not found", RequesterOrderID = cancelOrder.RequesterOrderID, OrderStatus = "Order Not Found"
                                                                                                            } });
                        SystemLogger.LogEventAsync(string.Format("Order Not Found RequesterID {0}  ", cancelOrder.RequesterOrderID));
                        return(true);
                    }

                    lock (order)
                    {
                        string status = order[SingleOrderProperties.OrderStatus].ToString();

                        // check ispending before isactive becoz a pendingnew order might be not isactive but ispending
                        bool isPending, isMcsdPending = false;
                        isPending     = Convert.ToBoolean(order[SingleOrderProperties.IsPending]);
                        isMcsdPending = Convert.ToBoolean(order[SingleOrderProperties.IsPendingMcsd]);
                        if (bool.TryParse(order[SingleOrderProperties.IsPending].ToString(), out isPending))
                        {
                            if (isPending || isMcsdPending)
                            {
                                Sessions.Push(Sessions.GetUsername(cancelOrder.ClientKey), new IResponseMessage[] { new Fix_OrderCancelRefusedByService()
                                                                                                                    {
                                                                                                                        ClientKey = cancelOrder.ClientKey, Message = !isMcsdPending ? "Order is in pending request" : "Awaiting for allocation response", RequesterOrderID = cancelOrder.RequesterOrderID, OrderStatus = status
                                                                                                                    } });
                                return(true);
                            }
                        }

                        bool isActive = false;
                        if (bool.TryParse(order[SingleOrderProperties.IsActive].ToString(), out isActive))
                        {
                            if (!isActive)
                            {
                                Sessions.Push(Sessions.GetUsername(cancelOrder.ClientKey), new IResponseMessage[] { new Fix_OrderCancelRefusedByService()
                                                                                                                    {
                                                                                                                        ClientKey = cancelOrder.ClientKey, Message = "Order not active anymore", RequesterOrderID = cancelOrder.RequesterOrderID, OrderStatus = status
                                                                                                                    } });
                                return(true);
                            }
                        }

                        try
                        {
                            OrdersManager.HandleCancelOrder(username, cancelOrder.ClientKey, (Guid)order[SingleOrderProperties.RequesterOrderID], (long)order[SingleOrderProperties.OrderID], msg.OptionalParam);
                            Counters.IncrementCounter(CountersConstants.ClientsCancelOrderReqs);
                        }
                        catch (Exception ex)
                        {
                            Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                            SystemLogger.LogEventAsync(string.Format("Error cancelling order {0}, Error: {1}", order[SingleOrderProperties.OrderID], ex.ToString()));
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
        public bool Handle(IRequestMessage msg)
        {
            try
            {
                Type msgType = msg.GetType();
                if (typeof(IRequestMessage).IsAssignableFrom(msgType))
                {
                    if (typeof(NewSingleOrder) == msgType)
                    {
                        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                        sw.Start();
                        Counters.IncrementCounter(CountersConstants.ClientsNewOrderReqs);

                        NewSingleOrder order = (NewSingleOrder)msg;

                        #region validate client key
                        if (order.ClientKey == Guid.Empty || order.ClientKey == null)
                        {
                            SystemLogger.LogEventAsync(string.Format("ClientKey [{0}] not valid! ", order.ClientKey.ToString()));
                            return(true);
                        }
                        string username = Sessions.GetUsername(order.ClientKey);
                        if (!Sessions.IsSubscribedToSendMsg(username))
                        {
                            SystemLogger.LogEventAsync(string.Format("ClientKey [{0}] not subscribed", order.ClientKey));
                            return(true);
                        }
                        #endregion validate client key

                        #region validate stock group
                        Stock stock = StocksDefinitions.GetStockByCode(order.SecurityID);
                        if (stock == null)
                        {
                            Sessions.Push(Sessions.GetUsername(order.ClientKey), new IResponseMessage[] { new Fix_OrderRefusedByService()
                                                                                                          {
                                                                                                              ClientKey = order.ClientKey, RefuseMessage = "Stock Not Found!", RequesterOrderID = order.RequesterOrderID
                                                                                                          } });
                        }
                        #endregion validate stock group

                        #region validate currency
                        CurrencyItem currency = Currencies.GetCurrencyByCode(stock.CurrencyCode);
                        #endregion validate currency

                        #region validate order details
                        string validation = ValidateOrder(username, order);
                        #endregion validate order details

                        #region not valid order

                        if (validation != "valid")
                        {
                            try
                            {
                                SystemLogger.LogEventAsync(string.Format("OrderRefusedByService RequesterOrderID: {0}, Reason: {1}", order.RequesterOrderID, validation));
                                Sessions.Push(Sessions.GetUsername(order.ClientKey), new IResponseMessage[] { new Fix_OrderRefusedByService()
                                                                                                              {
                                                                                                                  ClientKey = order.ClientKey, RefuseMessage = validation, RequesterOrderID = order.RequesterOrderID
                                                                                                              } });
                            }
                            catch (Exception ex)
                            {
                                Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                                SystemLogger.LogEventAsync(string.Format("Error sending refused order to the client, ClientKey {0}, Error: {1}", order.ClientKey, ex.Message));
                            }
                            return(true);
                        }
                        #endregion not valid order

                        OrdersManager.HandleNewSingleOrder(username, order.ClientKey, order.RequesterOrderID, order.ClientID, order.CustodyID, order.SecurityID, order.OrderSide, Math.Round(order.Price, m_orderPriceDigitsRounding), order.Quantity, order.OrderType, DateTime.Now, order.TimeInForce, currency, order.ExchangeID, order.DateTime, stock.GroupID, stock.MarketID, order.HandleInst, order.ExpirationDateTime, order.OptionalParam);
                        sw.Stop();
                        SystemLogger.LogEventAsync(string.Format("new order handled in {0} ms ", sw.ElapsedMilliseconds));
                        sw = null;
                        return(true);
                    }
                }
                return(false);
            }
            catch (Exception ex)
            {
                Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                SystemLogger.LogErrorAsync("NewSingleOrderHandler Error: " + ex.Message);
                return(true);
            }
        }
예제 #5
0
        protected void OnStartInternally(object arguments)
        {
            string[] args = (string[])arguments;

            try
            {
                /*if (!IsAdministrator())
                 * {
                 *  // Restart program and run as admin
                 *  var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
                 *  ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
                 *  startInfo.Verb = "runas";
                 *  System.Diagnostics.Process.Start(startInfo);
                 *  Environment.Exit(0);
                 *  return;
                 * }*/



                // check multiple processes
                //commented by khazbak to avoid requirement to start in admin mode

                /*
                 * if (bool.Parse(SystemConfigurations.GetAppSetting("CheckMultipleInstances")))
                 * {
                 *  string currProcName = Process.GetCurrentProcess().ProcessName;
                 *  int currProcID = Process.GetCurrentProcess().Id;
                 *  Process[] processes = Process.GetProcessesByName(currProcName);
                 *  if (processes.Length > 1)
                 *  {
                 *      foreach (Process p in processes)
                 *      {
                 *          if (p.Id != currProcID)
                 *          {
                 *              int id = p.Id;
                 *              p.Kill();
                 *              SystemLogger.WriteOnConsoleAsync(true, "Process has been killed ID: " + id, ConsoleColor.Gray, ConsoleColor.White, false);
                 *          }
                 *      }
                 *  }
                 * }*/

                Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

                SystemLogger.LogEventAsync("Starting FIX Service...");

                try
                {
                    if (bool.Parse(SystemConfigurations.GetAppSetting("ReinitializeCounters")))
                    {
                        Counters.ReInitialize();
                    }
                    else
                    {
                        Counters.Initialize();
                    }
                }
                catch (Exception ex)
                {
                    SystemLogger.WriteOnConsoleAsync(true, "Error initializing counters, Error: " + ex.ToString(), ConsoleColor.Red, ConsoleColor.Black, true);
                }


                DatabaseMethods db = new DatabaseMethods();
                if (!db.IsTodaySequenceReset()) // reset the counters only if the service starts for first time today
                {
                    Counters.ResetCounters();
                }
                // Check queue existance
                if (bool.Parse(SystemConfigurations.GetAppSetting("CheckQueueExistance")))
                {
                    CheckAndSetPermissionsToQueues();
                }
                FixExchangesInfo.Initialize();
                Currencies.Initialize();
                StocksDefinitions.Initialize();
                Lookups.Initialize();
                string seqFilePath = SystemConfigurations.GetAppSetting("SequenceFilePath");
                if (!db.IsTodaySequenceReset())
                {
                    SystemLogger.LogEventAsync("Resetting FIX sequence..");
                    db.UpdateTodaySequenceReset();
                    SystemLogger.LogEventAsync("Sequence reset successfully");
                    //try
                    //{
                    //    System.IO.File.Delete(seqFilePath);
                    //}
                    //catch (Exception ex)
                    //{
                    //    Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                    //    SystemLogger.WriteOnConsoleAsync(true, "Deleting Sequence File Error: " + ex.Message, ConsoleColor.Red, ConsoleColor.Black, true);
                    //}
                }


                Router responsesRouter = new Router(typeof(ResponsesProcessor), int.Parse(SystemConfigurations.GetAppSetting("ResponsesRouterProcessorsNum")));

                m_FixSessionStatusChangedDelegate = new FixSessionStatusChangedDelegate(OnFixStatusChange);


                bool AllowMcsdAllocation = Convert.ToBoolean(SystemConfigurations.GetAppSetting("AllowMcsdAllocation")); // maghrabi

                if (AllowMcsdAllocation)                                                                                 //MCSD
                {
                    Router mcsdResponsesRouter = new Router(typeof(ResponsesProcessorMcsd), int.Parse(SystemConfigurations.GetAppSetting("McsdResponsesRouterProcessorsNum")));
                    McsdGatwayManager.Initialize(mcsdResponsesRouter); // maghrabi
                    McsdGatwayManager.LoginToMCSD();                   // maghrabi
                }

                string fixClientSettings = Environment.CurrentDirectory + @"\" + SystemConfigurations.GetAppSetting("FixClientSettingsFile");
                string fixServerSettings = Environment.CurrentDirectory + @"\" + SystemConfigurations.GetAppSetting("FixServerSettingsFile");
                MarketFixClient.Initialize(fixClientSettings, responsesRouter, m_FixSessionStatusChangedDelegate);
                SvcFixServer.InitializeServer(fixServerSettings);
                OrdersManager.Initialize();
                Sessions.Initialize();
                //RepSessions.Initialize();
                InitializeService();

                if (_resetSequenceNumber)
                {
                    //  MarketFixClient.ResetSequence();
                }

                MarketFixClient.Logon();



                SystemLogger.WriteOnConsoleAsync(true, "Awaiting for Fix server response ...", ConsoleColor.Yellow, ConsoleColor.Black, false);
                System.Windows.Forms.Application.Run(new frmMonitor()); //maghrabi
                //while (true) { Console.ReadKey(); }
                //StopService();
            }
            catch (Exception ex)
            {
                Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                SystemLogger.WriteOnConsoleAsync(true, "Main Error: " + ex.ToString(), ConsoleColor.Red, ConsoleColor.Black, true);

                try
                {
                    string[] cc = SystemConfigurations.GetAppSetting("SupportMailCC").Split(',');
                    NotificationSender.Send(true, true, false, SystemConfigurations.GetAppSetting("SupportMailFrom"), SystemConfigurations.GetAppSetting("SupportMailTo"), cc, "Fix Service Down", "Fix Service Down",
                                            string.Format("Service startup error state on machine {0} at {1}, Error : {2}", SystemConfigurations.GetMachineIP(), DateTime.Now.ToString(), ex.ToString()), null);
                }
                catch (Exception inex)
                {
                    Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                    SystemLogger.WriteOnConsoleAsync(true, "Sending Mail Error: " + inex.Message, ConsoleColor.Red, ConsoleColor.Black, false);
                }

                //Console.ReadKey();
            }
        }
예제 #6
0
        public bool Handle(IRequestMessage msg)
        {
            try
            {
                Type msgType = msg.GetType();
                if (typeof(IRequestMessage).IsAssignableFrom(msgType))
                {
                    if (typeof(ModifyCancelOrder) == msgType)
                    {
                        Counters.IncrementCounter(CountersConstants.ClientsReplaceOrderReqs);


                        ModifyCancelOrder modifyOrder = (ModifyCancelOrder)msg;
                        SingleOrder       order       = OrdersManager.GetOrder(modifyOrder.RequesterOrderID);

                        #region order existanse validation
                        if (order == null)
                        {
                            Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService()
                                                                                                                {
                                                                                                                    ClientKey = modifyOrder.ClientKey, RefuseReason = "Order Not Found!", RequesterOrderID = modifyOrder.RequesterOrderID
                                                                                                                } });
                            SystemLogger.LogEventAsync(string.Format("Order Not Found RequesterID {0}  ", modifyOrder.RequesterOrderID));
                            return(true);
                        }
                        #endregion order existanse validation

                        lock (order)
                        {
                            #region check order activation
                            // check ispending before isactive becoz a pendingnew order might be not isactive but ispending
                            bool isPending, isMcsdPending = false;
                            isPending     = Convert.ToBoolean(order[SingleOrderProperties.IsPending]);
                            isMcsdPending = Convert.ToBoolean(order[SingleOrderProperties.IsPendingMcsd]);

                            if (isPending || isMcsdPending)
                            {
                                Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService()
                                                                                                                    {
                                                                                                                        ClientKey = modifyOrder.ClientKey, RefuseReason = !isMcsdPending ? "Order is in pending request" : "Awaiting for allocation response", RequesterOrderID = modifyOrder.RequesterOrderID
                                                                                                                    } });
                                return(true);
                            }

                            bool isActive = false;
                            isActive = Convert.ToBoolean(order[SingleOrderProperties.IsActive]);
                            if (!isActive)
                            {
                                Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService()
                                                                                                                    {
                                                                                                                        ClientKey = modifyOrder.ClientKey, RefuseReason = "Order not active any more", RequesterOrderID = modifyOrder.RequesterOrderID
                                                                                                                    } });
                                return(true);
                            }


                            #endregion check order activation

                            #region order validation
                            // ValidateOrder
                            string validation = ValidateOrder(modifyOrder, order);
                            if (validation != "valid")
                            {
                                Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService()
                                                                                                                    {
                                                                                                                        ClientKey = modifyOrder.ClientKey, RefuseReason = validation, RequesterOrderID = modifyOrder.RequesterOrderID
                                                                                                                    } });
                                return(true);
                            }
                            #endregion order validation

                            // handle ClOrderID and OrigClOrdID
                            OrdersManager.HandleModifyOrder(Sessions.GetUsername(modifyOrder.ClientKey), modifyOrder.ClientKey, modifyOrder.RequesterOrderID, (long)order[SingleOrderProperties.OrderID], modifyOrder.Quantity, Math.Round(modifyOrder.Price, m_orderPriceDigitsRounding), modifyOrder.OrderType, modifyOrder.TimeInForce, modifyOrder.OptionalParam);
                            return(true);
                        }
                    }
                }
                return(false);
            }
            catch (Exception ex)
            {
                Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                SystemLogger.LogErrorAsync("ModifyCancelOrderHandler Error: " + ex.Message);
                return(true);
            }
        }