Exemplo n.º 1
0
        private void btnGetDividend_Click(object sender, EventArgs e)
        {
            StringBuilder sb    = new StringBuilder();
            List <int>    years = new List <int>()
            {
                2014, 2013, 2012, 2010, 2009
            };

            txtDividendResult.Clear();
            txtDividendResult.Text += getDividendHeader(years) + "\r\n";

            var etfStocks = model.GetEtfStocksData();

            int cnt = 0;

            foreach (var etfStock in etfStocks)
            {
                var stockPrice = model.GetStockPriceData(new string[] { etfStock.StockId });
                var stockData  = model.GetStockData(new string[] { etfStock.StockId });
                Debug.WriteLine("{0}\t{1}", (++cnt).ToString("00"), etfStock.StockId);

                var     stockDividendsResult = stockHelper.GetStockDividends(etfStock.StockId);
                string  line         = "";
                decimal currentPrice = stockPrice[etfStock.StockId].OrderByDescending(stock => stock.Date).First().Close;

                line = String.Format("{0}\t{1}\t{2}\t{3}\t", etfStock.EtfId, etfStock.StockId,
                                     stockData.First(stock => stock.StockId == etfStock.StockId).StockName,
                                     currentPrice.ToString("0.00"));

                // 股利
                List <decimal> dividends = new List <decimal>();
                foreach (var year in years)
                {
                    if (stockDividendsResult.Any(stock => stock.Year == year))
                    {
                        var stockDividendData = stockDividendsResult.First(stock => stock.Year == year);
                        dividends.Add(stockDividendData.CashDividends);
                        line += stockDividendData.CashDividends.ToString("0.00") + "\t";
                    }
                    else
                    {
                        line += "0.00\t";
                    }
                }

                decimal avgDividend = dividends.Sum() / 5;
                line += String.Format("{0}\t{1}\t{2}\t{3}\t{4}\t",
                                      avgDividend.ToString("0.00"),
                                      (avgDividend * 20).ToString("0.00"), (currentPrice - avgDividend * 20).ToString("0.00"),
                                      (avgDividend * 16).ToString("0.00"), (currentPrice - avgDividend * 16).ToString("0.00"));

                // 現金殖利率
                List <decimal> cashRates = new List <decimal>();
                foreach (var year in years)
                {
                    if (stockDividendsResult.Any(stock => stock.Year == year))
                    {
                        var stockDividendData = stockDividendsResult.First(stock => stock.Year == year);
                        cashRates.Add(stockDividendData.CashDividendsRate);
                        line += stockDividendData.CashDividendsRate.ToString("0.00") + "%\t";
                    }
                    else
                    {
                        line += "0.00%\t";
                    }
                }

                decimal avgCashRate    = cashRates.Sum() / 5;
                decimal stdAvgCashRate = cashRates.Count > 0 ? MathHelper.CaculateStdAvg(cashRates.ToArray()) : 0;
                if (stockDividendsResult.Count() == 0)
                {
                    stockDividendsResult.Add(new StockDividend());
                }
                line += String.Format("{0}%\t{1}%\t{2}%\t{3}%\t{4}\t",
                                      avgCashRate.ToString("0.00"),
                                      stdAvgCashRate.ToString("0.00"),
                                      stockDividendsResult.First().GrossMargin.ToString("0.00"),
                                      stockDividendsResult.First().ROE.ToString("0.00"),
                                      stockDividendsResult.First().EPS.ToString("0.00"));

                txtDividendResult.Text          += line + "\r\n";
                txtDividendResult.SelectionStart = txtDividendResult.Text.Length;
                Application.DoEvents();
            }

            txtDividendResult.Text += "Done";
        }