コード例 #1
0
        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);
             * }
             */
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        public void Update(int prec, decimal price, long count, decimal amount)
        {
            _perf.UpdStart();
            Direction dir = Direction.Up;

            CCmdStockChange cmd = new CCmdStockChange
            {
                Price = price
            };

            if (count > 0)
            {
                //  if (count == 1)
                //   System.Threading.Thread.Sleep(0);

                UpdateOrInsert(prec, price, amount, ref cmd, ref dir);
            }
            else if (count == 0)
            {
                dir = (amount == 1) ? Direction.Down : Direction.Up;
                _store[prec][dir].RemoveAll(el => el.Price == price);
                Log(prec, String.Format("{0} price={1} dir={2}", "==> remove", price, dir));
                //2018-06-27 perfomance
                PrintStock(prec);

                cmd.Code = EnmStockChngCodes._03_Remove;
            }

            UpdateClientStockOneDir(dir, prec, cmd);

            _perf.UpdEnd(prec);
        }
コード例 #4
0
        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);
        }