private void _AddReturnInfoToDgvReturn(ReturnInfo info) { dgvReturn.Rows.Add(); DataGridViewRow newRow = dgvReturn.Rows[dgvReturn.Rows.Count - 1]; newRow.Cells["colRCode"].Value = info.code; newRow.Cells["colREarning"].Value = info.earning; newRow.Cells["colRBreakEven"].Value = (!double.IsNaN(info.breakEven)) ? (object)info.breakEven : (object)"N/A"; newRow.Cells["colRROI"].Value = info.ROI * 100; }
private void _UpdateDgvReturn() { dgvReturn.Rows.Clear(); SortedDictionary<string, ReturnInfo> returnInfo = new SortedDictionary<string, ReturnInfo>(); foreach (string code in _prevBalance.Keys) { returnInfo.Add(code, new ReturnInfo(code)); } foreach (string code in _prevBalanceFuture.Keys) { if (!returnInfo.ContainsKey(code)) returnInfo.Add(code, new ReturnInfo(code)); } foreach (string code in _netTran.Keys) { if (!returnInfo.ContainsKey(code)) returnInfo.Add(code, new ReturnInfo(code)); } foreach (string code in _netTranFurture.Keys) { if (!returnInfo.ContainsKey(code)) returnInfo.Add(code, new ReturnInfo(code)); } ReturnInfo totalReturn = new ReturnInfo("TOTAL"); totalReturn.breakEven = double.NaN; List<double> allPayments = new List<double>(); List<DateTime> allDates = new List<DateTime>(); foreach (KeyValuePair<string, ReturnInfo> kwpRet in returnInfo) { Transaction curPrevBalance, curNetTran, curPostBalance; FutureTransaction curNetTranFuture; SortedDictionary<string, FutureTransaction> curBalanceFutureDct; List<double> payments = new List<double>(); List<DateTime> dates = new List<DateTime>(); if (_prevBalance.TryGetValue(kwpRet.Key, out curPrevBalance)) { kwpRet.Value.earning += curPrevBalance.payment; payments.Add(curPrevBalance.payment); dates.Add(curPrevBalance.date); allPayments.Add(curPrevBalance.payment); allDates.Add(curPrevBalance.date); } if (_prevBalanceFuture.TryGetValue(kwpRet.Key, out curBalanceFutureDct)) { foreach (FutureTransaction ft in curBalanceFutureDct.Values) { kwpRet.Value.earning += ft.payment; payments.Add(ft.payment); dates.Add(ft.date); allPayments.Add(ft.payment); allDates.Add(ft.date); } } if (_netTran.TryGetValue(kwpRet.Key, out curNetTran)) { kwpRet.Value.earning += curNetTran.payment; foreach (Transaction t in _tranDct[kwpRet.Key]) { payments.Add(t.payment); dates.Add(t.date); allPayments.Add(t.payment); allDates.Add(t.date); } } if (_netTranFurture.TryGetValue(kwpRet.Key, out curNetTranFuture)) { kwpRet.Value.earning += curNetTranFuture.payment; foreach (List<FutureTransaction> ftLst in _tranFutureDct[kwpRet.Key].Values) { foreach (FutureTransaction ft in ftLst) { payments.Add(ft.payment); dates.Add(ft.date); allPayments.Add(ft.payment); allDates.Add(ft.date); } } } if (_postBalanceFuture.TryGetValue(kwpRet.Key, out curBalanceFutureDct)) { foreach (FutureTransaction ft in curBalanceFutureDct.Values) { kwpRet.Value.earning += ft.payment; payments.Add(ft.payment); dates.Add(ft.date); allPayments.Add(ft.payment); allDates.Add(ft.date); } } if (_postBalance.TryGetValue(kwpRet.Key, out curPostBalance)) { kwpRet.Value.breakEven = kwpRet.Value.earning / curPostBalance.amount; kwpRet.Value.earning += curPostBalance.payment; payments.Add(curPostBalance.payment); dates.Add(curPostBalance.date); allPayments.Add(curPostBalance.payment); allDates.Add(curPostBalance.date); } else kwpRet.Value.breakEven = double.NaN; kwpRet.Value.ROI = Him.Financial.Financial.XIRR(payments.ToArray(), dates.ToArray()); totalReturn.earning += kwpRet.Value.earning; } totalReturn.ROI = Him.Financial.Financial.XIRR(allPayments.ToArray(), allDates.ToArray()); foreach (ReturnInfo info in returnInfo.Values) _AddReturnInfoToDgvReturn(info); _AddReturnInfoToDgvReturn(totalReturn); dgvReturn.Rows[dgvReturn.Rows.Count - 1].DefaultCellStyle.BackColor = Color.LightPink; }