public void InitRawStocks() { for (int i = 0; i < m_stockDepth; i++) { RawStocks[i] = new CRawStock(); } }
public CStockConverterP2(int stockDept, string isin, IClientStockConverter client) : base(stockDept, isin, client) { InpSnapshotRawStocks = new CRawStock[stockDept]; m_dirStock = new CSharedStocks(client); for (int i = 0; i < _stockDepth; i++) { InpSnapshotRawStocks[i] = new CRawStock(); } (new Thread(ThreadStockConverter)).Start(); }
//FORTS update public void UpdateStock(CRawStock rs) { try { string isin = _client.Instruments.GetInstrumentByIsinId(rs.Isin_id); m_stocksStructDict[isin].Add(rs); } catch (Exception e) { string err = "Unable to update stockbox. Message="; Log(err + e.Message + " stacktrace=" + e.StackTrace); Error(err, e); } }
public CStockConverter(int stockDept, string isin, CPlaza2Connector plaza2Connector) { _stockDepth = stockDept; Isin = isin; m_plaza2Connector = plaza2Connector; InpRawStocks = new CRawStock[stockDept]; m_dirStock = new CSharedStocks(stockDept); for (int i = 0; i < _stockDepth; i++) { InpRawStocks[i] = new CRawStock(); } (new Thread(ThreadStockConverter)).Start(); }
//FORTS update public void SimUpdateStock(CRawStock rs) { try { string isin = _client.Instruments.GetInstrumentByIsinId(rs.Isin_id); //TODO normal //if (m_stocksStructDict.ContainsKey(isin)) m_stocksStructDict[isin].Add(rs); } catch (Exception e) { string err = " SimUpdateStock"; Log(err + e.Message + " stacktrace=" + e.StackTrace); Error(err, e); } }
private void ParseStockLine(string st) { if (!st.Contains("replID")) { return; } DateTime dt = GetDateTimeDoub(st); CRawStock rawStock = GetRawStock(st); _listData.Add(new CDataElement() { Dt = dt, RawStock = rawStock } ); }
private CRawStock GetRawStock(string st) { CRawStock rs = new CRawStock(); rs.Volume = GetVolume(st); rs.Moment = GetDateTimeP2(st); rs.Isin_id = GetIsinId(st); string[] res = st.Split(' '); foreach (var s in res.ToList()) { string[] r = s.Split('='); if (r.Length <= 1) { continue; } if (r[0].Contains("replID")) { rs.ReplID = Convert.ToInt64(r[1]); } else if (r[0].Contains("replRev")) { rs.ReplRev = Convert.ToInt64(r[1]); } else if (r[0].Contains("dir")) { rs.Dir = Convert.ToSByte(r[1]); } else if (r[0].Contains("price")) { rs.Price = Convert.ToDecimal(r[1]); } } return(rs); }
/// <summary> /// Main thread func. /// /// 1)Collects stocks in "Plaza 2" format. /// This is in fact table of data records /// (price, dir, volume) with primary key ReplId /// ///2) Periodically copies snapshot to InpRawStocks of Stockprocessor /// </summary> private void ThreadFunc() { m_logger = new CLogger("Stock_" + Isin, flushMode: false, subDir: "Stock", useMicroseconds: true); m_loggerQueue = new CLogger("StockQueue_" + Isin, flushMode: false, subDir: "StockQueue", useMicroseconds: true); CBotHelper.PrintBanner(m_logger, "START STOCK DEBUGGING"); DateTime dtLastAlarm = new DateTime(0); Stopwatch sw = new Stopwatch(); InitRawStocks(); //TODO get from config int parStockRefreshInt = Convert.ToInt16(m_plaza2Connector.GlobalConfig.StockRefreshInterval); //20 int parMaxStockQueue = Convert.ToInt32(m_plaza2Connector.GlobalConfig.StockRefreshInterval); // 20; // time to refresh output data while (true) { //Action value = m_bqActions.GetElementBlocking(); // bNeedForceStockUpdate = false; Log("Before .GetElementBlocking"); CRawStock rs = m_bqOrdersAggr.GetElementBlocking(); if (NeedReInitStock) { InitRawStocks(); string msgReinit = "Reinit stock " + Isin; Log(msgReinit); Error(msgReinit); NeedReInitStock = false; } sw.Reset(); sw.Start(); Log("____b___________________________________________", sw); if (m_bqOrdersAggr.Count > _parStockStructMaxQueueSize && m_plaza2Connector.IsStockOnline && (DateTime.Now - dtLastAlarm).Seconds > 5) { // ST = m_plaza2Connector.ServerTime.ToString(); string mes = "m_bqOrdersAggr.Count more than max Count =" + m_bqOrdersAggr.Count + " Isin=" + Isin; Error(mes); Log(mes); int tmp = 1; dtLastAlarm = DateTime.Now; } string msg = "m_bqOrdersAggr.Count =" + m_bqOrdersAggr.Count; Log(msg, sw); m_loggerQueue.Log(msg); Direction DirStock = (rs.Dir == 2) ? Direction.Up : Direction.Down; int i = 0; bool bFound = false; try { /* Iterate RawStocks update record in table * if replid exist update record, else add new record */ for (i = 0; i < m_stockDepth; i++) { //if replid already exists just update it if (RawStocks[i].ReplID == rs.ReplID) { RawStocks[i] = rs; bFound = true; break; } //empty ReplID, new data exit else if (RawStocks[i].ReplID == 0) { break; } } //if replid is not exist add new one if (i < m_stockDepth && !bFound) { RawStocks[i] = rs; //for catching error - remove if (i > 100) { string m = "Added new ReplId=" + RawStocks[i].ReplID; Error(m); m_loggerQueue.Log(m); } } //Oops. Replid is not found and stock is more than max //(possible on evening session of FORTS) else if (i >= m_stockDepth && !bFound) { Error("i >= m_stockDepth && !bFound. Trigger reinit stock"); NeedReInitStock = true; } } catch (Exception e) { Error("Error in filing RawStocks", e); } Log("RawStocks processed", sw); double dt = (DateTime.Now - _dtLastUpdate).TotalMilliseconds; //Periodically copy data to snapshot of StockProcessor. //After copying tell StockProcessor to process new data; if (dt > parStockRefreshInt || m_bqOrdersAggr.Count < parMaxStockQueue) { lock (_stockConverter.LckInpRawStocks) { try { for (i = 0; i < m_stockDepth; i++) { _stockConverter.InpSnapshotRawStocks[i].Update(RawStocks[i]); } } catch (Exception e) { Error("RawStocks to InpRawStocks processed", e); } } _stockConverter.TriggerPeriodicUpdate(); _dtLastUpdate = DateTime.Now; Log("RawStocks to InpRawStocks processed", sw); } Log("____e___________________________________________", sw); sw.Stop(); Log(""); } }
/// <summary> /// Add new Raw stock /// </summary> /// <param name="rs"></param> public void Add(CRawStock rs) { m_bqOrdersAggr.Add(rs); }
//SPOT and currency update public void UpdateStock(string instrument, CRawStock rs) { m_stocksStructDict[instrument].Add(rs); }