示例#1
0
        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);
            }
        }
示例#2
0
        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));
        }
示例#4
0
        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();
        }
示例#5
0
        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);
        }
示例#6
0
 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;
     }
 }
示例#7
0
        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));
        }
示例#8
0
        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));
        }
示例#9
0
        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();
        }
示例#10
0
        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));
        }
示例#11
0
        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);
        }
示例#12
0
        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();
        }
示例#13
0
        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);
        }
示例#15
0
        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));
        }