public void UpdateOrInsert(int prec, decimal price, decimal amount,
                                   ref CCmdStockChange cmd, ref Direction dir)
        {
            dir = (amount > 0) ? Direction.Down : Direction.Up;


            decimal amountAbs = Math.Abs(amount);

            cmd.Volume = CUtilConv.GetIntVolume(amountAbs, _decimalVolume);

            for (int i = 0; i < _store[prec][dir].Count; i++)
            {
                if (_store[prec][dir][i].Price == price)
                {
                    _store[prec][dir][i].Amount = amountAbs;
                    Log(prec, String.Format("{0} price={1} amount={2}", "==> update", price, amountAbs));
                    //2018-06-27 perfomance
                    // PrintStock(prec);

                    cmd.Code = EnmStockChngCodes._04_Update;


                    return;
                }
            }



            //cmd.Code = dir


            Log(prec, String.Format("{0} price={1} amount={2}", "==> add", price, amountAbs));
            _store[prec][dir].Add(new CBfxStockRec {
                Price = price, Amount = Math.Abs(amountAbs)
            });
            Sort(prec, dir);

            cmd.Code = EnmStockChngCodes._02_Add;



            //2018-06-27 perfomance
            //PrintStock(prec);


            /*  CBfxStockRec rec =  this[dir].Find(el => el.Price == price);
             * if (rec == null)
             * {
             *    Log(String.Format("{0} price={1} amount={2}", "==> add", price, amount));
             *    this[dir].Add(new CBfxStockRec { Price = price, Amount = Math.Abs(amount) });
             *    Sort(dir);
             * }
             * else
             * {
             *     Log(String.Format("{0} price={1} amount={2}", "==> update", price, amount));
             *
             *    rec.Amount = Math.Abs(amount);
             * }
             */
        }
        private void UpdateClientStockOneDir(Direction dir,
                                             int precision, CCmdStockChange cmdSockChange)
        {
            lock (_outStock)
            {
                for (int j = 0; j < _store[precision][dir].Count; j++)
                {
                    try
                    {
                        _outStock[dir][precision][j].Price  = _store[precision][dir][j].Price;
                        _outStock[dir][precision][j].Volume = CUtilConv.GetIntVolume(_store[precision][dir][j].Amount, _decimalVolume);
                    }
                    catch (Exception exc)
                    {
                        _client.Error("CbfxStockStor.UpdateClientStockOneDir", exc);
                    }
                }

                for (int i = _store[precision][dir].Count;
                     i < _outStock.Count - _store[precision][dir].Count; i++)
                {
                    _outStock[dir][precision][i].Price  = 0;
                    _outStock[dir][precision][i].Volume = 0;
                }



                _outStock.InpCmdStockChange[dir][precision] = cmdSockChange;

                _outStock.UpdateBidAsk();

                _client.UpdateClientStockOneDir(_instrument, dir, precision, _outStock);
            }
        }
        private void UpdateClientStockBothDir(int precision, CCmdStockChange cmdSockChange)
        {
            lock (_outStock)
            {
                foreach (Direction dir in Enum.GetValues(typeof(Direction)))
                {
                    for (int j = 0; j < _store[precision][dir].Count; j++)
                    {
                        try
                        {
                            _outStock[dir][precision][j].Price  = _store[precision][dir][j].Price;
                            _outStock[dir][precision][j].Volume = CUtilConv.GetIntVolume(_store[precision][dir][j].Amount, _decimalVolume);
                        }
                        catch (Exception exc)
                        {
                            _client.Error("CbfxStockStor.UpdateClientStockBothDir", exc);
                        }
                    }
                }

                _outStock.InpCmdStockChange[Direction.Up][precision]   = cmdSockChange;
                _outStock.InpCmdStockChange[Direction.Down][precision] = cmdSockChange;
            }

            _outStock.UpdateBidAsk();

            _client.UpdateCleintStockBothDir(_instrument, precision, _outStock);
        }
        private void DrawClusterPriceBarBg(/*double price, int amount*/ CCluster clusterData, double y, DateTime dtInterval, double actualWidthClusterGrid)
        {
            GenClusterBrushPen(clusterData, dtInterval);

            //calculate width of cluster bar
            long dealsAmountFullBar = CUtilConv.GetIntVolume(Math.Max(_dealsAmountFullBar, 1), _decimalVolume);//zero devide protect

            _volumeRectWidth = (((double)clusterData.AmountTotal) / ((double)dealsAmountFullBar)) * actualWidthClusterGrid;
            //draw cluster bar with proportional width
            //DrawRectangle(_brushCluster, _penCluster, new Rect(0.0, y, _volumeRectWidth, (double)_stirngHeight));
            _drwCntxtClustersBg.DrawRectangle(_brushCluster, _penCluster, new Rect(0.0, y, _volumeRectWidth, (double)_stirngHeight));


            //   FormattedText(text, _cultureInfoDefault, FlowDirection.LeftToRight, _typeFaceDefault, _fontSizeScaled, brush);

            //2018-02-21
            string stAmount = CTerminalUtil.GetAmount(clusterData.AmountTotal, _decimalVolume);



            //print cluster amount
            //DrawText(_FrmTxtCurrClustAmount, new Point(0.0, y));
            //KAA 2017-03-01 changed to Glyph
            //2018-05-01 changed to fontsizeScaled
            GlyphRun gr = _glyphGenBg.GetGlyph(0, y + _fontSizeScaled,
                                               _fontSizeScaled,
                                               " " + /*clusterData.AmountTotal.ToString()*/ stAmount);

            _drwCntxtClustersBg.DrawGlyphRun(_brushFontBg, gr);
        }
        public override int GetGUITradeSystemVolume(string instrument, string inpVolume)
        {
            decimal decVol    = Convert.ToDecimal(inpVolume);
            int     decVolume = GetDecimalVolume(instrument);
            int     intVolume = (int)CUtilConv.GetIntVolume(decVol, decVolume);

            return(intVolume);
        }
        private void ProcessTradeExecute(string inpInstrWithPrefix, JArray jarrTe)
        {
            string instrument = CBfxUtils.RemoveFirstT(inpInstrWithPrefix);


            int decimalVolume = GetDecimalVolume(instrument);

            long    lngMilis      = (long)jarrTe[1];
            decimal dcmlAmountRaw = (decimal)jarrTe[2];
            decimal dcmlAmount    = Math.Abs(dcmlAmountRaw);
            decimal dcmlPrice     = (decimal)jarrTe[3];



            long amount = CUtilConv.GetIntVolume(dcmlAmount, decimalVolume);

            //2018-02-22
            //Amount is too small. Not possible to understand how it
            //could be. Was seen on LTC. For now just ignore these trades
            if (amount == 0)
            {
                return;
            }



            DateTime dt = CUtilTime.DateTimeFromUnixTimestampMillis(lngMilis);


            CRawDeal rd = new CRawDeal {
                Amount = amount,
                Price  = dcmlPrice,
                Moment = dt
            };



            if (dcmlAmountRaw > 0)
            {
                rd.Id_ord_buy = 1;
            }
            else
            {
                rd.Id_ord_sell = 1;
            }

            _client.UpdateDeal(instrument, rd);

            /*  DateTime dtCurr = DateTime.Now;
             * double ddt = (dtCurr - dt).TotalSeconds;
             *
             * if (ddt != 00)
             *    Thread.Sleep(0);
             *
             */
        }
Beispiel #7
0
        public void TestGetIntVolume()
        {
            //BTC
            //8432,4 0,01|8433,9 0,04404|8437 0,003|8438,6 0,1|8440,5 1|8440,7 1|8440,9 0,65399871|8441 9,11|8443 0,3|8443,
            Assert.AreEqual(760, CUtilConv.GetIntVolume(0.76016001m, 3));
            Assert.AreEqual(10, CUtilConv.GetIntVolume(0.01m, 3));
            Assert.AreEqual(44, CUtilConv.GetIntVolume(0.044m, 3));
            Assert.AreEqual(100, CUtilConv.GetIntVolume(0.1m, 3));
            Assert.AreEqual(654, CUtilConv.GetIntVolume(0.65399871m, 3));

            //TRXUSD 3546,8412
            Assert.AreEqual(3547, CUtilConv.GetIntVolume(3546.8412m, 0));

            //LTUSD  158,25 0,5853136|158,37 15|158,38 16,5|
            Assert.AreEqual(59, CUtilConv.GetIntVolume(0.5853136m, 2));
            Assert.AreEqual(1500, CUtilConv.GetIntVolume(15m, 2));
            Assert.AreEqual(1650, CUtilConv.GetIntVolume(16.5m, 2));
        }