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); } }
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); }
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); }