public chart Get(string id, string ktype) { var kdata = new kdatadb().kdata(id, ktype); var basic = new Trade.Db.db().basics(id); var since = Trade.Cfg.Configuration.data.bearcrossbull; var k = kdata.Where(p => p.date >= since).ToArray(); var macd = new MACD(kdata.close()).Where(p => p.Date >= since).ToArray(); var macdvol = new MACD(kdata.volume(100)).Where(p => p.Date >= since).ToArray(); var ma5 = new MA(kdata.close(), 5).Range(since); var ma30 = new MA(kdata.close(), 30).Range(since); var ma60 = new MA(kdata.close(), 60).Range(since); var ma120 = new MA(kdata.close(), 120).Range(since); var chg = new CHG(kdata.close()).Range(since); var bottom = new BOTTOM(kdata).Range(since); return(new chart { data = k.Select(p => new object[] { p.date, p.open, p.high, p.low, p.close, chg[p.date] }).ToArray(), volume = k.Select(p => new object[] { p.date, p.volume / 100 }).ToArray(), macd = macd.Select(p => new object[] { p.Date, p.MACD }).ToArray(), dif = macd.Select(p => new object[] { p.Date, p.DIF }).ToArray(), dea = macd.Select(p => new object[] { p.Date, p.DEA }).ToArray(), macdvol = macdvol.Select(p => new object[] { p.Date, p.MACD }).ToArray(), difvol = macdvol.Select(p => new object[] { p.Date, p.DIF }).ToArray(), deavol = macdvol.Select(p => new object[] { p.Date, p.DEA }).ToArray(), ma5 = ma5.Select(p => new object[] { p.Date, p.Value }).ToArray(), ma30 = ma30.Select(p => new object[] { p.Date, p.Value }).ToArray(), ma60 = ma60.Select(p => new object[] { p.Date, p.Value }).ToArray(), ma120 = ma120.Select(p => new object[] { p.Date, p.Value }).ToArray(), code = kdata.Code, name = basic.name, bottom = bottom.Select(p => new object[] { p.Date, p.Value }).ToArray(), keyprices = keyprice(k, id, ktype) }); }
public void basics() { var db = new Db.db(); var stock_basics = db.stock_basics().ToList(); var suspended = code_names(() => db.suspended()); var terminated = code_names(() => db.terminated()); var st_classified = code_names(() => db.st_classified()); var hs300s = code_names(() => db.hs300s()); var sz50s = code_names(() => db.sz50s()); var sme_classified = code_names(() => db.sme_classified()); var gem_classified = code_names(() => db.gem_classified()); var concept_classified = code_cnames(() => db.concept_classified()); var industry_classified = code_cnames(() => db.industry_classified()); var custom_classified = code_cnames(() => db.custom_classified()); var fenjib = db.fenjib_classified(); var privatefunds = db.private_fund_classified(); var basiscs = stock_basics.ToList(); foreach (var stockbasic in stock_basics) { if (string.IsNullOrEmpty(stockbasic.code)) { log.WarnFormat("invalid code={0} | {1}", stockbasic.code, stockbasic.name); continue; } stockbasic.assettype = assettypes.stock; stockbasic.nameabbr = pinyin(stockbasic.name); if (suspended.ContainsKey(stockbasic.code)) { stockbasic.suspended = true; } if (terminated.ContainsKey(stockbasic.code)) { stockbasic.terminated = true; } if (st_classified.ContainsKey(stockbasic.code)) { stockbasic.st = true; } if (sme_classified.ContainsKey(stockbasic.code)) { stockbasic.addindex(index.zxb); } if (gem_classified.ContainsKey(stockbasic.code)) { stockbasic.addindex(index.cyb); } if (stockbasic.code.StartsWith("60")) { stockbasic.addindex(index.sh); } if (stockbasic.code.StartsWith("00") || stockbasic.code.StartsWith("30")) { stockbasic.addindex(index.sz); } if (hs300s.ContainsKey(stockbasic.code)) { stockbasic.addindex(index.hs300); } if (sz50s.ContainsKey(stockbasic.code)) { stockbasic.addindex(index.sz50); } if (concept_classified.ContainsKey(stockbasic.code)) { stockbasic.addsector(concept_classified[stockbasic.code]); } if (industry_classified.ContainsKey(stockbasic.code)) { stockbasic.addsector(industry_classified[stockbasic.code]); } if (custom_classified.ContainsKey(stockbasic.code)) { stockbasic.addsector(custom_classified[stockbasic.code]); } stockbasic.addsector(fenjib.Where(p => p.stock_code == stockbasic.code).Select(p => p.fund_code).Distinct().ToArray()); //stockbasic.addsector(privatefunds.Where(p => p.stock_code == stockbasic.code).Select(p => p.fund_name).Distinct().ToArray()); } basiscs.Add(new basics { code = index.hs300, name = "沪深300", nameabbr = "hs300", assettype = assettypes.index }); basiscs.Add(new basics { code = index.sz50, name = "上证50", nameabbr = "sz50", assettype = assettypes.index }); basiscs.Add(new basics { code = index.sz, name = "深圳成指", nameabbr = "sz", assettype = assettypes.index }); basiscs.Add(new basics { code = index.sh, name = "上证综指", nameabbr = "sh", assettype = assettypes.index }); basiscs.Add(new basics { code = index.cyb, name = "创业板指", nameabbr = "cyb", assettype = assettypes.index }); basiscs.Add(new basics { code = index.zxb, name = "中小板指", nameabbr = "zxb", assettype = assettypes.index }); var concepts = concept_classified .Concat(custom_classified) .SelectMany(p => p.Value) .Where(p => !string.IsNullOrEmpty(p)) .Distinct() .ToArray(); foreach (var i in concepts) { basiscs.Add(new basics { code = i, name = i, nameabbr = pinyin(i), assettype = assettypes.sector }); } var industries = industry_classified .SelectMany(p => p.Value) .Where(p => !string.IsNullOrEmpty(p)) .Distinct() .ToArray(); foreach (var i in industries) { basiscs.Add(new basics { code = i, name = i, nameabbr = pinyin(i), assettype = assettypes.sector }); } foreach (var i in fenjib) { basiscs.Add(new basics { code = i.fund_code, name = i.fund_name, nameabbr = pinyin(i.fund_name), assettype = assettypes.sector }); } //foreach (var i in privatefunds) //{ // basiscs.Add(new basics // { // code = i.fund_name, // name = i.fund_name, // nameabbr = pinyin(i.fund_name), // assettype = assettypes.sector // }); //} var indexdict = basiscs .Where(p => p.assettype == assettypes.index) .ToDictionary(p => p, p => basiscs .Where(p1 => p1.assettype == assettypes.stock) .Where(p1 => p1.belongtoindex(p.code)) .ToArray()); calc(indexdict); var sectordict = basiscs .Where(p => p.assettype == assettypes.sector) .ToDictionary(p => p, p => basiscs .Where(p1 => p1.assettype == assettypes.stock) .Where(p1 => p1.belongtosector(p.code)) .ToArray()); calc(sectordict); db.save(basiscs); }
public static dynamic[] hitkeyprices() { var db = new Db.db(); var keyprices = db.keyprices("D"); var todayquotes = new kdatadb().ktoday(); keyprices = keyprices .OrderBy(p => p.Code) .ThenByDescending(p => p.Date) .Where(p => p.Flag == KeyPrice.Flags.lower) .GroupBy(p => p.Code) .Select(p => p.First()) .ToArray(); var q = (from k in keyprices join t in todayquotes on k.Code equals t.code where k.Flag == KeyPrice.Flags.lower && Math.Abs((t.low / k.Price - 1) * 100d) <= 0.8 && t.changepercent >= 0.01 && t.changepercent <= 1.0 && Math.Abs((k.Date - DateTime.Today).TotalDays) >= 8 select new { k, t } ) .ToArray() .Where(p => { var code = (string)p.t.code; var k = new kdatadb().kdata(code, "D"); if (k == null) { return(false); } var low = (double)p.t.low; var N = 8; for (var i = k.Count - 1; i > k.Count - N; --i) { if (k[i].low < low) { return(false); } } return(true); }) .Select(_ => { var k = _.k; var t = _.t; dynamic d = new ExpandoObject(); d.date = k.Date; d.cross = Math.Abs((k.Date - DateTime.Today).TotalDays); d.price = k.Price; d.distpercent = (t.low / k.Price - 1) * 100; d.pe = t.pe; d.code = t.code; d.name = t.name; d.trade = t.trade; d.high = t.high; d.low = t.low; d.open = t.open; d.close = t.close; d.volume = t.volume; d.changepercent = t.changepercent; d.turnoverratio = t.turnoverratio; d.pb = t.pb; d.amount = t.amount; d.mktcap = t.mktcap; d.ts = t.ts; return(d); }); var r = q .OrderBy(p => p.code) .ThenByDescending(p => p.date) .GroupBy(p => new { p.code }) .Select(p => p.First()) .OrderBy(p => p.cross) .ThenByDescending(p => p.changepercent) .ToArray(); return(r); }