// If your activity returns a value, derive from CodeActivity<TResult> // and return the value from the Execute method. protected override void Execute(CodeActivityContext context) { string symbol = context.GetValue(this.MySymbol); string strConn = this.MyConnString.Get(context); using (StockDBDataContext dbContext = new StockDBDataContext(strConn)) { dbContext.CommandTimeout = 120; StockSymbol sSymbol = (from s in dbContext.StockSymbols where s.Symbol == symbol select s).FirstOrDefault(); if(sSymbol == null) throw new ApplicationException("Cannot find Symbol: " + symbol); DateTime startDate = sSymbol.EndDate.HasValue ? sSymbol.EndDate.Value : new DateTime(1990,1,1); DateTime endDate = Helper.GetEndDate(DateTime.Now); while (startDate.DayOfWeek != DayOfWeek.Saturday) startDate = startDate.AddDays(-1); while (endDate.DayOfWeek != DayOfWeek.Saturday) endDate = endDate.AddDays(1); if (endDate > startDate) { var delQuotes = from s in dbContext.StockQuotes where s.Symbol == symbol && s.QuoteDate >= startDate && s.QuoteDate <= endDate select s; dbContext.StockQuotes.DeleteAllOnSubmit(delQuotes); dbContext.SubmitChanges(); //Dowload daily quotes first; then download weekly quotes for (int i = 0; i <= 1; i++) { TimeFrame timeFrame = TimeFrame.Day; if (i == 1) timeFrame = TimeFrame.Week; #region 1. Download Quotes string webAddress = "http://ichart.yahoo.com/table.csv?s=[%s]&a=[%m1]&b=[%d1]&c=[%y1]&d=[%m2]&e=[%d2]&f=[%y2]&g=[%Type]&ignore=.csv"; webAddress = webAddress.Replace("[%s]", symbol); webAddress = webAddress.Replace("[%m1]", (startDate.Month - 1).ToString()); webAddress = webAddress.Replace("[%d1]", startDate.Day.ToString()); webAddress = webAddress.Replace("[%y1]", startDate.Year.ToString()); webAddress = webAddress.Replace("[%m2]", (endDate.Month - 1).ToString()); webAddress = webAddress.Replace("[%d2]", endDate.Day.ToString()); webAddress = webAddress.Replace("[%y2]", endDate.Year.ToString()); string dateType = string.Empty; if (timeFrame == TimeFrame.Day) dateType = "d"; else if (timeFrame == TimeFrame.Week) dateType = "w"; webAddress = webAddress.Replace("[%Type]", dateType); List<string> lstQuote = HttpLib.GetHttpRespsonse(webAddress); if (lstQuote.Count > 0) { foreach (string strQuote in lstQuote) { string[] items = strQuote.Split(','); if (Microsoft.VisualBasic.Information.IsDate(items[0])) { StockQuote stockQuote = new StockQuote(); decimal close = Convert.ToDecimal(items[(int)QuoteOrder.ClosePrice]); decimal adjustClose = Convert.ToDecimal(items[(int)QuoteOrder.AdjustedClose]); decimal ratio = adjustClose / close; stockQuote.Symbol = symbol; stockQuote.QuoteDate = Convert.ToDateTime(items[(int)QuoteOrder.PriceDate]); stockQuote.OpenValue = Convert.ToDecimal(items[(int)QuoteOrder.OpenPrice]) * ratio; stockQuote.CloseValue = (Decimal)adjustClose; stockQuote.LowValue = Convert.ToDecimal(items[(int)QuoteOrder.LowPrice]) * ratio; stockQuote.HighValue = Convert.ToDecimal(items[(int)QuoteOrder.HighPrice]) * ratio; stockQuote.Volume = Convert.ToInt64 (items[(int)QuoteOrder.Volume]); stockQuote.TimeFrame = (short)timeFrame; dbContext.StockQuotes.InsertOnSubmit(stockQuote); } } dbContext.SubmitChanges(); } #endregion #region 2. Update Symbol's Start/End Date if (timeFrame == TimeFrame.Day) { StockSymbol symbolItem = (from s in dbContext.StockSymbols where s.Symbol == symbol select s).SingleOrDefault(); DateTime firstQuoteDate = (from q in dbContext.StockQuotes where q.Symbol == symbol && q.TimeFrame == (short)timeFrame orderby q.QuoteDate select q.QuoteDate).FirstOrDefault(); DateTime lastQuoteDate = (from q in dbContext.StockQuotes where q.Symbol == symbol && q.TimeFrame == (short)timeFrame orderby q.QuoteDate descending select q.QuoteDate).FirstOrDefault(); if (symbolItem != null) { try { symbolItem.StartDate = firstQuoteDate; symbolItem.EndDate = lastQuoteDate; dbContext.SubmitChanges(); } catch (Exception e) { } } } #endregion } } } }
private void detach_StockQuotes(StockQuote entity) { this.SendPropertyChanging(); entity.StockSymbol = null; }
partial void UpdateStockQuote(StockQuote instance);
partial void DeleteStockQuote(StockQuote instance);
partial void InsertStockQuote(StockQuote instance);