Example #1
0
        public void QueryOTCWarrant(DateTime receiveDate)
        {
            StockAnalyser analyser = new StockAnalyser();

            WebClient    client = new WebClient();
            MemoryStream ms     = new MemoryStream(client.DownloadData("http://www.otc.org.tw/ch/extend/warrant/dailyQ/wntQuts_download.php?t=D"));

            try
            {
                String       line   = "";
                StreamReader reader = new StreamReader(ms, Encoding.GetEncoding("Big5"));

                //attachment;filename=NEWWT_1030403.csv
                string disposition = client.ResponseHeaders["content-disposition"];

                String strDate = disposition.Split('_')[1].Substring(0, 7);

                receiveDate = DateTime.Parse(string.Format("{0}/{1}/{2}", int.Parse(strDate.Substring(0, 3)) + 1911, strDate.Substring(3, 2), strDate.Substring(5, 2)));

                // 103年04月03日 櫃檯買賣認購售權證收盤行情
                reader.ReadLine();

                //    0,           1,     2 ,      3,       4,      5,      6,     7,       8,              9,      10
                // 代號,	名稱,	開市價,	最高價,	最低價,	收市價,	漲跌,	成交量(股,)	筆數,	成交金額,	標的代號,	證券標的/指數收盤,	標的/指數漲跌
                reader.ReadLine();

                //"707825","國泰P6","3.76","3.76","3.76","3.76","0.06","1000","1","3760","4162","智擎 ","244","-2.5"
                while ((line = reader.ReadLine()) != null)
                {
                    String stockId, stockName;
                    //String[] dummy = line.Remove(line.Length - 1, 1).Replace("\",\"", "@").Split('@');
                    String[] dummy = line.Replace("\"", "").Split(',');

                    if (dummy.Length == 14)
                    {
                        stockId   = dummy[0];
                        stockName = dummy[1];
                        using (stockdbaEntities db = new stockdbaEntities())
                        {
                            if (db.Company.Where(o => o.stockId == stockId).Count() == 0)
                            {
                                db.Company.Add(new Company()
                                {
                                    stockId   = stockId,
                                    name      = stockName,
                                    initTime  = DateTime.Now,
                                    bzClass   = "",
                                    stockType = "上櫃權證"
                                });
                                db.SaveChanges();
                            }
                        }

                        // Basic Data
                        if (dummy[2].Contains('-') == false)
                        {
                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                if (db.DailySummary.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() == 0)
                                {
                                    db.DailySummary.Add(new DailySummary()
                                    {
                                        receiveDate = receiveDate,
                                        stockId     = stockId,
                                        tradeRec    = decimal.Parse(dummy[8]),
                                        tradeAmt    = decimal.Parse(dummy[9]),
                                        tradeQty    = decimal.Parse(dummy[7]),
                                        openPrice   = decimal.Parse(dummy[2]),
                                        highPrice   = decimal.Parse(dummy[3]),
                                        lowPrice    = decimal.Parse(dummy[4]),
                                        lastPrice   = decimal.Parse(dummy[5]),
                                    });
                                    db.SaveChanges();
                                }

                                if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() != 0)
                                {
                                    db.ServiceLog.Add(new ServiceLog()
                                    {
                                        updateTime = DateTime.Now, updateLog = String.Format("QueryOW:pass {0}", stockId)
                                    });
                                    db.SaveChanges();
                                    continue;
                                }
                            }

                            // Detail
                            StreamReader detailReader = new StreamReader(
                                new MemoryStream(
                                    client.DownloadData(
                                        String.Format("http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk={0}&stk_date={1}", stockId, strDate)
                                        )), Encoding.GetEncoding("Big5"));

                            //券商買賣證券成交價量資訊
                            detailReader.ReadLine();

                            //證券代碼,4946
                            detailReader.ReadLine();

                            //序號,券商,價格,買進股數,賣出股數,,序號,券商,價格,買進股數,賣出股數
                            detailReader.ReadLine();
                            //  0,           1,       2,      3,  4,5, 6,           7,       8,  9,    10
                            //"1","1020  合庫","111.00","2,000","0",,"2","1020  合庫","112.00","0","8,000"
                            while ((line = detailReader.ReadLine()) != null)
                            {
                                using (stockdbaEntities db = new stockdbaEntities())
                                {
                                    foreach (var item in line.Replace(",,", "@").Split('@'))
                                    {
                                        String[] detailDummy = item.Remove(item.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');
                                        Decimal  itemNo      = decimal.Parse(detailDummy[0]);

                                        if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId && o.no == itemNo).Count() == 0)
                                        {
                                            db.DailyDetail.Add(new DailyDetail()
                                            {
                                                receiveDate = receiveDate,
                                                stockId     = stockId,
                                                no          = itemNo,
                                                brokerId    = detailDummy[1].Split(' ')[0],
                                                value       = decimal.Parse(detailDummy[2]),
                                                buyVolume   = decimal.Parse(detailDummy[3]),
                                                sellVolume  = decimal.Parse(detailDummy[4])
                                            });
                                        }
                                    }
                                    db.SaveChanges();
                                }
                            }

                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                db.ServiceLog.Add(new ServiceLog()
                                {
                                    updateTime = DateTime.Now, updateLog = String.Format("QueryOW:{0}", stockId)
                                });
                                db.SaveChanges();
                            }

                            Thread.Sleep(1000);

                            // 結算
                            analyser.DoSettlement(receiveDate, stockId);
                            // 集中率
                            analyser.DoDailyRate(receiveDate, stockId, stockName);
                            analyser.DoWeeklyRate(receiveDate, stockId, stockName);
                            analyser.DoTotalRate(receiveDate, stockId, stockName);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                using (stockdbaEntities db = new stockdbaEntities())
                {
                    db.ServiceLog.Add(new ServiceLog()
                    {
                        updateTime = DateTime.Now, updateLog = String.Format("QueryOW:{0}", ex.Message)
                    });
                    db.SaveChanges();
                }
            }

            using (stockdbaEntities db = new stockdbaEntities())
            {
                db.ServiceLog.Add(new ServiceLog()
                {
                    updateTime = DateTime.Now, updateLog = String.Format("QueryOW:Done")
                });
                db.SaveChanges();
            }
        }
        void DoWeeklyRate(string receiveDate)
        {
            StockAnalyser analyser = new StockAnalyser();
            //analyser.DoWeeklyRate(DateTime.Parse(receiveDate));

            using (stockdbaEntities db = new stockdbaEntities())
            {
                DateTime sTime = DateTime.Parse(receiveDate);

                List<DateTime> dataList = new List<DateTime>();

                dataList.AddRange(db.DailySummary.Where(o => o.receiveDate >= sTime).GroupBy(o => o.receiveDate).Select(o => o.Key));
                foreach (var item in dataList)
                {
                    analyser.DoWeeklyRate(item);
                }
            }
        }
