public void ProcessData(StockInfo si, StockPerf perfData) { string id = string.Format("{0}_{1}", si.Id, perfData.Date.ToString("yyyyMMdd")); StockPerf dbVal = stockDBContext.StockPerfs.Find(id); if (dbVal == null) { dbVal = new StockPerf(); dbVal.Id = id; dbVal.StockId = si.Id; stockDBContext.StockPerfs.Add(dbVal); dbVal.CreatedOn = DateTime.Now; } dbVal.Date = perfData.Date; dbVal.Open = perfData.Open; dbVal.Close = perfData.Close; dbVal.LastClose = perfData.LastClose; dbVal.High = perfData.High; dbVal.Low = perfData.Low; dbVal.Change = perfData.Change; dbVal.ChangePercentage = perfData.ChangePercentage; dbVal.Volume = perfData.Volume; dbVal.Amount = perfData.Amount; dbVal.TurnoverRate = perfData.TurnoverRate; dbVal.ModifiedOn = DateTime.Now; if (!si.Date.HasValue || dbVal.Date.CompareTo(si.Date) > 0) { si.Date = dbVal.Date; si.Price = dbVal.Close; si.ModifiedOn = DateTime.Now; log.InfoFormat("Update stock info({0}) by perf data", si); } }
public override void ProcessData(StockInfo stockInfo) { var lastPerf = this.stockDBContext.StockPerfs.Where(f => f.StockId.Equals(stockInfo.Id)).OrderByDescending(f => f.Date).FirstOrDefault(); DateTime?startDate = null; if (lastPerf != null) { startDate = lastPerf.Date.AddDays(1); } var navs = this.api.GetFundNAVData(stockInfo.Symbol, startDate, null); foreach (var nav in navs) { DateTime dt = DateTime.Now; if (DateTime.TryParse(nav.Date, out dt)) { string key = $"{stockInfo.Id}_{dt.ToString("yyyyMMdd")}"; StockPerf perfNav = this.stockDBContext.StockPerfs.Find(key); bool exist = perfNav != null; if (perfNav == null) { perfNav = new StockPerf() { Id = key, StockId = stockInfo.Id, Date = dt }; this.stockDBContext.StockPerfs.Add(perfNav); } perfNav.Close = decimal.Parse(nav.NAV); perfNav.ModifiedOn = DateTime.Now; } } this.stockDBContext.SaveChanges(); }
public async Task <IActionResult> Create([Bind("Id,MasterPortfolioId,StockId,Weight")] PortfolioHolding portfolioHolding) { MasterPortfolio mp = _context.MasterPortfolios.Find(portfolioHolding.MasterPortfolioId); StockInfo si = _context.StockInfos.Find(portfolioHolding.StockId); if (mp == null || si == null) { return(View(portfolioHolding)); } string key = String.Format("{0}_{1}", si.Id, mp.Date.ToString("yyyyMMdd")); StockPerf price = _context.StockPerfs.Find(key); if (price == null) { return(View(portfolioHolding)); } if (ModelState.IsValid) { portfolioHolding.ModifiedOn = portfolioHolding.CreatedOn = DateTime.Now; portfolioHolding.Shares = (int)Math.Floor(portfolioHolding.Weight.Value * mp.BaseAmount.Value / price.Close.Value / 100 / 100) * 100;//整手 portfolioHolding.ActualWeight = 100 * portfolioHolding.Shares * price.Close.Value / mp.BaseAmount; _context.Add(portfolioHolding); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(portfolioHolding)); }
public override void ProcessData(StockInfo data) { string symbol = "cn_" + data.Symbol; if (data.Type == StockType.Index) { symbol = "zs_" + data.Symbol; } StockPerf lastPerf = stockDBContext.StockPerfs.Where(p => p.StockId == data.Id).OrderByDescending(p => p.Date).FirstOrDefault(); DateTime startDate = DateTime.Today.AddYears(-5); if (lastPerf != null) { startDate = lastPerf.Date; } DateTime endDate = DateTime.Today; log.InfoFormat("retrieve Perf between {0} and {1} for stock({2})", startDate, endDate, data); ResponseHistoryData[] perfdata = api.GetHistoryData(symbol, startDate, endDate); if (data == null && perfdata.Length == 0) { log.InfoFormat("can not get anny data from SOHU"); return;; } ProcessPerfData(data, perfdata); log.InfoFormat("download perform data successfully for stock({0})", data); perfdata = null; GC.Collect(); }
public List <StockPerf> GetStockPerf() { List <StockPerf> list = new List <StockPerf>(); if (this.PerfData == null || this.PerfData.Count == 0) { return(list); } foreach (string[] arrays in PerfData) { StockPerf item = new StockPerf(); item.Date = DateTime.Parse(arrays[0]); item.Open = decimal.Parse(arrays[1]); item.Close = decimal.Parse(arrays[2]); item.Change = decimal.Parse(arrays[3]); item.ChangePercentage = decimal.Parse(arrays[4].Replace("%", "")); item.Low = decimal.Parse(arrays[5]); item.High = decimal.Parse(arrays[6]); item.Volume = decimal.Parse(arrays[7]); item.Amount = decimal.Parse(arrays[8]); if (!"-".Equals(arrays[9])) { item.TurnoverRate = decimal.Parse(arrays[9].Replace("%", "")); } item.LastClose = item.Close + item.Change; item.Id = String.Format("{0}_{1}", this.Code, item.Date.ToString("yyyyMMdd")); list.Add(item); } return(list); }
private void CreateStatement(Strategy strategy, DateTime date) { if (strategy == null || strategy.Subjects == null) { return; } foreach (var ss in strategy.Subjects) { string key = $"{ss.StockId}_{date.ToString("yyyyMMdd")}"; StockPerf perf = this.stockDBContext.StockPerfs.Find(key); if (perf == null) { continue; } string id = $"{strategy.Id}_{key}"; var statement = this.stockDBContext.Statements.Find(id); if (statement == null) { statement = new Statement() { Id = id, TXDate = date, StockId = ss.StockId, StrategyId = strategy.Id }; this.stockDBContext.Statements.Add(statement); } statement.TXPrice = perf.Close.Value; statement.Amount = 100.0m; statement.Shares = 100 / perf.Close.Value; } }
public async Task <IActionResult> Edit(string id, [Bind("Id,Date,StockId,Open,High,Low,Close,LastClose,Volume,Amount,Change,ChangePercentage,ContinueTrend,TurnoverRate,CreatedOn,ModifiedOn")] StockPerf stockPerf) { if (id != stockPerf.Id) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(stockPerf); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!StockPerfExists(stockPerf.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(stockPerf)); }
public async Task <IActionResult> Create([Bind("Id,Date,StockId,Open,High,Low,Close,LastClose,Volume,Amount,Change,ChangePercentage,ContinueTrend,TurnoverRate,CreatedOn,ModifiedOn")] StockPerf stockPerf) { if (ModelState.IsValid) { _context.Add(stockPerf); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(stockPerf)); }
public void TestContext() { var config = new ConfigurationBuilder().Build(); string connection = config.GetConnectionString("StockDBConnection"); if (String.IsNullOrEmpty(connection)) { connection = "server=localhost;port=3306;database=stock;uid=jeesite;pwd=123456;charset=utf8;TreatTinyAsBoolean=true"; } StockDBContext sdb = new StockDBContext(connection); StockInfo si = sdb.StockInfos.Find("abc"); if (si == null) { si = new StockInfo() { Id = "abc", Name = "abc", BriefName = "abc", Type = StockType.Stock, Symbol = "abc", Market = "test", Status = StockStatus.Closed, }; sdb.StockInfos.Add(si); sdb.SaveChanges(); } si = sdb.StockInfos.Find("abc"); Assert.NotNull(si); Assert.Equal("abc", si.Id); var stockInfo = sdb.StockInfos.Where(t => t.Id == si.Id).FirstOrDefault(); Assert.NotNull(stockInfo); string key = "cn_070013_20190812"; var perf = sdb.StockPerfs.Find(key); if (perf == null) { perf = new StockPerf() { Id = key, Date = new DateTime(2019, 8, 12), StockId = "cn_070013", }; sdb.StockPerfs.Add(perf); } perf.Close = 1.78m; sdb.SaveChanges(); }
public async Task <IActionResult> Edit(int id, [Bind("Id,MasterPortfolioId,StockId,Weight")] PortfolioHolding portfolioHolding) { if (id != portfolioHolding.Id) { return(NotFound()); } MasterPortfolio mp = _context.MasterPortfolios.Find(portfolioHolding.MasterPortfolioId); StockInfo si = _context.StockInfos.Find(portfolioHolding.StockId); if (mp == null || si == null) { return(View(portfolioHolding)); } string key = String.Format("{0}_{1}", si.Id, mp.Date.ToString("yyyyMMdd")); StockPerf price = _context.StockPerfs.Find(key); if (price == null) { return(View(portfolioHolding)); } PortfolioHolding exist = _context.PortfolioHoldings.Find(portfolioHolding.Id); if (ModelState.IsValid) { try { exist.StockId = portfolioHolding.StockId; exist.Weight = portfolioHolding.Weight; exist.MasterPortfolioId = portfolioHolding.MasterPortfolioId; exist.ModifiedOn = DateTime.Now; exist.Shares = (int)Math.Floor(portfolioHolding.Weight.Value * mp.BaseAmount.Value / price.Close.Value / 100 / 100) * 100;//整手 exist.ActualWeight = 100 * portfolioHolding.Shares * price.Close.Value / mp.BaseAmount; _context.Update(exist); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!PortfolioHoldingExists(portfolioHolding.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(portfolioHolding)); }
public void DeserialzieTest() { StockPerf data = new StockPerf() { Day = "2019-03-12", Open = "1", Close = "2", High = "2", Low = "1", Volume = "1000" }; string js = JsonUtil.Serializer(data); StockPerf obj = JsonUtil.Deserialize <StockPerf>(js); js = "{day:\"2019-03-12\"}"; obj = JsonUtil.Deserialize <StockPerf>(js); Assert.AreEqual(data.Day, obj.Day); }
public override void ProcessData(StockInfo data) { log.InfoFormat("try to initialize continue trend for stock({0})", data); List <StockPerf> prices = this.stockDBContext.StockPerfs.Where(p => p.StockId == data.Id).OrderBy(p => p.Date).ToList(); StockPerf previousRecord = null; foreach (StockPerf price in prices) { if (previousRecord == null) { price.ContinueTrend = 0; } else { if (previousRecord.ContinueTrend > 0 && price.Change > 0) { price.ContinueTrend = previousRecord.ContinueTrend + 1; } else if (previousRecord.ContinueTrend < 0 && price.Change < 0) { price.ContinueTrend = previousRecord.ContinueTrend - 1; } else if (previousRecord.ContinueTrend <= 0 && price.Change > 0) { price.ContinueTrend = 1; } else if (previousRecord.ContinueTrend >= 0 && price.Change < 0) { price.ContinueTrend = -1; } else if (price.Change == 0) { price.ContinueTrend = 0; } } previousRecord = price; this.stockDBContext.StockPerfs.Update(price); } this.stockDBContext.SaveChanges(); log.InfoFormat("initialize continue trend successfully for stock({0})", data); prices = null; GC.Collect(); }
public override void ProcessData(Strategy data) { DateTime startDate = data.StartDate; DateTime effDate = startDate; StockPerf currentBenchmarkPrice = null; while (startDate < DateTime.Today) { currentBenchmarkPrice = this.stockDBContext.StockPerfs.Find($"{data.BenchmarkId}_{startDate.ToString("yyyyMMdd")}"); effDate = startDate; startDate = startDate.AddDays(1); if (currentBenchmarkPrice == null) { continue; } if (currentBenchmarkPrice.ChangePercentage < 1) { this.CreateStatement(data, effDate); } } this.stockDBContext.SaveChanges(); }
public override void ProcessData(MasterPortfolio data) { StockPerf perfRecord = null; List <StockPerf> list = stockDBContext.StockPerfs.Where(p => p.StockId == data.Benchmark && p.Date >= data.Date).OrderBy(p => p.Date).Take(11).ToList(); List <PortfolioHolding> holdings = stockDBContext.PortfolioHoldings.Where(h => h.MasterPortfolioId == data.Id).ToList(); decimal currentAsset = 0; decimal cashAmount = 0; for (int i = 0; i < list.Count; i++) { currentAsset = 0; foreach (PortfolioHolding holding in holdings) { perfRecord = stockDBContext.StockPerfs.Where(p => p.StockId == holding.StockId && p.Date <= list[i].Date).OrderByDescending(p => p.Date).Take(1).FirstOrDefault(); if (perfRecord == null) { data.Status = MasterPortfolioStatus.Error; log.ErrorFormat("Can not any price for holding({0}) before {1}", holding.StockId, list[i].Date); data.ModifiedOn = DateTime.Now; stockDBContext.MasterPortfolios.Update(data); stockDBContext.SaveChanges(); return; } currentAsset += perfRecord.Close.Value * holding.Shares.Value; } if (i == 0) { cashAmount = data.BaseAmount.Value - currentAsset; } currentAsset += cashAmount; decimal rtn = 100 * (currentAsset - data.BaseAmount.Value) / data.BaseAmount.Value; switch (i) { case 1: data.ReturnDay1 = rtn; break; case 2: data.ReturnDay2 = rtn; break; case 3: data.ReturnDay3 = rtn; break; case 5: data.ReturnDay5 = rtn; break; case 10: data.ReturnDay10 = rtn; break; default: break; } } data.ModifiedOn = DateTime.Now; data.Status = MasterPortfolioStatus.Completed; stockDBContext.Update(data); stockDBContext.SaveChanges(); log.InfoFormat("Calcuate master portfolio(id={0},name={1}) return successfully", data.Id, data.Name); }
public async Task <IActionResult> Create([Bind("Id,Date,Benchmark,BaseAmount,Name")] MasterPortfolio masterPortfolio, string holdings) { if (masterPortfolio.Benchmark == null || !masterPortfolio.BaseAmount.HasValue) { return(View(masterPortfolio)); } StockInfo si = _context.StockInfos.Find(masterPortfolio.Benchmark); if (si == null) { return(View(masterPortfolio)); } if (masterPortfolio.BaseAmount.HasValue) { masterPortfolio.BaseAmount = 100000; } if (ModelState.IsValid) { //masterPortfolio.Name = string.Format("{0}-{1}",si.Name,masterPortfolio.Date.ToString("yyyyMMdd")); masterPortfolio.Status = MasterPortfolioStatus.Pending; masterPortfolio.CreatedOn = masterPortfolio.ModifiedOn = DateTime.Now; _context.Add(masterPortfolio); await _context.SaveChangesAsync(); if (!String.IsNullOrEmpty(holdings)) { string[] holdingVals = holdings.Split(new char[] { ',', ';' }); List <PortfolioHolding> holdingList = new List <PortfolioHolding>(); foreach (string val in holdingVals) { if (String.IsNullOrEmpty(val)) { continue; } PortfolioHolding ph = new PortfolioHolding() { MasterPortfolioId = masterPortfolio.Id, StockId = val.Split(new char[] { '_' })[0], }; holdingList.Add(ph); } foreach (PortfolioHolding ph in holdingList) { ph.Weight = 100.0m / holdingList.Count; si = _context.StockInfos.Find(ph.StockId); if (si == null) { return(View(masterPortfolio)); } string key = String.Format("{0}_{1}", si.Id, masterPortfolio.Date.ToString("yyyyMMdd")); StockPerf price = _context.StockPerfs.Find(key); if (price == null) { return(View(masterPortfolio)); } ph.ModifiedOn = ph.CreatedOn = DateTime.Now; ph.Shares = (int)Math.Floor(ph.Weight.Value * masterPortfolio.BaseAmount.Value / price.Close.Value / 100 / 100) * 100;//整手 ph.ActualWeight = 100 * ph.Shares * price.Close.Value / masterPortfolio.BaseAmount; _context.Add(ph); } } await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(masterPortfolio)); }