/// <summary>
        /// Call when connection with server established, auth past and
        /// server sent ticker's data.
        /// </summary>
        /// <param name="tickerData"></param>
        public void UpdateInstrParamsOnConnection(CTIckerData tickerData)
        {
            //removed 2018-06-25

            /*	if (tickerData.Decimals != Decimals)
             *              Decimals = tickerData.Decimals;
             *
             *      if ((double) tickerData.Step != Step)
             *              Step = (double)tickerData.Step;
             */
            if (tickerData.DecimalVolume != DecimalVolume)
            {
                DecimalVolume = tickerData.DecimalVolume;
            }



            CStocksVisual sv = new CStocksVisual
            {
                Decimals = Decimals,
                ConNumm  = ConnId,
                Step     = Step,
                Ticker   = TickerName
            };


            _kernelTerminal.UpdateStockVisualInstrumentParams(StockNum, sv);
            SaveInstrumentConfig();
        }
        /// <summary>
        /// Call when instrument parameter changed (for example Decimals)
        /// during trading. Mostly for bitfinex.
        ///
        /// Call from  CKernelTerminal.ProcessUserUpdateAvailableTickers
        /// </summary>
        /// <param name="updInstrParams"></param>
        public void UpdateInstrumentParamsOnline(CUpdateInstrumentParams updInstrParams)
        {
            //removed 2018-06-25
            //if (updInstrParams.Decimals != Decimals)
            //Decimals = updInstrParams.Decimals;

            //if ((double) updInstrParams.Min_step !=  Step)
            //Step = (double) updInstrParams.Min_step;

            if (updInstrParams.DecimalVolume != DecimalVolume)
            {
                DecimalVolume = updInstrParams.DecimalVolume;
            }



            CStocksVisual sv = new CStocksVisual
            {
                Decimals = Decimals,
                ConNumm  = ConnId,
                Step     = Step,
                Ticker   = TickerName
            };


            _kernelTerminal.UpdateStockVisualInstrumentParams(StockNum, sv);
            SaveInstrumentConfig();
        }
        /// <summary>
        /// Call from:
        ///
        /// 1)MarketViewModel Constructor
        /// 2)CKernelTerminal.EditConnectedStock
        /// </summary>
        /// <param name="stockVisual"></param>
        public void SetInstrumentParams(CStocksVisual stockVisual)
        {
            //m_sContract_ShortName = stockVisual.Ticker;



            TickerName = stockVisual.Ticker;
            //_tickerName = stockVisual.Ticker;

            Decimals = stockVisual.Decimals;
            Step     = stockVisual.Step;
        }
        private void SaveInstrumentParams()
        {
            CUtil.TaskStart(SaveInstrumentConfig);

            CStocksVisual sv = new CStocksVisual
            {
                Decimals = Decimals,
                ConNumm  = ConnId,
                Step     = Step,
                Ticker   = TickerName
            };


            _kernelTerminal.UpdateStockVisualInstrumentParams(StockNum, sv);
        }
        /// <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);
            }
        }
        /// <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;
                }
            }
        }
        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);
        }