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(); } }
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 DoDailyRate(string receiveDate) { StockAnalyser analyser = new StockAnalyser(); analyser.DoDailyRate(DateTime.Parse(receiveDate)); }
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; } } } }
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); } }