コード例 #1
0
        /// <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();
            }
        }
コード例 #2
0
        /// <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();
            }
        }