示例#1
0
        private static double CalculateROIForTimeline(int timelineId, DailyNAV dailyNavs, List <TradeRecord> trades)
        {
            //if (dailyNavs.AccountNumber == 439465)
            //{
            //    var a = "";
            //}
            var startDate       = GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
            var endDate         = GetEndDateByTimeLineID(timelineId, startDate);
            var startingBalance = dailyNavs.NAVByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).Select(x => x.NAV).FirstOrDefault() == 0 ? 0 :
                                  dailyNavs.NAVByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).Select(x => x.NAV).FirstOrDefault();

            var startSeconds = (uint)(Int32)(startDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
            var endSeconds   = (uint)(Int32)(endDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
            var buyTrades    = trades.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Buy).Sum(x => x.Profit);
            var sellTrades   = trades.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Sell).Sum(x => x.Profit);
            var Deposits     = trades.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Balance &&
                                            x.Profit > 0).Sum(x => x.Profit);


            var tradesAndDeposits = Deposits + buyTrades + sellTrades;
            var endingBalance     = startingBalance + tradesAndDeposits;

            var roi = Math.Round(((endingBalance - startingBalance) / startingBalance) * 100, 2);

            if (startingBalance == 0)
            {
                return(0);
            }
            else
            {
                return(roi);
            }
        }
示例#2
0
        private static double CalculateDDForTimeline(int timelineId, DailyNAV dailyNavs)
        {
            var startDate  = GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
            var startIndex = dailyNavs.NAVByDate.IndexOf(dailyNavs.NAVByDate.Where(x => x.date == startDate.ToString()).FirstOrDefault()) < 0 ? 0 :
                             dailyNavs.NAVByDate.IndexOf(dailyNavs.NAVByDate.Where(x => x.date == startDate.ToString()).FirstOrDefault());

            var endDate  = GetEndDateByTimeLineID(timelineId, startDate);
            var endIndex = dailyNavs.NAVByDate.IndexOf(dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).FirstOrDefault()) < 0 ? 0 :
                           dailyNavs.NAVByDate.IndexOf(dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).FirstOrDefault());

            var NavsByTimeline = dailyNavs.NAVByDate.Skip(startIndex + 1).Take(endIndex - startIndex).ToList();

            var lowestNav   = NavsByTimeline.OrderBy(x => x.NAV).FirstOrDefault();
            var lowestIndex = NavsByTimeline.IndexOf(lowestNav);
            var dd          = new double();

            if (lowestIndex > 0)
            {
                var NAVBeforeLowestIndex = NavsByTimeline.Take(lowestIndex);
                var highestNAV           = NAVBeforeLowestIndex.OrderByDescending(x => x.NAV).FirstOrDefault();

                dd = Math.Round(((lowestNav.NAV - highestNAV.NAV) / highestNAV.NAV) * 100, 2);
            }
            else
            {
                dd = 0;
            }
            return(dd);
        }
示例#3
0
        private static double CalculateSharpRatioForTimeline(int timelineId, DailyNAV dailyNavs)
        {
            var startDate    = GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
            var endDate      = GetEndDateByTimeLineID(timelineId, startDate);
            var riskFreeRate = ConfigurationManager.AppSettings["RiskFreeRateForSharpeRatio"];
            var startingNav  = dailyNavs.NAVByDate.Where(x => x.date == startDate.ToString()).Select(x => x.NAV).FirstOrDefault() == 0 ? 0 :
                               dailyNavs.NAVByDate.Where(x => x.date == startDate.ToString()).Select(x => x.NAV).FirstOrDefault();

            var endingNav = dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).Select(x => x.NAV).FirstOrDefault() == 0 ? 0 :
                            dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).Select(x => x.NAV).FirstOrDefault();

            if (startingNav == 0 || startingNav == endingNav)
            {
                return(0);
            }
            else
            {
                var portfolioReturn = (endingNav - startingNav) / startingNav;
                var standardDev     = calculateStandardDeviation(new List <double> {
                    startingNav, endingNav
                });

                var sharpeRatio = Math.Round((portfolioReturn - Convert.ToDouble(riskFreeRate)) / standardDev, 2);
                return(sharpeRatio);
            }
        }
示例#4
0
        private static double CalculateNavForTimeline(int timelineId, DailyNAV dailyNavs)
        {
            var startDate = GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
            var endDate   = GetEndDateByTimeLineID(timelineId, startDate);

            var endingNav = dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).Select(x => x.NAV).FirstOrDefault() == 0 ? 0 :
                            dailyNavs.NAVByDate.Where(x => x.date == endDate.ToString()).Select(x => x.NAV).FirstOrDefault();

            return(endingNav);
        }