Example #3
0
        public void QueryOTC()
        {
            StockAnalyser analyser = new StockAnalyser();

            WebClient    client = new WebClient();
            MemoryStream ms     = new MemoryStream(client.DownloadData("http://www.otc.org.tw/ch/stock/aftertrading/DAILY_CLOSE_quotes/stk_quote_download.php"));

            try
            {
                String       line   = "";
                StreamReader reader = new StreamReader(ms, Encoding.GetEncoding("Big5"));

                //attachment;filename=RSTA3104_1030212.csv
                string disposition = client.ResponseHeaders["content-disposition"];

                String strDate = disposition.Split('_')[1].Substring(0, 7);

                DateTime receiveDate = DateTime.Parse(string.Format("{0}/{1}/{2}", int.Parse(strDate.Substring(0, 3)) + 1911, strDate.Substring(3, 2), strDate.Substring(5, 2)));

                // 上櫃股票行情
                reader.ReadLine();

                // 資料日期:
                reader.ReadLine();

                //    0,           1,     2 ,      3,       4,      5,      6,     7,       8,              9,      10
                // 代號,        名稱,  收盤 ,    漲跌,  開盤 ,  最高 ,   最低,  均價 ,成交股數  ,成交金額(元),成交筆數
                reader.ReadLine();

                // "006201","寶富櫃","11.75","-0.21 ","11.95","11.95","11.70","11.80","48,000","566,480","25",
                while ((line = reader.ReadLine()) != null)
                {
                    String   stockId, stockName;
                    String[] dummy = line.Remove(line.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');

                    if (dummy.Length == 17)
                    {
                        stockId   = dummy[0];
                        stockName = dummy[1];
                        using (stockdbaEntities db = new stockdbaEntities())
                        {
                            if (db.Company.Where(o => o.stockId == stockId).Count() == 0)
                            {
                                db.Company.Add(new Company()
                                {
                                    stockId   = stockId,
                                    name      = stockName,
                                    initTime  = DateTime.Now,
                                    bzClass   = "",
                                    stockType = "上櫃"
                                });
                                db.SaveChanges();
                            }
                        }

                        // Basic Data
                        if (dummy[2].Contains('-') == false)
                        {
                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                if (db.DailySummary.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() == 0)
                                {
                                    db.DailySummary.Add(new DailySummary()
                                    {
                                        receiveDate = receiveDate,
                                        stockId     = stockId,
                                        tradeRec    = decimal.Parse(dummy[10]),
                                        tradeAmt    = decimal.Parse(dummy[9]),
                                        tradeQty    = decimal.Parse(dummy[8]),
                                        openPrice   = decimal.Parse(dummy[4]),
                                        highPrice   = decimal.Parse(dummy[5]),
                                        lowPrice    = decimal.Parse(dummy[6]),
                                        lastPrice   = decimal.Parse(dummy[2]),
                                    });
                                    db.SaveChanges();
                                }

                                if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() != 0)
                                {
                                    db.ServiceLog.Add(new ServiceLog()
                                    {
                                        updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:pass {0}", stockId)
                                    });
                                    db.SaveChanges();
                                    continue;
                                }
                            }

                            // Detail
                            StreamReader detailReader = new StreamReader(
                                new MemoryStream(
                                    client.DownloadData(
                                        String.Format("http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk={0}&stk_date={1}", stockId, strDate)
                                        )), Encoding.GetEncoding("Big5"));

                            //券商買賣證券成交價量資訊
                            detailReader.ReadLine();

                            //證券代碼,4946
                            detailReader.ReadLine();

                            //序號,券商,價格,買進股數,賣出股數,,序號,券商,價格,買進股數,賣出股數
                            detailReader.ReadLine();
                            //  0,           1,       2,      3,  4,5, 6,           7,       8,  9,    10
                            //"1","1020  合庫","111.00","2,000","0",,"2","1020  合庫","112.00","0","8,000"
                            while ((line = detailReader.ReadLine()) != null)
                            {
                                using (stockdbaEntities db = new stockdbaEntities())
                                {
                                    foreach (var item in line.Replace(",,", "@").Split('@'))
                                    {
                                        String[] detailDummy = item.Remove(item.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');
                                        Decimal  itemNo      = decimal.Parse(detailDummy[0]);

                                        if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId && o.no == itemNo).Count() == 0)
                                        {
                                            db.DailyDetail.Add(new DailyDetail()
                                            {
                                                receiveDate = receiveDate,
                                                stockId     = stockId,
                                                no          = itemNo,
                                                brokerId    = detailDummy[1].Split(' ')[0],
                                                value       = decimal.Parse(detailDummy[2]),
                                                buyVolume   = decimal.Parse(detailDummy[3]),
                                                sellVolume  = decimal.Parse(detailDummy[4])
                                            });
                                        }
                                    }
                                    db.SaveChanges();
                                }
                            }

                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                db.ServiceLog.Add(new ServiceLog()
                                {
                                    updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:{0}", stockId)
                                });
                                db.SaveChanges();
                            }

                            Thread.Sleep(1000);

                            // 結算
                            analyser.DoSettlement(receiveDate, stockId);
                            // 集中率
                            analyser.DoDailyRate(receiveDate, stockId, stockName);
                            analyser.DoWeeklyRate(receiveDate, stockId, stockName);
                            analyser.DoTotalRate(receiveDate, stockId, stockName);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                using (stockdbaEntities db = new stockdbaEntities())
                {
                    db.ServiceLog.Add(new ServiceLog()
                    {
                        updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:{0}", ex.Message)
                    });
                    db.SaveChanges();
                }
            }

            using (stockdbaEntities db = new stockdbaEntities())
            {
                db.ServiceLog.Add(new ServiceLog()
                {
                    updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:Done")
                });
                db.SaveChanges();
            }
        }
 void DoDailyRate(string receiveDate)
 {
     StockAnalyser analyser = new StockAnalyser();
     analyser.DoDailyRate(DateTime.Parse(receiveDate));
 }
