예제 #1
0
 public void InitRawStocks()
 {
     for (int i = 0; i < m_stockDepth; i++)
     {
         RawStocks[i] = new CRawStock();
     }
 }
예제 #2
0
        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();
        }
예제 #3
0
 //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);
     }
 }
예제 #4
0
        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();
        }
예제 #5
0
        //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);
            }
        }
예제 #6
0
        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
            }
                          );
        }
예제 #7
0
        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);
        }
예제 #8
0
        /// <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("");
            }
        }
예제 #9
0
 /// <summary>
 /// Add new Raw stock
 /// </summary>
 /// <param name="rs"></param>
 public void Add(CRawStock rs)
 {
     m_bqOrdersAggr.Add(rs);
 }
예제 #10
0
 //SPOT and currency update
 public void UpdateStock(string instrument, CRawStock rs)
 {
     m_stocksStructDict[instrument].Add(rs);
 }