/// <summary>
        /// Constructor.
        /// </summary>
        public ThreadPoolFastExecutionStrategy(bool useCommonMessageBusPool)
        {
            _useCommonMessageBusPool = useCommonMessageBusPool;

            GeneralHelper.GenericDelegate<Envelope> delegateInstance = new GeneralHelper.GenericDelegate<Envelope>(PerformExecution);
            _performExecutionDelegate = FastInvokeHelper.GetMethodInvoker(delegateInstance.Method, true, false);
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        public ThreadPoolFastExecutionStrategy(bool useCommonMessageBusPool)
        {
            _useCommonMessageBusPool = useCommonMessageBusPool;

            GeneralHelper.GenericDelegate <Envelope> delegateInstance = new GeneralHelper.GenericDelegate <Envelope>(PerformExecution);
            _performExecutionDelegate = FastInvokeHelper.GetMethodInvoker(delegateInstance.Method, true, false);
        }
Beispiel #3
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public ThreadPoolFastExecutionStrategy(ArbiterSlimActiveClientStub client, bool useCommonArbiterPool)
            : base(client)
        {
            _useCommonArbiterPool = useCommonArbiterPool;

            GeneralHelper.GenericDelegate <ThreadPoolFast, Envelope> delegateInstance = new GeneralHelper.GenericDelegate <ThreadPoolFast, Envelope>(PerformExecution);
            _singleFastInvokeDelegate = FastInvokeHelper.GetMethodInvoker(delegateInstance.Method, false);
        }
Beispiel #4
0
        /// <summary>
        /// Will attemp to close all slave orders simultaniously.
        /// </summary>
        /// <returns>True if at least one slave order was closed.</returns>
        public bool Close(out string operationResultMessage)
        {
            int result = 0;

            string operationMessageSum = string.Empty;
            int    ordersToProcess;

            lock (this)
            {
                ordersToProcess = _placedSlaveOrders.Count;
            }

            ManualResetEvent processEvent = new ManualResetEvent(false);

            GeneralHelper.GenericDelegate <ActiveOrder> closeDelegate =
                delegate(ActiveOrder order)
            {
                string innerOperationResultMessage;

                bool innerResult = order.Close(out innerOperationResultMessage);

                lock (this)
                {
                    ordersToProcess--;
                    if (innerResult)
                    {
                        result++;
                        _placedSlaveOrders.Remove(order);
                        operationMessageSum += System.Environment.NewLine + /*"Order [" + order.OrderExecutionProvider..Info.Name + */ "], Result [OK]";
                    }
                    else
                    {
                        operationMessageSum += System.Environment.NewLine + /*"Order [" + order.OrderExecutionProvider.Info.Name +*/ "], Result [" + innerOperationResultMessage + "]";
                    }

                    if (ordersToProcess == 0)
                    {    // The last one should set the event to notify the main thread.
                        processEvent.Set();
                    }
                }
            };

            lock (this)
            {
                foreach (ActiveOrder order in _placedSlaveOrders)
                {// Delegate will remove orders from _openedSlaveOrders, but only after lock is released, so no problem to do it like this.
                    GeneralHelper.FireAndForget(closeDelegate, order);
                }
            }

            // Wait for all orders placement to end.
            processEvent.WaitOne();

            lock (this)
            {
                if (_placedSlaveOrders.Count == 0)
                {
                    State = OrderStateEnum.Closed;
                }
            }

            operationResultMessage = operationMessageSum;
            return(result > 0);
        }
Beispiel #5
0
        /// <summary>
        /// Updates some parts of the UI, since others must be updated on given events only.
        /// </summary>
        public void UpdateUI()
        {
            this.Enabled = ((_selectedSession != null && _selectedSession.OrderExecutionProvider != null) || _sessionManager != null);

            if (this.Enabled == false)
            {
                return;
            }

            // Update SessionsArray UI combobox
            for (int i = 0; i < _sessions.Count + 1; i++)
            {
                if (toolStripComboBoxAccount.Items.Count <= i)
                {
                    toolStripComboBoxAccount.Items.Add("");
                }

                if (i == 0)
                {// All accountInfos go first.
                    if ((string)toolStripComboBoxAccount.Items[0] != "All")
                    {
                        toolStripComboBoxAccount.Items[0] = "All";
                    }
                }
                else
                {
                    string name = GetSessionName(_sessions[i - 1]);
                    if ((string)toolStripComboBoxAccount.Items[i] != name)
                    {
                        toolStripComboBoxAccount.Items[i] = name;
                    }
                }
            }

            while (_sessions.Count + 1 < toolStripComboBoxAccount.Items.Count)
            {
                toolStripComboBoxAccount.Items.RemoveAt(toolStripComboBoxAccount.Items.Count - 1);
            }

            if (toolStripComboBoxAccount.SelectedIndex < 0)
            {
                toolStripComboBoxAccount.SelectedIndex = 0;
            }

            // Update
            this.listViewOrders.Visible = _compactMode == false;

            this.toolStripButtonCloseOrder.Visible  = _compactMode == false;
            this.toolStripButtonModifyOrder.Visible = _compactMode == false;

            toolStripButtonDisplayMode.Visible    = _allowCompactMode;
            toolStripSeparatorDisplayMode.Visible = _allowCompactMode;

            this.toolStripButtonNewOrder.Enabled = _selectedSession != null;
            //this.toolStripButtonObtainOrders.Enabled = true;

            this.toolStripButtonCloseOrder.Enabled  = listViewOrders.SelectedItems.Count > 0;
            this.toolStripButtonModifyOrder.Enabled = listViewOrders.SelectedItems.Count > 0;

            if (_compactMode)
            {
                toolStripButtonDisplayMode.Text = "Full Mode";
            }
            else
            {
                toolStripButtonDisplayMode.Text = "Compact Mode";
            }

            if (_alwaysShowAccountSelectionTools)
            {
                toolStripLabelAccount.Visible     = true;
                toolStripComboBoxAccount.Visible  = true;
                toolStripSeparatorAccount.Visible = true;
            }
            else
            {
                // If only 1 account to manage, do not show
                toolStripLabelAccount.Visible     = _sessions.Count > 1;
                toolStripComboBoxAccount.Visible  = _sessions.Count > 1;
                toolStripSeparatorAccount.Visible = _sessions.Count > 1;
            }

            List <ListViewItem> items = new List <ListViewItem>();

            foreach (ListViewItem item in listViewOrders.Items)
            {
                items.Add(item);
            }

            foreach (ExpertSession session in _sessions)
            {
                if (IsSessionVisible(session))
                {
                    lock (session)
                    {
                        GeneralHelper.GenericDelegate <Order, AccountInfo> UpdateOrder = delegate(Order order, AccountInfo account)
                        {
                            if (IsOrderVisible(order) == false)
                            {
                                return;
                            }

                            bool orderFound = false;
                            foreach (ListViewItem item in items)
                            {
                                if (item.Tag == order)
                                {
                                    SetItemAsOrder(item, order, account);
                                    orderFound = true;
                                    items.Remove(item);
                                    break;
                                }
                            }

                            if (orderFound == false)
                            {
                                ListViewItem item = new ListViewItem();
                                listViewOrders.Items.Add(item);
                                SetItemAsOrder(item, order, account);
                            }
                        };

                        IOrderSink             executor         = session.OrderExecutionProvider;
                        ITradeEntityManagement ordersManagement = session.OrderExecutionProvider.TradeEntities;

                        if (ordersManagement != null && session.OrderExecutionProvider.DefaultAccount != null)
                        {
                            lock (ordersManagement)
                            {
                                foreach (Order order in ordersManagement.OrdersUnsafe)
                                {
                                    UpdateOrder(order, session.OrderExecutionProvider.DefaultAccount.Info);
                                }
                            }
                        }
                    }
                }
            }

            foreach (ListViewItem item in items)
            {
                listViewOrders.Items.Remove(item);
            }
        }
Beispiel #6
0
 static public MethodInfo GetMethodInfo <TParam1, TParam2, TParam3>(GeneralHelper.GenericDelegate <TParam1, TParam2, TParam3> delegateInstance)
 {
     return(delegateInstance.Method);
 }
Beispiel #7
0
 /// <summary>
 /// Redefine needed so that we can construct and pass anonymous delegates with parater.
 /// No need to specify the Value parameter(s), since they can be recognized automatically by compiler.
 /// </summary>
 public static void FireAndForget <ValueType1, ValueType2>(GeneralHelper.GenericDelegate <ValueType1, ValueType2> d, params object[] args)
 {
     _threadPoolEx.Queue(d, args);
 }