Example #5
0
        static void DetailQuery()
        {
            StockQuery worker = new StockQuery();
            StockAnalyser analyser = new StockAnalyser();

            DateTime receiveDate;
            List<DailyWork> workList = new List<DailyWork>();

            ParallelOptions option = new ParallelOptions();
            option.MaxDegreeOfParallelism = 10;

            int retryCnt = 0;
            Random rnd = new Random();

            while (true)
            {
                using (stockdbaEntities db = new stockdbaEntities())
                {
                    receiveDate = db.DailyWork.OrderByDescending(o => o.receiveDate).First().receiveDate;
                    workList.AddRange(db.DailyWork.Where(o => o.currentPage != o.totalPage && o.receiveDate == receiveDate));
                }

                if (workList.Count() > 0)
                {
                    Parallel.ForEach(workList, option, item =>
                    {
                        try
                        {
                            Thread.Sleep(rnd.Next(100, 1000));
                            for (int i = (int)item.currentPage + 1; i <= (int)item.totalPage; i++)
                            {
                                worker.QuerySinglePage(i, item.stockId);
                                using (stockdbaEntities db = new stockdbaEntities())
                                {
                                    db.DailyWork.Where(o => o.receiveDate == item.receiveDate && o.stockId == item.stockId).First().currentPage = i;
                                    db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = string.Format("Run:{0}:{1}/{2}", item.stockId, i, item.totalPage) });
                                    db.SaveChanges();

                                    Logger(string.Format("Run:{0}:{1}/{2}", item.stockId, i, item.totalPage));

                                    if (i == item.totalPage)
                                    {
                                        string stockName = "-";
                                        var obj = db.Company.Where(o => o.stockId == item.stockId).FirstOrDefault();
                                        if (obj != null)
                                        {
                                            stockName = obj.name;
                                        }
                                        // 結算
                                        analyser.DoSettlement(item.receiveDate, item.stockId);
                                        // 集中率
                                        analyser.DoDailyRate(item.receiveDate, item.stockId, stockName);
                                        analyser.DoWeeklyRate(item.receiveDate, item.stockId, stockName);
                                        analyser.DoTotalRate(item.receiveDate, item.stockId, stockName);

                                        Logger(string.Format("Run:{0}: Settlement", item.stockId));
                                    }
                                }
                                Thread.Sleep(10000);
                            }
                        }
                        catch (Exception ex)
                        {
                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("Run:{0}", ex.Message) });
                                db.SaveChanges();
                            }
                        }
                    });
                    workList.Clear();
                }
                else
                {
                    if (retryCnt < 60)
                    {
                        retryCnt++;
                        Thread.Sleep(60000); // 1min
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
Example #6
0
        private void RateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                DateTime sTime = (DateTime)e.Argument;

                StockAnalyser analyser = new StockAnalyser();
                List<DateTime> dataList = new List<DateTime>();

                RateWorker.ReportProgress(0, "Rate Start");

                using (stockdbaEntities db = new stockdbaEntities())
                {
                    dataList.AddRange(db.DailySummary.Where(o => o.receiveDate >= sTime).GroupBy(o => o.receiveDate).Select(o => o.Key));
                }

                foreach (var item in dataList)
                //Parallel.ForEach(dataList, item =>
                {
                    RateWorker.ReportProgress(0, item);

                    analyser.DoDailyRate(item);

                    analyser.DoWeeklyRate(item);

                    analyser.DoTotalRate(item);
                }//);

                RateWorker.ReportProgress(0, "Rate Done");
            }
            catch (Exception ex)
            {
                RateWorker.ReportProgress(0, ex.Message);
            }
        }