示例#5
0
        private static void CalculateDailyNav(List <MT4UserRequestModel> userRequests)
        {
            try
            {
                foreach (var userRequest in userRequests)
                {
                    var existingtDailyNavs = _eLTService.getDailyNavsByAccountNumber(userRequest.Login);
                    if (existingtDailyNavs == null)
                    {
                        if (userRequest.TradesHistories.Count() > 0)
                        {
                            var NAVByDates      = new List <NAVByDate>();
                            var startDate       = SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date;
                            var beginingDate    = startDate;
                            var endDate         = startDate.AddDays(1);
                            var balance         = userRequest.TradesHistories[0].Profit;
                            var id              = 1;
                            var previousDateNav = new double();
                            do
                            {
                                var startSeconds = (uint)(Int32)(startDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
                                var endSeconds   = (uint)(Int32)(endDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

                                var buyTrades         = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Buy).Sum(x => x.Profit);
                                var sellTrades        = userRequest.TradesHistories.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Sell).Sum(x => x.Profit);
                                var balanaceWithdrawn = new double();
                                if (startDate != beginingDate)
                                {
                                    balanaceWithdrawn = userRequest.TradesHistories.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Balance).Sum(x => x.Profit);
                                }
                                balance = balance + balanaceWithdrawn + buyTrades + sellTrades;

                                var sharpeRatioReturn = new double();
                                if (startDate != SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date)
                                {
                                    sharpeRatioReturn = (balance - previousDateNav) / previousDateNav;
                                    previousDateNav   = balance;
                                }
                                else
                                {
                                    sharpeRatioReturn = 0;
                                    previousDateNav   = balance;
                                }

                                var nAVByDate = new NAVByDate();
                                nAVByDate.date = startDate.ToString();
                                nAVByDate.NAV  = Math.Round(balance, 2);
                                nAVByDate.id   = id;
                                nAVByDate.SharpeRatioReturn = Math.Round(sharpeRatioReturn, 2);
                                NAVByDates.Add(nAVByDate);

                                startDate = startDate.AddDays(1);
                                endDate   = endDate.AddDays(1);
                                id++;
                            } while (startDate < DateTime.Today);

                            DailyNAV dailyNAVOfUser = new DailyNAV();
                            dailyNAVOfUser.AccountNumber = userRequest.Login;
                            dailyNAVOfUser.NAVByDate     = NAVByDates;
                            unitOfWork.DailyNAVRepository.Add(dailyNAVOfUser);
                        }
                    }
                    else
                    {
                        if (userRequest.TradesHistories.Count() > 0)
                        {
                            var startDate       = Convert.ToDateTime(existingtDailyNavs.NAVByDate[existingtDailyNavs.NAVByDate.Count - 1].date).AddDays(1);
                            var endDate         = startDate.AddDays(1);
                            var beginingDate    = startDate;
                            var balance         = existingtDailyNavs.NAVByDate[existingtDailyNavs.NAVByDate.Count - 1].NAV;
                            var id              = 1;
                            var previousDateNav = new double();
                            if (startDate < DateTime.Today)
                            {
                                do
                                {
                                    var startSeconds = (uint)(Int32)(startDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
                                    var endSeconds   = (uint)(Int32)(endDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

                                    var buyTrades         = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Buy).Sum(x => x.Profit);
                                    var sellTrades        = userRequest.TradesHistories.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Sell).Sum(x => x.Profit);
                                    var balanaceWithdrawn = new double();
                                    if (startDate != beginingDate)
                                    {
                                        balanaceWithdrawn = userRequest.TradesHistories.Where(x => (x.CloseTime >= startSeconds && x.CloseTime < endSeconds) && x.Cmd == TradeCommand.Balance).Sum(x => x.Profit);
                                    }
                                    balance = balance + balanaceWithdrawn + buyTrades + sellTrades;

                                    var sharpeRatioReturn = new double();
                                    if (startDate != SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date)
                                    {
                                        sharpeRatioReturn = (balance - previousDateNav) / previousDateNav;
                                        previousDateNav   = balance;
                                    }
                                    else
                                    {
                                        sharpeRatioReturn = 0;
                                        previousDateNav   = balance;
                                    }

                                    var nAVByDate = new NAVByDate();
                                    nAVByDate.date = startDate.ToString();
                                    nAVByDate.NAV  = Math.Round(balance, 2);
                                    nAVByDate.id   = id;
                                    nAVByDate.SharpeRatioReturn = Math.Round(sharpeRatioReturn, 2);
                                    existingtDailyNavs.NAVByDate.Add(nAVByDate);

                                    startDate = startDate.AddDays(1);
                                    endDate   = endDate.AddDays(1);
                                    id++;
                                } while (startDate < DateTime.Today);

                                var update = Builders <DailyNAV> .Update.Set("NAVByDate", existingtDailyNavs.NAVByDate);

                                var result = _eLTService.UpdateDailyNAV(existingtDailyNavs.Id.ToString(), update);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }