public DEVIATION(Series <double> k, deviationtype type, int tolerance = 13) { var macd = new MACD(k); var close = k.ToDictionary(p => p.Date, p => p.Value); if (type == deviationtype.底背离) { var cross_up = cross(macd, (i, next) => i.MACD < 0 && next.MACD >= 0); for (var i = 1; i < cross_up.Length; ++i) { var c1 = cross_up[i].DIF - cross_up[i - 1].DIF; var c2 = close[cross_up[i].Date] - close[cross_up[i - 1].Date]; var deviated = c1 >= 0 && c2 <= 0; if (!deviated) { continue; } var units = k.Count(p => p.Date >= cross_up[i - 1].Date && p.Date <= cross_up[i].Date); var deviation = new deviation { d1 = cross_up[i - 1].Date, d2 = cross_up[i].Date, cross = units }; if (deviation.cross > tolerance) { Add(deviation); } } } else { var cross_down = cross(macd, (i, next) => i.MACD >= 0 && next.MACD < 0); for (var i = 1; i < cross_down.Length; ++i) { var c1 = cross_down[i].DIF - cross_down[i - 1].DIF; var c2 = close[cross_down[i].Date] - close[cross_down[i - 1].Date]; var deviated = c1 < 0 && c2 >= 0; if (!deviated) { continue; } var units = k.Count(p => p.Date >= cross_down[i - 1].Date && p.Date <= cross_down[i].Date); var deviation = new deviation { d1 = cross_down[i - 1].Date, d2 = cross_down[i].Date, cross = units }; if (deviation.cross > tolerance) { Add(deviation); } } } }
private IEnumerable <string> deviations(string code, DateTime date, deviationtype type) { var ktypes = new[] { "D", "60", "30", "15", "5" }; foreach (var ktype in ktypes) { var k = new kdatadb().kdata(code, ktype); if (k == null || !k.Any()) { continue; } var deviation = (deviation) new DEVIATION(k.close(), type); if (deviation != null && deviation.d2.Date == date.Date) { yield return(ktype); } } }