private static void calculateKDValue(List<StockChartData> result, int idx, StockChartData chartDataToday) { if (idx >= 9) { List<StockChartData> charts = GetNDaysChart(result, idx, 9).ToList(); decimal max = charts.Select(x => x.PriceToday.High).Max(); decimal min = charts.Select(x => x.PriceToday.Low).Min(); if (max == min) { chartDataToday.RSV = 50; } else { chartDataToday.RSV = ((chartDataToday.PriceToday.Close - min) / (max - min)) * 100; } chartDataToday.KValue = (result.Where(x => x.ChartIdx == idx - 1).Single().KValue * 2 / 3) + (chartDataToday.RSV / 3); chartDataToday.DValue = (result.Where(x => x.ChartIdx == idx - 1).Single().DValue * 2 / 3) + (chartDataToday.KValue / 3); } else { chartDataToday.RSV = 50; chartDataToday.KValue = 50; chartDataToday.DValue = 50; } }
/// <summary> /// 取得基本分析指標資料 /// </summary> /// <param name="source"></param> /// <returns></returns> public static List<StockChartData> StockPriceDataToChart(List<StockPrice> source) { List<StockChartData> result = new List<StockChartData>(); int idx = 0; StockPrice priceYesterday = new StockPrice(); foreach (StockPrice priceData in source.OrderBy(s => s.Date)) { ++idx; StockChartData chartDataToday = new StockChartData(); chartDataToday.PriceToday = priceData; if (idx > 1) { chartDataToday.PriceYesterday = priceYesterday; } chartDataToday.ChartIdx = idx; result.Add(chartDataToday); processTechnicalAnalysisIndicators(result, idx, chartDataToday); priceYesterday = chartDataToday.PriceToday; } return result; }
private static void processTechnicalAnalysisIndicators(List<StockChartData> result, int idx, StockChartData chartDataToday) { calculateMovingAverage(result, idx, chartDataToday); calculateKDValue(result, idx, chartDataToday); calculateBBand(result, idx, chartDataToday); }
private static void calculateBBand(List<StockChartData> result, int idx, StockChartData chartDataToday) { if (idx >= 20) { decimal stdavg = MathHelper.CaculateStdAvg(GetNDaysChart(result, idx, 20).Select(x => x.PriceToday.Close).ToArray()); chartDataToday.BBUB = chartDataToday.MA20 + stdavg * 2; chartDataToday.BBLB = chartDataToday.MA20 - stdavg * 2; } }
private static void calculateMovingAverage(List<StockChartData> result, int idx, StockChartData chartDataToday) { if (idx >= 5) { chartDataToday.MA5 = GetNDaysChart(result, idx, 5).Select(x => x.PriceToday.Close).Average(); chartDataToday.VMA5 = GetNDaysChart(result, idx, 5).Select(x => Convert.ToDecimal(x.PriceToday.Amount)).Average(); } if (idx >= 10) { chartDataToday.MA10 = GetNDaysChart(result, idx, 10).Select(x => x.PriceToday.Close).Average(); chartDataToday.VMA10 = GetNDaysChart(result, idx, 10).Select(x => Convert.ToDecimal(x.PriceToday.Amount)).Average(); } if (idx >= 20) { chartDataToday.MA20 = GetNDaysChart(result, idx, 20).Select(x => x.PriceToday.Close).Average(); chartDataToday.VMA20 = GetNDaysChart(result, idx, 20).Select(x => Convert.ToDecimal(x.PriceToday.Amount)).Average(); } if (idx >= 60) { chartDataToday.MA60 = GetNDaysChart(result, idx, 60).Select(x => x.PriceToday.Close).Average(); } if (idx >= 120) { chartDataToday.MA120 = GetNDaysChart(result, idx, 120).Select(x => x.PriceToday.Close).Average(); } }