/// <summary> /// посчитать прибыль по счетам /// </summary> private void CalculateAccountProfit(TradeSharpConnection ctx, List<ACCOUNT> accounts) { var performers = new List<AccountPerformance>(); PerformersTopTotalIncome = new List<AccountPerformance>(); PerformersTopProfitBroker = new List<AccountPerformance>(); PerformersTopProfitIncome = new List<AccountPerformance>(); PerformersTopWorstProfitBroker = new List<AccountPerformance>(); // получить текущие котировки var candles = QuoteDatabase.GetCandlesOnTime(null); if (candles.Count == 0) { Errors.Add("CalculateAccountProfit - " + Resource.ErrorMessageQuotNotReceived); return; } // посчитать доходность по каждому счету // в валюте брокера foreach (var account in accounts) { var openProfit = CalculateAccountOpenProfit(ctx, account, candles); var acId = account.ID; // ввод-вывод и профиль по закрытым сделкам var profitClosed = 0M; var investedTotal = 0M; var withdrawnTotal = 0M; foreach (var bc in ctx.BALANCE_CHANGE.Where(b => b.AccountID == acId)) { if (bc.ChangeType == (int)BalanceChangeType.Profit) profitClosed += bc.Amount; else if (bc.ChangeType == (int)BalanceChangeType.Loss) profitClosed -= bc.Amount; else if (bc.ChangeType == (int) BalanceChangeType.Deposit) investedTotal += bc.Amount; else if (bc.ChangeType == (int)BalanceChangeType.Withdrawal) withdrawnTotal += bc.Amount; } // профит по сделкам... var profit = profitClosed + (decimal)openProfit; // сводка по счету var performer = new AccountPerformance { Account = account, TotalIncome = investedTotal, TotalWithdraw = withdrawnTotal, TotalProfit = profit, TotalProfitPercent = investedTotal == 0 ? 0 : 100*profit/investedTotal }; // пересчитать в валюту брокера string errorStr; performer.CalculateResultsInBrokerCurrency(candles, BrokerCurrency, out errorStr); if (!string.IsNullOrEmpty(errorStr)) Errors.Add(errorStr); performers.Add(performer); } // вывести краткую сводку по доходности if (performers.Count > 0) { // средние показатели AvgTotalIncome = performers.Average(p => p.TotalIncomeBroker); AvgProfitBroker = performers.Average(p => p.TotalProfitBroker); AvgProfitIncome = performers.Average(p => p.TotalProfitPercent); // топы лучших - худших PerformersTopTotalIncome = performers.OrderByDescending(p => p.TotalIncome).Take(TopRecordsCount).ToList(); PerformersTopTotalIncome = performers.OrderByDescending(p => p.TotalIncome).Take(TopRecordsCount).ToList(); PerformersTopProfitBroker = performers.OrderByDescending(p => p.TotalProfitBroker).Take(TopRecordsCount).ToList(); PerformersTopWorstProfitBroker = performers.OrderBy(p => p.TotalProfitBroker).Take(TopRecordsCount).ToList(); PerformersTopProfitIncome = performers.OrderByDescending(p => p.TotalProfitPercent).Take(TopRecordsCount).ToList(); } }
/// <summary> /// посчитать прибыль по счетам /// </summary> private void CalculateAccountProfit(TradeSharpConnection ctx, List <ACCOUNT> accounts) { var performers = new List <AccountPerformance>(); PerformersTopTotalIncome = new List <AccountPerformance>(); PerformersTopProfitBroker = new List <AccountPerformance>(); PerformersTopProfitIncome = new List <AccountPerformance>(); PerformersTopWorstProfitBroker = new List <AccountPerformance>(); // получить текущие котировки var candles = QuoteDatabase.GetCandlesOnTime(null); if (candles.Count == 0) { Errors.Add("CalculateAccountProfit - " + Resource.ErrorMessageQuotNotReceived); return; } // посчитать доходность по каждому счету // в валюте брокера foreach (var account in accounts) { var openProfit = CalculateAccountOpenProfit(ctx, account, candles); var acId = account.ID; // ввод-вывод и профиль по закрытым сделкам var profitClosed = 0M; var investedTotal = 0M; var withdrawnTotal = 0M; foreach (var bc in ctx.BALANCE_CHANGE.Where(b => b.AccountID == acId)) { if (bc.ChangeType == (int)BalanceChangeType.Profit) { profitClosed += bc.Amount; } else if (bc.ChangeType == (int)BalanceChangeType.Loss) { profitClosed -= bc.Amount; } else if (bc.ChangeType == (int)BalanceChangeType.Deposit) { investedTotal += bc.Amount; } else if (bc.ChangeType == (int)BalanceChangeType.Withdrawal) { withdrawnTotal += bc.Amount; } } // профит по сделкам... var profit = profitClosed + (decimal)openProfit; // сводка по счету var performer = new AccountPerformance { Account = account, TotalIncome = investedTotal, TotalWithdraw = withdrawnTotal, TotalProfit = profit, TotalProfitPercent = investedTotal == 0 ? 0 : 100 * profit / investedTotal }; // пересчитать в валюту брокера string errorStr; performer.CalculateResultsInBrokerCurrency(candles, BrokerCurrency, out errorStr); if (!string.IsNullOrEmpty(errorStr)) { Errors.Add(errorStr); } performers.Add(performer); } // вывести краткую сводку по доходности if (performers.Count > 0) { // средние показатели AvgTotalIncome = performers.Average(p => p.TotalIncomeBroker); AvgProfitBroker = performers.Average(p => p.TotalProfitBroker); AvgProfitIncome = performers.Average(p => p.TotalProfitPercent); // топы лучших - худших PerformersTopTotalIncome = performers.OrderByDescending(p => p.TotalIncome).Take(TopRecordsCount).ToList(); PerformersTopTotalIncome = performers.OrderByDescending(p => p.TotalIncome).Take(TopRecordsCount).ToList(); PerformersTopProfitBroker = performers.OrderByDescending(p => p.TotalProfitBroker).Take(TopRecordsCount).ToList(); PerformersTopWorstProfitBroker = performers.OrderBy(p => p.TotalProfitBroker).Take(TopRecordsCount).ToList(); PerformersTopProfitIncome = performers.OrderByDescending(p => p.TotalProfitPercent).Take(TopRecordsCount).ToList(); } }