/// <summary> /// входящие тики из системы /// </summary> private void AddTick(OsEngine.Entity.Trade trade) { try { BathTradeMarketDepthData(trade); // сохраняем if (_allTrades == null) { _allTrades = new List <OsEngine.Entity.Trade> [1]; _allTrades[0] = new List <OsEngine.Entity.Trade> { trade }; } else { // сортируем сделки по хранилищам List <OsEngine.Entity.Trade> myList = null; bool isSave = false; for (int i = 0; i < _allTrades.Length; i++) { if (_allTrades[i] != null && _allTrades[i].Count != 0 && _allTrades[i][0].SecurityNameCode == trade.SecurityNameCode) { // если для этого инструметна уже есть хранилище, сохраняем и всё _allTrades[i].Add(trade); myList = _allTrades[i]; isSave = true; break; } } if (isSave == false) { // хранилища для инструмента нет List <OsEngine.Entity.Trade>[] allTradesNew = new List <OsEngine.Entity.Trade> [_allTrades.Length + 1]; for (int i = 0; i < _allTrades.Length; i++) { allTradesNew[i] = _allTrades[i]; } allTradesNew[allTradesNew.Length - 1] = new List <OsEngine.Entity.Trade>(); allTradesNew[allTradesNew.Length - 1].Add(trade); myList = allTradesNew[allTradesNew.Length - 1]; _allTrades = allTradesNew; } _tradesToSend.Enqueue(myList); } } catch (Exception error) { SendLogMessage(error.ToString(), LogMessageType.Error); } }
// сохранение расширенных данных по трейду /// <summary> /// прогрузить трейды данными стакана /// </summary> private void BathTradeMarketDepthData(OsEngine.Entity.Trade trade) { MarketDepth depth = _marketDepths.Find(d => d.SecurityNameCode == trade.SecurityNameCode); if (depth == null || depth.Asks == null || depth.Asks.Count == 0 || depth.Bids == null || depth.Bids.Count == 0) { return; } trade.Ask = depth.Asks[0].Price; trade.Bid = depth.Bids[0].Price; trade.BidsVolume = depth.BidSummVolume; trade.AsksVolume = depth.AskSummVolume; }