/// <summary>
        /// Shows ControlPanel on the rightest ControlMarket
        /// after we delete the "old" rightest ControlStock
        ///
        /// </summary>
        /// <param name="stockNumDelete"></param>
        public void ShowControlPanelOnRightStock(int stockNumDelete)
        {
            //only if we delete rightes ControlMarket
            if (stockNumDelete == KernelTerminal.StockVisualConf.ListStocksVisual.Count - 1)
            {
                //-2 cause 1)numeration from zero and 2)stock was not removed from StockVisualConf
                int num = KernelTerminal.StockVisualConf.ListStocksVisual.Count - 2;

                num = Math.Max(num, 0);
                //if (stockNumDelete == 0)
                //num = KernelTerminal.StockVisualConf.ListStocksVisual.Count - 1;


                foreach (var child in GridMarket.Children)
                {
                    if (child is ControlMarket)
                    {
                        ControlMarket cm = (ControlMarket)child;
                        if (cm.StockNum == num)
                        {
                            cm.ShowWindowControlPannels();
                        }
                    }
                }
            }
        }
        /*
         * public void ClickMenuItemWindow<TChildWindow>() where TChildWindow : Window
         * {
         *  KernelTerminal.ViewModelDispatcher.OpenChildWindow <TChildWindow>();
         * }
         */



        /// <summary>
        /// On add stock do hide all WindowControlPanels, except the rightest stock (with largest StockNum)
        /// Call method after change stock configuration (add or replace)
        ///
        /// Call from:
        /// 1) Mainwindow.AddAllStocksFromConfig
        /// 2) Mainwindow.AddStockFromButton
        /// 3) MainWindow.ReplaceControlMarket
        /// </summary>
        public void HideWindowControlPanels()
        {
            int cntOfStocks = KernelTerminal.MaxStockNum;

            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    ControlMarket cm = (ControlMarket)child;
                    if (cm.StockNum != cntOfStocks)
                    {
                        cm.HideWindowControlPannels();
                    }
                    else
                    {
                        /* MarketViewModel mvm =  CKernelTerminal.GetViewModelDispatcherInstance().GetMarketViewModel(cm.StockNum)
                         *   if (mvm!=null)
                         *   {
                         *       mvm.
                         *
                         *   }*/
                    }
                }
            }
        }
        public void CheckStocksForDelEnable()
        {
            int count = 0;

            ControlMarket cm = null;

            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    count++;
                    cm = (ControlMarket)child;
                }
            }
            if (count <= 1) //still single stock
            {
                return;
            }



            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    cm = (ControlMarket)child;
                    cm.EnableDeleteStock();
                }
            }
        }
        private void SubscribeMainWinEvents(ref ControlMarket controlMarket)
        {
            MainWindow mw = (MainWindow)CUtilWin.FindWindow <MainWindow>();

            controlMarket.ButtonClose.PreviewMouseUp             += mw.ControlStock_ButtonClose_PreviewMouseUp;
            controlMarket.ButtonMaximizeNormalize.PreviewMouseUp += mw.ControlStock_ButtonMaximizeNomalize_PreviewMouseUp;
            controlMarket.ButtonMinimize.PreviewMouseUp          += mw.ControlStock_ButtonMinimize_PreviewMouseUp;
            controlMarket.ButtonMaximizeNormalize.PreviewMouseUp += controlMarket.ButtonMaximizeNmormilize_PreviewMouseUp;
        }
        /// <summary>
        /// 1)Calls SetParameters (deprecated)
        /// 2)Call SubscribeMainWinEvents (subscribe ControlMarket to MainWindow events)
        /// 3)Call BindToViewModel (data binding operations)
        /// 4)Inserts to ControlMarkets list
        /// 5)Updates Z indexes
        ///
        /// Call from:
        /// 1) CKernelTerminal.AddOneStockFromConfig
        /// 2) CkernelTerminal.AddEmptyStock
        /// 3) ReplaceControlMarket
        /// </summary>
        public void AddControlMarket(ControlMarket controlMarket, MarketViewModel marketViewModel)
        {
            SetParameters(ref controlMarket, marketViewModel);
            SubscribeMainWinEvents(ref controlMarket);
            BindToViewModel(ref controlMarket, marketViewModel);

            //Note: add to list in position specified by StockNum
            _lstControlMarket.Insert(controlMarket.StockNum, controlMarket);
            //  _lstControlMarket.Add(controlMarket);

            UpdateZIndexes();
        }
        /// <summary>
        /// Creates new MarketViewModel instance and adds it to dictioanary with viewmodels
        ///
        /// Call from
        /// 1) CKernelTerminal.AddOneStockFromConfig
        /// 2) CKernelTerminal.AddEmptyStock
        /// </summary>
        public void AddMarketViewModelNew(int stockNum, ControlMarket controlMarket, CStocksVisual stockVisual, CInstrumentConfig instrumentConfig)
        {
            //TODO access using unique id of market
            try
            {
                lock (_dictKIsinVMarketViewModel)
                    _dictKIsinVMarketViewModel.Add(stockVisual.Ticker,
                                                   new MarketViewModel(stockNum, controlMarket, _kernelTerminal, stockVisual, instrumentConfig));
            }
            catch (Exception e)

            {
                Error("AddMarketViewModelNew", e);
            }
        }
        private void CancellInstrOrder(ControlMarket controlMarket)
        {
            MarketViewModel mv = (MarketViewModel)controlMarket.DataContext;

            CDataCloseInstPos dataClose = new CDataCloseInstPos
            {
                Instrument = controlMarket.ControlStockInstance.TickerName,
                ConId      = mv.ConnId
            };


            ExecuteCommand(EventsGUI.CancellInstrumentOrders, dataClose);


            return;
        }
        private void BindWorkAmount(ControlMarket controlMarket, MarketViewModel marketViewModel)
        {
            //TODO make with observable collection
            ControlWorkAmount             ControlWrkAmountGrid = controlMarket.ControlDealsInstance.WorkAmountGrid;
            List <ControlAmountTextBlock> lstAmTextBlock       = new List <ControlAmountTextBlock>()
            {
                ControlWrkAmountGrid.AmountTextBlock1,
                ControlWrkAmountGrid.AmountTextBlock2,
                ControlWrkAmountGrid.AmountTextBlock3,
                ControlWrkAmountGrid.AmountTextBlock4,
                ControlWrkAmountGrid.AmountTextBlock5,
            };



            // controlMarket.ControlDealsInstance.WorkAmountGrid.DataContext = marketViewModel;
            //controlMarket.ControlStockInstance.DataContext = marketViewModel;



            CUtil.SetBinding(marketViewModel, "CurrAmountNum", controlMarket.ControlDealsInstance.WorkAmountGrid, ControlWorkAmount.CurrAmountNumProperty, true);
            // CUtil.SetBinding(marketViewModel, "CurrAmountNum", controlMarket.ControlStockInstance, ControlStock.CurrAmountNumProperty, true);



            controlMarket.ControlDealsInstance.WorkAmountGrid.SelectActualControlAmount();



            CUtil.SetBinding(marketViewModel, "ListWorkAmount", controlMarket.ControlStockInstance, ControlStock.ListWorkAmountProperty);

            for (int i = 0; i < NumAmounts; i++)
            {
                marketViewModel.ListWorkAmount.Add(new CWorkAmount());
                lstAmTextBlock[i].DataContext = marketViewModel.ListWorkAmount[i];
                CUtil.SetBinding(marketViewModel.ListWorkAmount[i], "TextAmountValue", lstAmTextBlock[i],
                                 ControlAmountTextBlock.TextAmountValueProperty);


                CUtil.SetBinding(marketViewModel, "StockNum", lstAmTextBlock[i], ControlAmountTextBlock.StockNumProperty);

                marketViewModel.ListWorkAmount[i].TextAmountValue = marketViewModel.InstrumentConfig.WorkAmounts[i].ToString();

                //RaisePropertyChanged("ListWorkAmount");
            }
        }
 /// <summary>
 /// If Empty instrument disable ButtonAddStock
 /// </summary>
 public void CheckAddButtonVisibility()
 {
     foreach (var child in GridMarket.Children)
     {
         if (child is ControlMarket)
         {
             ControlMarket cm = (ControlMarket)child;
             if (cm.ControlStockInstance.TickerName == Literals.Undefind)
             {
                 cm.ButtonAddStock.Visibility = Visibility.Collapsed;
             }
             else
             {
                 cm.ButtonAddStock.Visibility = Visibility.Visible;
             }
         }
     }
 }
        /// <summary>
        /// Call when Connected stock need replace with the new one
        /// 1) Find VieModel with oldTicker, reset IsAlive (stops network processing
        /// data thread)
        /// 2) Remove old ticker MarketViewModel from dictKIsinVMarketViewModel
        /// 3) Creates new ticker MarketViewModel and add it to _dictKIsinVMarketViewModel
        ///
        /// Call from CKernelTerminal.EditConnectedStock
        /// </summary>
        public void ReplaceMarketViewModel(int stockNum, string oldTicker, CStocksVisual stockVisual,
                                           ControlMarket controlMarket, CInstrumentConfig instrumentConfig)
        {
            lock (_dictKIsinVMarketViewModel)
            {
                var res = _dictKIsinVMarketViewModel.Values.FirstOrDefault(a => a.ControlMarket.StockNum == stockNum); //Where(key => key.StockNum == stockNum);

                if (res != null)
                {
                    res.IsAlive = false;
                    _dictKIsinVMarketViewModel.Remove(oldTicker);

                    _dictKIsinVMarketViewModel[stockVisual.Ticker] = new MarketViewModel(stockNum, controlMarket, _kernelTerminal,
                                                                                         stockVisual, instrumentConfig);
                    //upd 2017_08_27
                    // _dictKIsinVMarketViewModel[stockVisual.Ticker].IsConnectedToServer = true;
                }
            }
        }
        /// <summary>
        /// 1) Delete GridSplitter from visual tree and
        /// GridSplitter's column from grid
        /// 2) Delete ControlMarket from visual tree and
        /// ControlMarket's column from grid
        /// Note. Each ControlMarket has StockNum property
        /// with enumeration  from 0 to N. And the same is
        /// for GridSplitter but using tag.
        /// Enumeration in ColumnDefiniions and in
        /// Child list is even (0,2,4) for ControlMarket,
        /// odd (1,3,5) for GridSplitter
        ///
        /// Call from:
        /// KernerlTerminal.DeleteExistingStock
        /// </summary>
        public void DeleteStock(int stockNum)
        {
            //Delete GridSplitter
            foreach (var child in GridMarket.Children)
            {
                if (child is GridSplitter)
                {
                    GridSplitter gs = (GridSplitter)child;
                    if ((int)gs.Tag == stockNum)
                    {
                        int col = Grid.GetColumn(gs);

                        GridMarket.ColumnDefinitions.RemoveAt(col);
                        GridMarket.Children.Remove(gs);
                        break;
                    }
                }
            }

            //Delete ControlMarket
            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    ControlMarket cm = (ControlMarket)child;


                    if (cm.StockNum == stockNum)
                    {
                        int col = Grid.GetColumn(cm);

                        GridMarket.Children.Remove(cm);
                        GridMarket.ColumnDefinitions.RemoveAt(col);
                        break;
                    }
                }
            }


            CheckStocksForButtDelDisable();
            ShowControlPanelOnRightStock(stockNum);
            SetWidthOfStocks();
        }
        /// <summary>
        /// Find ControlMarket with given number, remove it
        /// from viusal tree creates new one then add it to
        /// visual tree.
        ///
        /// </summary>
        /// <param name="stockNum"></param>
        /// <returns></returns>
        public ControlMarket ReplaceControlMarket(int stockNum)
        {
            ControlMarket mc = new ControlMarket(stockNum, this);

            Grid.SetRow(mc, 0);
            Grid.SetColumn(mc, 2 * stockNum);
            //NOTE +1 because 0 is ControlAlarm


            GridMarket.Children.RemoveAt(2 * stockNum);
            GridMarket.Children.Insert(2 * stockNum, mc);

            HideWindowControlPanels();

            SetWidthOfStocks();

            // CKernelTerminal.GetViewDispatcherInstance().UpdateZIndexes();
            // Canvas.SetZIndex(mc, 10 - stockNum);
            return(mc);
        }
        /// <summary>
        /// Disable button delete stock if stock is
        /// single
        /// </summary>
        public void CheckStocksForButtDelDisable()
        {
            int count = 0;

            ControlMarket cm = null;

            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    count++;
                    cm = (ControlMarket)child;
                }
            }
            if (count == 1)
            {
                if (cm != null)
                {
                    cm.DisableDeleteStock();
                }
            }
        }
        /// <summary>
        /// Set the width of stock depend if stock the rightest
        /// (with control menu) or not.
        /// For the rightest stock set width auto (width calculated,
        /// by content's width) and minimum width (to make all control
        /// elements visible on resizing), for the other stocks
        /// use * and sensible minimum width (to protect agains "silly"
        /// small width).
        /// Note, in grid using even number for ControlMarket and odd
        /// for the GridSplitter.
        ///
        /// Call from:
        /// 1) AddAllStocksFromConfig
        /// 2) AddStockFromButton
        /// 3) ReplaceControlMarket
        /// 4) DeleteStock
        /// </summary>
        public void SetWidthOfStocks()
        {
            int iStockVis = 0;

            int colCount = GridMarket.ColumnDefinitions.Count;

            //Set width of grid's columns
            //note, 0 - ControlMarket, 1 - splitter, etc, that's why increase by two
            for (int i = 0; i < GridMarket.ColumnDefinitions.Count; i += 2)
            {
                iStockVis++;

                var col = GridMarket.ColumnDefinitions[i];
                //for the rightest column
                if ((i == colCount - 2) && (colCount > 2)) //2017-03-22 upd if single stock nothing to do
                {
                    // col.Width = GridLength.Auto;
                    col.Width = new GridLength(1, GridUnitType.Star);//2018-05-03 change was auto
                    //col.Width = new GridLength(1, GridUnitType.Star);
                    // col.Width = new GridLength(widthOfControlMarket);//tempo 2018-05-02

                    //col.MinWidth = Math.Max(170, this.Width / (colCount / 2));
                    col.MinWidth = 100; //2018-05-03 change was calculated above
                    //col.MaxWidth = 1200;
                }
                else //for the other column
                {
                    col.Width = new GridLength(1, GridUnitType.Star);
                    //col.Width = new GridLength(widthOfControlMarket);//tempo 2018-05-02
                    col.MinWidth = 100;
                }
            }

            iStockVis = 0;
            int cntOfStocks = KernelTerminal.MaxStockNum;

            //Set width of ControlStocks
            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    ControlMarket cm = (ControlMarket)child;

                    double widthOfStock    = KernelTerminal.StockVisualConf.ListStocksVisual[iStockVis].WidthStock;
                    double widthOfClusters = KernelTerminal.StockVisualConf.ListStocksVisual[iStockVis].WidthClusters;

                    //the rightest ControlMarket (with window contol buttons)
                    if ((cm.StockNum == cntOfStocks) && (colCount > 2)) //2017-03-22 upd if single stock- nothing to do
                    {
                        //2017-11-16 changed for Alexeev's request
                        // - previously was 110
                        //cm.ColControlStock.MinWidth = 110;
                        cm.ColControlStock.MinWidth = 110; //2018-05-03 back
                        //TODO - make specific setting


                        //cm.ColControlStock.Width = new GridLength(1.0000001, GridUnitType.Star);
                        //cm.ColControlStock.Width = GridLength.Auto;
                        cm.ColControlStock.Width    = new GridLength(widthOfStock);//2018-05-02
                        cm.ColControlClusters.Width = new GridLength(widthOfClusters);

                        //cm.ColControlDeals.MinWidth = 30;
                        //cm.ColControlDeals.Width = GridLength.Auto;
                    }
                    //the other ControlMarkets
                    else
                    {
                        cm.ColControlStock.MinWidth = 30;
                        //cm.ColControlStock.Width = new GridLength(1, GridUnitType.Star);
                        cm.ColControlStock.Width    = new GridLength(widthOfStock); //2018-05-02
                        cm.ColControlClusters.Width = new GridLength(widthOfClusters);
                        // cm.ColControlStock.Width = new GridLength(226);
                    }


                    iStockVis++;
                }
            }



            foreach (var child in GridMarket.Children)
            {
                if (child is ControlMarket)
                {
                    ControlMarket cm = (ControlMarket)child;
                    cm.ControlStockInstance.IsInitializeComplete    = true;
                    cm.ControlClustersInstance.IsInitializeComplete = true;
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="controlMarket"></param>
        /// <param name="marketViewModel"></param>
        // TODO: separate parameters and bindings to other methods. Or/and remove settings
        public void BindToViewModel(ref ControlMarket controlMarket, MarketViewModel marketViewModel)
        {
            //========================================================================= MARKET VIEWMODEL BINDINGS ================================================================

            //bind ControlStockInstance
            controlMarket.ControlStockInstance.DataContext = marketViewModel;
            controlMarket.ControlStockInstance.BindToSystem(/*(ITradeOperations)marketViewModel*,*/ _kernelTerminal, marketViewModel.TickerName, _kernelTerminal.TerminalConfig.MaxRepaintTimeMS);
            marketViewModel.ForceRepaintControlStock = controlMarket.ControlStockInstance.ForceRepaint;



            CStockProperties sp = marketViewModel.InstrumentConfig.MarketProperties.StockProperties;

            CDataBinder.BindFromList(marketViewModel, controlMarket.ControlStockInstance, sp);



            CDealsProperties dp = new CDealsProperties();

            CDataBinder.BindFromList(marketViewModel, controlMarket.ControlDealsInstance, dp);

            CClusterProperties cp = marketViewModel.InstrumentConfig.MarketProperties.ClusterProperties;

            CDataBinder.BindFromList(marketViewModel, controlMarket.ControlClustersInstance, cp);

            //=========================================================================END  MARKET VIEWMODEL BINDINGS ================================================================



            controlMarket.ControlUserPosInstance.DataContext = marketViewModel.VMUserPos;


            // CUtil.SetBinding(marketViewModel, "ActualWidth", (FrameworkElement)controlMarket.ControlStockInstance, FrameworkElement.ActualWidthProperty);

            //specific binding
            CUserPosProperties upp = new CUserPosProperties();

            //CDataBinder.BindFromList(marketViewModel.VMUserPos, controlMarket.ControlStockInstance.DOUSerPos, upp);
            CDataBinder.BindAllFromViewModel(marketViewModel.VMUserPos, controlMarket.ControlStockInstance.DOUSerPos);



            controlMarket.DataContext = marketViewModel;

            //========================================================================= BIND CONTROL MARKETS PROPERTIES =====================================================================
            //trick: on binding value of controlMarket.StockNum(correct) overrides with value
            //of MarketViewModel (incorrect) so remember old value and set it after binding
            int stockNum = controlMarket.StockNum;

            CUtil.SetBinding(marketViewModel, "StockNum", controlMarket, ControlMarket.StockNumProperty, twoWayBinding: true);
            marketViewModel.StockNum = stockNum;

            CUtil.SetBinding(marketViewModel, "SelectionMode", controlMarket, ControlMarket.SelectionModeProperty, twoWayBinding: true);
            CUtil.SetBinding(marketViewModel, "IsModeKeyboardTrading", controlMarket, ControlMarket.IsModeKeyboardTradingProperty);

            //=========================================================================END  BIND CONTROL MARKETS PROPERTIES =====================================================================


            //======================================================================== BIND CLUSTER PROCESSOR ===================================================================================
            CUtil.SetBinding(marketViewModel.ClusterProcessor, "ClusterPriceAmount", controlMarket.ControlClustersInstance, ControlClusters.ClusterPriceAmountProperty);
            CUtil.SetBinding(marketViewModel.ClusterProcessor, "DisablePaintClusters", controlMarket.ControlClustersInstance, ControlClusters.DisablePaintClustersProperty);
            CUtil.SetBinding(marketViewModel.ClusterProcessor, "DisableRecalcClusters", controlMarket.ControlClustersInstance, ControlClusters.DisableRecalcClustersProperty);
            CUtil.SetBinding(marketViewModel.ClusterProcessor, "LstTimes", controlMarket.ControlClustersInstance, ControlClusters.LstTimesProperty);
            CUtil.SetBinding(marketViewModel.ClusterProcessor, "ClusterDate", controlMarket.ControlClustersInstance, ControlClusters.ClusterDateProperty);
            //=========================================================================END BIND CLUSTER PROCESSOR  ==========================================================================================================



            // ========================================================================== TERMINAL VIEWMODEL BINDINGS ===========================================================
            CTerminalCommonProperties tcp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalCommonProperties;


            CDataBinder.BindFromList(_kernelTerminal.ViewModelDispatcher.TerminalViewModel, controlMarket, tcp);

            //TODO move line up
            TerminalViewModel termViewModel = _kernelTerminal.ViewModelDispatcher.TerminalViewModel;

            CDataBinder.BindFromList(termViewModel, controlMarket.ControlStockInstance, tcp);
            CDataBinder.BindFromList(termViewModel, controlMarket.ControlDealsInstance, tcp);
            CDataBinder.BindFromList(termViewModel, controlMarket.ControlClustersInstance, tcp);


            CTerminalStockProperties tsp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalStockProperties;

            CDataBinder.BindFromList(termViewModel, controlMarket.ControlStockInstance, tsp);

            CTerminalDealsProperties tdp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalDealsProperties;

            CDataBinder.BindFromList(termViewModel, controlMarket.ControlDealsInstance, tdp);


            CTerminalClustersProperties tclstp = _kernelTerminal.TerminalConfig.TerminalProperties.TerminalClustersProperties;

            CDataBinder.BindFromList(termViewModel, controlMarket.ControlClustersInstance, tclstp);



            //controlMarket.StockClock.DataContext = termViewModel;
            CUtil.SetBinding(termViewModel, "StockClock", controlMarket.StockClock, TextBlock.TextProperty);

            //controlMarket.StockClock.


            // ============ =============================================================END TERMINAL VIEWMODEL BINDINGS ===========================================================



            controlMarket.ControlClustersInstance.UpdateSettings();
            controlMarket.ControlClustersInstance.InitFontSizeScaled();
            //


            controlMarket.ControlDealsInstance.BindToSystem(_kernelTerminal /*, (ITradeOperations)marketViewModel*/);

            BindWorkAmount(controlMarket, marketViewModel);

            //     EvntDispMarketViewModel e = new EvntDispMarketViewModel(marketViewModel);
        }
 private void SetParameters(ref ControlMarket controlMarket, MarketViewModel marketViewModel)
 {
     controlMarket.DataContext = marketViewModel;
 }
 /// <summary>
 /// Deletes existing ControlMarcket and adds new ControlMarkets.
 /// Use for "connected" Instrument
 ///
 /// Calling from CKernelTerminal.EditConnectedStock
 /// </summary>
 public void ReplaceControlMarket(int stockNum, ref ControlMarket controlMarket, MarketViewModel marketViewModel)
 {
     DeleteControlMarket(stockNum);
     AddControlMarket(controlMarket, marketViewModel);
 }
        public MarketViewModel(int stockNum, ControlMarket controlMain, CKernelTerminal kernelTerminal,
                               CStocksVisual stockVisual, CInstrumentConfig instrumentConfig)
        {
            StockNum = stockNum;
            string tickerName = stockVisual.Ticker;


            IsAlive = true;
            IsDead  = false;


            SelectionMode = new CSelectionMode();
            string tf = instrumentConfig.MarketProperties.ClusterProperties.TimeFrame;

            _clusterProcessor = new CClusterProcessor(tickerName, tf);
            _userLevels       = new CUserLevels(tickerName);


            _eventRouterViewModel = new CEventRouterViewModel(this);

            // int conId = stockVisual.ConNumm;



            _orders = new OrderData[Params.MaxUserOrdersPerInstr];



            _terminalViewModel = CViewModelDispatcher.GetTerminalViewModel();



            int parUpdateStockPerSec = kernelTerminal.TerminalConfig.UpdateStockPerSec;

            _parSleep = (int)(1 / (double)parUpdateStockPerSec * 1000);

            _instrumentConfig = instrumentConfig;

            //    (new Thread(TestPar)).Start();


            GUIDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;

            _controlMarket  = controlMain;
            _kernelTerminal = kernelTerminal;
            _communicator   = kernelTerminal.Communicator;

            //TextPriceSize = "10";
            //  StringHeight = "10";

            CurrAmountNum  = "0";
            ListWorkAmount = new List <CWorkAmount>();

            SetInstrumentParams(stockVisual);
            _vmUserPos = new ViewModelUserPos(Decimals, Step);



            _parMaxVolumeBar = Int32.MaxValue;

            //RaisePropertyChanged("Contract_ShortName");


            ConnId = stockVisual.ConNumm;// conId;



            MonitorUserOrders = new Dictionary <long, COrder>();


            if (tickerName != null)
            {
                _logger = new CLogger("MarketViewModel_" + tickerName);
            }

            Log("Start logging__________________________________________");



            InitBidsAsks();



            //TODO remove
            this.InitializeStockData();

            SetMouseMode(true);

            _threadDataReciever = new Thread(ThreadDataReciever);
            _threadDataReciever.Start();


            //BindWorkAmount();
        }
        /// <summary>
        /// Add columns to Grid and adds ControlMarket
        /// and GridSplitter to Grid.
        ///
        /// Call from:
        /// 1) KernelTerminal.AddAllStocksFromConfig
        /// 2) KernelTerminal.AddEmptyStockFromButton
        ///
        /// </summary>
        /// <param name="VisualConf">Params from config, if null (call from button)
        /// do use default params</param>
        private void CreateStockCell(int stockNum, string ticker, ControlMarket controlMarket, CStocksVisual visualConf = null)
        {
            ColumnDefinition colDef = new ColumnDefinition();

            colDef.Tag = "ColStock_" + stockNum;
            GridMarket.ColumnDefinitions.Add(colDef);

            /*
             * //2018-05-03
             * //Use default params - called from button
             * if (visualConf == null)
             * {
             *  double sumWidthStock = 0;
             *
             *  foreach (UIElement v in GridMarket.Children)
             *  {
             *
             *      if (v is ControlMarket)
             *      {
             *          ControlMarket currCM = (ControlMarket)v;
             *          foreach (var cd in   currCM.GridControlMarket.ColumnDefinitions)
             *          {
             *              if (cd.Name == "ColControlStock")
             *                  sumWidthStock += cd.ActualWidth;
             *
             *          }
             *
             *
             *      }
             *
             *  }
             *
             *
             *
             *
             *  //Stock Cell
             *  if (stockNum != 0)
             *  {
             *      controlMarket.GridControlMarket.ColumnDefinitions[4].Width =
             *          new GridLength(sumWidthStock / (stockNum));
             *
             *
             *  }
             *
             * }
             * else //use specific params - called from initialization (params from filr)
             * {
             *  //Clusters cell
             *  controlMarket.GridControlMarket.ColumnDefinitions[0].Width =
             *     new GridLength(visualConf.WidthClusters);
             *
             *  //Stock Cell
             *  controlMarket.GridControlMarket.ColumnDefinitions[4].Width =
             *      new GridLength(visualConf.WidthStock);
             * }
             */
            Grid.SetRow(controlMarket, 0);
            Grid.SetColumn(controlMarket, 2 * stockNum); //KAA changed 2017-03 was stockNum
            GridMarket.Children.Add(controlMarket);


            //2017-03-17 add splitter
            ColumnDefinition colSplitter = new ColumnDefinition();

            colSplitter.Width = GridLength.Auto;

            GridMarket.ColumnDefinitions.Add(colSplitter);


            GridSplitter splitter = new GridSplitter();

            splitter.Width               = 1.5;
            splitter.Background          = new SolidColorBrush(Colors.Blue);    //TODO DP
            splitter.HorizontalAlignment = HorizontalAlignment.Stretch;
            splitter.Tag = stockNum;
            Panel.SetZIndex(splitter, Int16.MaxValue);


            Grid.SetRow(splitter, 0);
            Grid.SetColumn(splitter, 2 * stockNum + 1);
            GridMarket.Children.Add(splitter);


            //  Canvas.SetZIndex(controlMarket, 10 - stockNum);
        }