Example #7
0
        public void QueryOTCWarrant(DateTime receiveDate)
        {
            StockAnalyser analyser = new StockAnalyser();

            WebClient client = new WebClient();
            MemoryStream ms = new MemoryStream(client.DownloadData("http://www.otc.org.tw/ch/extend/warrant/dailyQ/wntQuts_download.php?t=D"));

            try
            {
                String line = "";
                StreamReader reader = new StreamReader(ms, Encoding.GetEncoding("Big5"));

                //attachment;filename=NEWWT_1030403.csv
                string disposition = client.ResponseHeaders["content-disposition"];

                String strDate = disposition.Split('_')[1].Substring(0, 7);

                receiveDate = DateTime.Parse(string.Format("{0}/{1}/{2}", int.Parse(strDate.Substring(0, 3)) + 1911, strDate.Substring(3, 2), strDate.Substring(5, 2)));

                // 103年04月03日 櫃檯買賣認購售權證收盤行情
                reader.ReadLine();

                //    0,           1,     2 ,      3,       4,      5,      6,     7,       8,              9,      10
                // 代號,	名稱,	開市價,	最高價,	最低價,	收市價,	漲跌,	成交量(股,)	筆數,	成交金額,	標的代號,	證券標的/指數收盤,	標的/指數漲跌
                reader.ReadLine();

                //"707825","國泰P6","3.76","3.76","3.76","3.76","0.06","1000","1","3760","4162","智擎 ","244","-2.5"
                while ((line = reader.ReadLine()) != null)
                {
                    String stockId, stockName;
                    //String[] dummy = line.Remove(line.Length - 1, 1).Replace("\",\"", "@").Split('@');
                    String[] dummy = line.Replace("\"", "").Split(',');

                    if (dummy.Length == 14)
                    {
                        stockId = dummy[0];
                        stockName = dummy[1];
                        using (stockdbaEntities db = new stockdbaEntities())
                        {
                            if (db.Company.Where(o => o.stockId == stockId).Count() == 0)
                            {
                                db.Company.Add(new Company()
                                {
                                    stockId = stockId,
                                    name = stockName,
                                    initTime = DateTime.Now,
                                    bzClass = "",
                                    stockType = "上櫃權證"
                                });
                                db.SaveChanges();
                            }
                        }

                        // Basic Data
                        if (dummy[2].Contains('-') == false)
                        {
                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                if (db.DailySummary.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() == 0)
                                {
                                    db.DailySummary.Add(new DailySummary()
                                    {
                                        receiveDate = receiveDate,
                                        stockId = stockId,
                                        tradeRec = decimal.Parse(dummy[8]),
                                        tradeAmt = decimal.Parse(dummy[9]),
                                        tradeQty = decimal.Parse(dummy[7]),
                                        openPrice = decimal.Parse(dummy[2]),
                                        highPrice = decimal.Parse(dummy[3]),
                                        lowPrice = decimal.Parse(dummy[4]),
                                        lastPrice = decimal.Parse(dummy[5]),
                                    });
                                    db.SaveChanges();
                                }

                                if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() != 0)
                                {
                                    db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOW:pass {0}", stockId) });
                                    db.SaveChanges();
                                    continue;
                                }
                            }

                            // Detail
                            StreamReader detailReader = new StreamReader(
                                new MemoryStream(
                                    client.DownloadData(
                                    String.Format("http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk={0}&stk_date={1}", stockId, strDate)
                                    )), Encoding.GetEncoding("Big5"));

                            //券商買賣證券成交價量資訊
                            detailReader.ReadLine();

                            //證券代碼,4946
                            detailReader.ReadLine();

                            //序號,券商,價格,買進股數,賣出股數,,序號,券商,價格,買進股數,賣出股數
                            detailReader.ReadLine();
                            //  0,           1,       2,      3,  4,5, 6,           7,       8,  9,    10
                            //"1","1020  合庫","111.00","2,000","0",,"2","1020  合庫","112.00","0","8,000"
                            while ((line = detailReader.ReadLine()) != null)
                            {
                                using (stockdbaEntities db = new stockdbaEntities())
                                {
                                    foreach (var item in line.Replace(",,", "@").Split('@'))
                                    {
                                        String[] detailDummy = item.Remove(item.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');
                                        Decimal itemNo = decimal.Parse(detailDummy[0]);

                                        if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId && o.no == itemNo).Count() == 0)
                                        {
                                            db.DailyDetail.Add(new DailyDetail()
                                            {
                                                receiveDate = receiveDate,
                                                stockId = stockId,
                                                no = itemNo,
                                                brokerId = detailDummy[1].Split(' ')[0],
                                                value = decimal.Parse(detailDummy[2]),
                                                buyVolume = decimal.Parse(detailDummy[3]),
                                                sellVolume = decimal.Parse(detailDummy[4])
                                            });
                                        }
                                    }
                                    db.SaveChanges();
                                }
                            }

                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOW:{0}", stockId) });
                                db.SaveChanges();
                            }

                            Thread.Sleep(1000);

                            // 結算
                            analyser.DoSettlement(receiveDate, stockId);
                            // 集中率
                            analyser.DoDailyRate(receiveDate, stockId, stockName);
                            analyser.DoWeeklyRate(receiveDate, stockId, stockName);
                            analyser.DoTotalRate(receiveDate, stockId, stockName);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                using (stockdbaEntities db = new stockdbaEntities())
                {
                    db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOW:{0}", ex.Message) });
                    db.SaveChanges();
                }
            }

            using (stockdbaEntities db = new stockdbaEntities())
            {
                db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOW:Done") });
                db.SaveChanges();
            }
        }
Example #8
0
        public void QueryOTC()
        {
            StockAnalyser analyser = new StockAnalyser();

            WebClient client = new WebClient();
            MemoryStream ms = new MemoryStream(client.DownloadData("http://www.otc.org.tw/ch/stock/aftertrading/DAILY_CLOSE_quotes/stk_quote_download.php"));

            try
            {
                String line = "";
                StreamReader reader = new StreamReader(ms, Encoding.GetEncoding("Big5"));

                //attachment;filename=RSTA3104_1030212.csv
                string disposition = client.ResponseHeaders["content-disposition"];

                String strDate = disposition.Split('_')[1].Substring(0, 7);

                DateTime receiveDate = DateTime.Parse(string.Format("{0}/{1}/{2}", int.Parse(strDate.Substring(0, 3)) + 1911, strDate.Substring(3, 2), strDate.Substring(5, 2)));

                // 上櫃股票行情
                reader.ReadLine();

                // 資料日期:
                reader.ReadLine();

                //    0,           1,     2 ,      3,       4,      5,      6,     7,       8,              9,      10
                // 代號,        名稱,  收盤 ,    漲跌,  開盤 ,  最高 ,   最低,  均價 ,成交股數  ,成交金額(元),成交筆數
                reader.ReadLine();

                // "006201","寶富櫃","11.75","-0.21 ","11.95","11.95","11.70","11.80","48,000","566,480","25",
                while ((line = reader.ReadLine()) != null)
                {
                    String stockId, stockName;
                    String[] dummy = line.Remove(line.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');

                    if (dummy.Length == 17)
                    {
                        stockId = dummy[0];
                        stockName = dummy[1];
                        using (stockdbaEntities db = new stockdbaEntities())
                        {
                            if (db.Company.Where(o => o.stockId == stockId).Count() == 0)
                            {
                                db.Company.Add(new Company()
                                {
                                    stockId = stockId,
                                    name = stockName,
                                    initTime = DateTime.Now,
                                    bzClass = "",
                                    stockType = "上櫃"
                                });
                                db.SaveChanges();
                            }
                        }

                        // Basic Data
                        if (dummy[2].Contains('-') == false)
                        {
                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                if (db.DailySummary.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() == 0)
                                {
                                    db.DailySummary.Add(new DailySummary()
                                    {
                                        receiveDate = receiveDate,
                                        stockId = stockId,
                                        tradeRec = decimal.Parse(dummy[10]),
                                        tradeAmt = decimal.Parse(dummy[9]),
                                        tradeQty = decimal.Parse(dummy[8]),
                                        openPrice = decimal.Parse(dummy[4]),
                                        highPrice = decimal.Parse(dummy[5]),
                                        lowPrice = decimal.Parse(dummy[6]),
                                        lastPrice = decimal.Parse(dummy[2]),
                                    });
                                    db.SaveChanges();
                                }

                                if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId).Count() != 0)
                                {
                                    db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:pass {0}", stockId) });
                                    db.SaveChanges();
                                    continue;
                                }
                            }

                            // Detail
                            StreamReader detailReader = new StreamReader(
                                new MemoryStream(
                                    client.DownloadData(
                                    String.Format("http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk={0}&stk_date={1}", stockId, strDate)
                                    )), Encoding.GetEncoding("Big5"));

                            //券商買賣證券成交價量資訊
                            detailReader.ReadLine();

                            //證券代碼,4946
                            detailReader.ReadLine();

                            //序號,券商,價格,買進股數,賣出股數,,序號,券商,價格,買進股數,賣出股數
                            detailReader.ReadLine();
                            //  0,           1,       2,      3,  4,5, 6,           7,       8,  9,    10
                            //"1","1020  合庫","111.00","2,000","0",,"2","1020  合庫","112.00","0","8,000"
                            while ((line = detailReader.ReadLine()) != null)
                            {
                                using (stockdbaEntities db = new stockdbaEntities())
                                {
                                    foreach (var item in line.Replace(",,", "@").Split('@'))
                                    {
                                        String[] detailDummy = item.Remove(item.Length - 1, 1).Remove(0, 1).Replace("\",\"", "@").Split('@');
                                        Decimal itemNo = decimal.Parse(detailDummy[0]);

                                        if (db.DailyDetail.Where(o => o.receiveDate == receiveDate && o.stockId == stockId && o.no == itemNo).Count() == 0)
                                        {
                                            db.DailyDetail.Add(new DailyDetail()
                                            {
                                                receiveDate = receiveDate,
                                                stockId = stockId,
                                                no = itemNo,
                                                brokerId = detailDummy[1].Split(' ')[0],
                                                value = decimal.Parse(detailDummy[2]),
                                                buyVolume = decimal.Parse(detailDummy[3]),
                                                sellVolume = decimal.Parse(detailDummy[4])
                                            });
                                        }
                                    }
                                    db.SaveChanges();
                                }
                            }

                            using (stockdbaEntities db = new stockdbaEntities())
                            {
                                db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:{0}", stockId) });
                                db.SaveChanges();
                            }

                            Thread.Sleep(1000);

                            // 結算
                            analyser.DoSettlement(receiveDate, stockId);
                            // 集中率
                            analyser.DoDailyRate(receiveDate, stockId, stockName);
                            analyser.DoWeeklyRate(receiveDate, stockId, stockName);
                            analyser.DoTotalRate(receiveDate, stockId, stockName);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                using (stockdbaEntities db = new stockdbaEntities())
                {
                    db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:{0}", ex.Message) });
                    db.SaveChanges();
                }
            }

            using (stockdbaEntities db = new stockdbaEntities())
            {
                db.ServiceLog.Add(new ServiceLog() { updateTime = DateTime.Now, updateLog = String.Format("QueryOTC:Done") });
                db.SaveChanges();
            }
        }