Exemple #1
0
        public static double GetWithdrawnByTimeline(int timelineId, DailyEquity dailyEquity, List <TradeRecord> trades)
        {
            if (trades.Count > 0)
            {
                var startDate = new DateTime();
                var endDate   = new DateTime();
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Dates.SecondsToDate(trades[0].OpenTime).Date;
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }

                if (Timelines.timelinesTillToday.Contains(timelineId))
                {
                    endDate = DateTime.Today.AddDays(-1).Date;
                }
                else
                {
                    endDate = Dates.GetEndDateByTimeLineID(timelineId, startDate);
                }
                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 withdrawn = trades.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) && (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit) && x.Profit < 0).Sum(x => x.Profit);
                return(withdrawn);
            }
            else
            {
                return(0);
            }
        }
Exemple #2
0
        public static double CalculateNavForTimeline(int timelineId, DailyEquity dailyEquity)
        {
            if (dailyEquity.EquityByDate.Count > 0)
            {
                var startDate = new DateTime();
                var endDate   = new DateTime();

                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Convert.ToDateTime(dailyEquity.EquityByDate[0].date);
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }

                if (Timelines.timelinesTillToday.Contains(timelineId))
                {
                    endDate = DateTime.Today.AddDays(-1).Date;
                }
                else
                {
                    endDate = Dates.GetEndDateByTimeLineID(timelineId, startDate);
                }

                var endingNav = dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).Select(x => x.Equity).FirstOrDefault() == 0 ? 0 :
                                dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).Select(x => x.Equity).FirstOrDefault();
                return(endingNav);
            }
            else
            {
                return(0);
            }
        }
 public object UpdateDailyEquity(DailyEquity existingtDailyEquities)
 {
     try
     {
         _unitOfWork.DailyEquityRepository.Update(existingtDailyEquities);
         return(true);
     }
     catch (Exception ex)
     {
         return(false);
     }
 }
Exemple #4
0
        public static double GetStartingBalanceByTimeline(int timelineId, DailyEquity dailyEquity, List <TradeRecord> trades)
        {
            if (dailyEquity != null && dailyEquity.EquityByDate.Count > 0)
            {
                var startDate = new DateTime();
                var endDate   = new DateTime();
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Dates.SecondsToDate(trades[0].OpenTime).Date;
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }


                var startingBalance = dailyEquity.EquityByDate.Where(x => x.date == startDate.ToString()).Select(x => x.Equity).FirstOrDefault();
                return(startingBalance);
            }
            else
            {
                return(0);
            }
        }
 private static void CalculateDailyNav(List <MT4UserRequest> userRequests)
 {
     try
     {
         List <DailyEquity> insertDailyEquityOfUser = new List <DailyEquity>();
         foreach (var userRequest in userRequests)
         {
             if (userRequest.Login == 442842)
             {
             }
             var existingtDailyEquities = _eLTService.getDailyEquitiesByAccountNumber(userRequest.Login, userRequest.OrganizationId);
             if (existingtDailyEquities == null)
             {
                 if (userRequest.TradesHistories.Count() > 0)
                 {
                     var equityByDates            = new List <EquityByDate>();
                     var startDate                = Dates.SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date;
                     var beginingDate             = startDate;
                     var endDate                  = startDate.AddDays(1);
                     var balance                  = new double();
                     var balanaceWithoutWithdrawn = new double();
                     var id = 1;
                     var previousDateNav = new double();
                     do
                     {
                         if (userRequest.Login == 441327)
                         {
                             var b = "";
                         }
                         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.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Sell)
                                          .Sum(x => x.Profit);
                         var balanaceTypeWithWithdrawn = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) &&
                                                                                           (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit)).Sum(x => x.Profit);
                         var balanaceTypesWithoutWithdrawn = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) &&
                                                                                               (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit) && x.Profit > 0).Sum(x => x.Profit);
                         balance = balance + balanaceTypeWithWithdrawn + buyTrades + sellTrades;
                         balanaceWithoutWithdrawn = balanaceWithoutWithdrawn + balanaceTypesWithoutWithdrawn + buyTrades + sellTrades;
                         if (balance == 0 && startDate == Dates.SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date)
                         {
                         }
                         else
                         {
                             var sharpeRatioReturn = new double();
                             if (startDate != Dates.SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date)
                             {
                                 sharpeRatioReturn = previousDateNav == 0 ? 0 : (balance - previousDateNav) / previousDateNav;
                                 previousDateNav   = balance;
                             }
                             else
                             {
                                 sharpeRatioReturn = 0;
                                 previousDateNav   = balance;
                             }
                             var equityByDate = new EquityByDate();
                             equityByDate.date   = startDate.ToString();
                             equityByDate.Equity = Math.Round(balance, 2);
                             equityByDate.EquityWithoutWithdrawn = Math.Round(balanaceWithoutWithdrawn, 2);
                             equityByDate.id = id;
                             equityByDate.SharpeRatioReturn = sharpeRatioReturn;
                             equityByDates.Add(equityByDate);
                         }
                         startDate = startDate.AddDays(1);
                         endDate   = endDate.AddDays(1);
                         id++;
                     } while (startDate < DateTime.Today);
                     DailyEquity dailyEquityOfUser = new DailyEquity();
                     dailyEquityOfUser.AccountNumber  = userRequest.Login;
                     dailyEquityOfUser.EquityByDate   = equityByDates;
                     dailyEquityOfUser.OrganizationId = userRequest.OrganizationId;
                     insertDailyEquityOfUser.Add(dailyEquityOfUser);
                 }
             }
             else
             {
                 if (userRequest.Login == 456403 || userRequest.Login == 447927 || userRequest.Login == 440010)
                 {
                 }
                 if (userRequest.TradesHistories.Count() > 0)
                 {
                     var startDate               = Convert.ToDateTime(existingtDailyEquities.EquityByDate[existingtDailyEquities.EquityByDate.Count - 1].date).AddDays(1);
                     var endDate                 = startDate.AddDays(1);
                     var beginingDate            = startDate;
                     var balance                 = existingtDailyEquities.EquityByDate[existingtDailyEquities.EquityByDate.Count - 1].Equity;
                     var balanceWithoutWithdrawn = existingtDailyEquities.EquityByDate[existingtDailyEquities.EquityByDate.Count - 1].EquityWithoutWithdrawn;
                     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.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Sell).Sum(x => x.Profit);
                             var balanaceTypeWithWithdrawn = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) &&
                                                                                               (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit)).Sum(x => x.Profit);
                             var balanaceTypesWithoutWithdrawn = userRequest.TradesHistories.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) &&
                                                                                                   (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit) && x.Profit > 0).Sum(x => x.Profit);
                             balance = balance + balanaceTypeWithWithdrawn + buyTrades + sellTrades;
                             balanceWithoutWithdrawn = balanceWithoutWithdrawn + balanaceTypesWithoutWithdrawn + buyTrades + sellTrades;
                             var sharpeRatioReturn = new double();
                             if (startDate != Dates.SecondsToDate(userRequest.TradesHistories[0].OpenTime).Date)
                             {
                                 previousDateNav   = existingtDailyEquities.EquityByDate[existingtDailyEquities.EquityByDate.Count - 1].Equity;
                                 sharpeRatioReturn = (balance - previousDateNav) / previousDateNav;
                                 previousDateNav   = balance;
                             }
                             else
                             {
                                 sharpeRatioReturn = 0;
                                 previousDateNav   = balance;
                             }
                             var equityByDate = new EquityByDate();
                             equityByDate.date   = startDate.ToString();
                             equityByDate.Equity = Math.Round(balance, 2);
                             equityByDate.EquityWithoutWithdrawn = Math.Round(balanceWithoutWithdrawn, 2);
                             equityByDate.id = id;
                             equityByDate.SharpeRatioReturn = sharpeRatioReturn;
                             existingtDailyEquities.EquityByDate.Add(equityByDate);
                             startDate = startDate.AddDays(1);
                             endDate   = endDate.AddDays(1);
                             id++;
                         } while (startDate < DateTime.Today);
                         var result = _eLTService.UpdateDailyEquity(existingtDailyEquities);
                     }
                 }
             }
         }
         if (insertDailyEquityOfUser.Any())
         {
             unitOfWork.DailyEquityRepository.AddMultiple(insertDailyEquityOfUser);
         }
     }
     catch (Exception ex)
     {
         throw;
     }
 }
Exemple #6
0
        public static double CalculateROIForTimeline(int timelineId, DailyEquity dailyEquity, List <TradeRecord> trades)
        {
            if (trades.Count > 0 && dailyEquity.EquityByDate.Count > 0)
            {
                var startDate = new DateTime();
                var endDate   = new DateTime();
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Convert.ToDateTime(dailyEquity.EquityByDate[0].date);
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }

                if (Timelines.timelinesTillToday.Contains(timelineId))
                {
                    endDate = DateTime.Today.AddDays(-1).Date;
                }
                else
                {
                    endDate = Dates.GetEndDateByTimeLineID(timelineId, startDate);
                }

                var startingBalance = new double();
                if (dailyEquity.EquityByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).FirstOrDefault() == null)
                {
                    startingBalance = dailyEquity.EquityByDate[0].EquityWithoutWithdrawn;
                    startDate       = Convert.ToDateTime(dailyEquity.EquityByDate[0].date).AddDays(1).Date;
                }
                else
                {
                    startingBalance = dailyEquity.EquityByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).Select(x => x.EquityWithoutWithdrawn).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.OpenTime >= startSeconds && x.OpenTime < endSeconds) && x.Cmd == TradeCommand.Sell).Sum(x => x.Profit);
                var Deposits     = trades.Where(x => (x.OpenTime >= startSeconds && x.OpenTime < endSeconds) && (x.Cmd == TradeCommand.Balance || x.Cmd == TradeCommand.Credit) &&
                                                x.Profit > 0).Sum(x => x.Profit);


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

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

                if (startingBalance == 0)
                {
                    return(0);
                }
                else
                {
                    return(roi);
                }
            }
            else
            {
                return(0);
            }
        }
Exemple #7
0
        public static double CalculateDDForTimeline(int timelineId, DailyEquity dailyEquity, List <TradeRecord> trades)
        {
            if (dailyEquity.EquityByDate.Count > 0)
            {
                if (dailyEquity.AccountNumber == 442842)
                {
                    var a = "";
                }
                var startDate = new DateTime();
                var endDate   = new DateTime();

                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Convert.ToDateTime(dailyEquity.EquityByDate[0].date);
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }

                if (Timelines.timelinesTillToday.Contains(timelineId))
                {
                    endDate = DateTime.Today.AddDays(-1).Date;
                }
                else
                {
                    endDate = Dates.GetEndDateByTimeLineID(timelineId, startDate);
                }

                var firstTradeTime = trades.Where(x => x.Cmd == TradeCommand.Buy || x.Cmd == TradeCommand.Sell).OrderBy(x => x.OpenTime).Select(x => x.OpenTime).FirstOrDefault();
                var firstTradeDate = new DateTime(1970, 1, 1, 0, 0, 1, 0).AddSeconds(firstTradeTime).Date;
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    if (startDate != firstTradeDate)
                    {
                        startDate = firstTradeDate;
                    }
                }
                else
                {
                    if (startDate < firstTradeDate && firstTradeDate < endDate)
                    {
                        startDate = firstTradeDate;
                    }
                }

                var startIndex = dailyEquity.EquityByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).FirstOrDefault() == null ? 0 :
                                 dailyEquity.EquityByDate.IndexOf(dailyEquity.EquityByDate.Where(x => x.date == startDate.ToString()).FirstOrDefault());

                var endIndex = dailyEquity.EquityByDate.IndexOf(dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).FirstOrDefault()) < 0 ? 0 :
                               dailyEquity.EquityByDate.IndexOf(dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).FirstOrDefault());

                var NavsByTimeline = dailyEquity.EquityByDate.Skip(dailyEquity.EquityByDate.Where(x => x.date == startDate.AddDays(-1).ToString()).FirstOrDefault() == null ? 0 : startIndex + 1).Take(endIndex - startIndex).ToList();

                var lowestNav   = NavsByTimeline.OrderBy(x => x.EquityWithoutWithdrawn).FirstOrDefault();
                var lowestIndex = NavsByTimeline.IndexOf(lowestNav);
                var dd          = new double();
                if (lowestIndex > 0)
                {
                    var NAVBeforeLowestIndex = NavsByTimeline.Take(lowestIndex + 1);
                    var highestNAV           = NAVBeforeLowestIndex.OrderByDescending(x => x.EquityWithoutWithdrawn).FirstOrDefault();
                    if (highestNAV.EquityWithoutWithdrawn != 0)
                    {
                        dd = Math.Round(((lowestNav.EquityWithoutWithdrawn - highestNAV.EquityWithoutWithdrawn) / highestNAV.EquityWithoutWithdrawn) * 100, 2);
                    }
                    else
                    {
                        dd = 0;
                    }
                }
                else
                {
                    dd = 0;
                }
                return(dd);
            }
            else
            {
                return(0);
            }
        }
Exemple #8
0
        public static double CalculateSharpRatioForTimeline(int timelineId, DailyEquity dailyEquity, ObjectId datasourceId, Datasource datasource, List <TradeRecord> trades)
        {
            if (dailyEquity.EquityByDate.Count > 0)
            {
                var startDate = new DateTime();
                var endDate   = new DateTime();
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    startDate = Convert.ToDateTime(dailyEquity.EquityByDate[0].date);
                }
                else
                {
                    startDate = Dates.GetStartDateByTimeLineID(timelineId, DateTime.Today.AddDays(-1).Date);
                }

                if (Timelines.timelinesTillToday.Contains(timelineId))
                {
                    endDate = DateTime.Today.AddDays(-1).Date;
                }
                else
                {
                    endDate = Dates.GetEndDateByTimeLineID(timelineId, startDate).AddDays(-1);
                }

                var firstTradeTime = trades.Where(x => x.Cmd == TradeCommand.Buy || x.Cmd == TradeCommand.Sell).OrderBy(x => x.OpenTime).Select(x => x.OpenTime).FirstOrDefault();
                var firstTradeDate = new DateTime(1970, 1, 1, 0, 0, 1, 0).AddSeconds(firstTradeTime).Date;
                if (timelineId == (int)TimeLineEnum.Overall) //timelineid= 45
                {
                    if (startDate != firstTradeDate)
                    {
                        startDate = firstTradeDate;
                    }
                }
                else
                {
                    if (startDate < firstTradeDate && firstTradeDate < endDate)
                    {
                        startDate = firstTradeDate;
                    }
                }

                var riskFreeRate = Timelines.MasterTimelines.Any(x => x == timelineId) ? datasource.RateOfReturns.Where(x => x.TimelineId == timelineId).FirstOrDefault().RateOfReturn
                                        : Convert.ToDouble(ConfigurationManager.AppSettings["RiskFreeRateForSharpeRatio"]);
                var NavsForStatndardDeviaition = dailyEquity.EquityByDate.Where(x => Convert.ToDateTime(x.date) >= startDate && Convert.ToDateTime(x.date) <= endDate)
                                                 .Select(x => x.SharpeRatioReturn).ToList();
                var startingNav = dailyEquity.EquityByDate.Where(x => x.date == startDate.ToString()).Select(x => x.EquityWithoutWithdrawn).FirstOrDefault() == 0 ?
                                  dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).Select(x => x.EquityWithoutWithdrawn).FirstOrDefault() == 0 ? 0 : dailyEquity.EquityByDate[0].EquityWithoutWithdrawn :
                                  dailyEquity.EquityByDate.Where(x => x.date == startDate.ToString()).Select(x => x.EquityWithoutWithdrawn).FirstOrDefault();

                var endingNav = dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).Select(x => x.EquityWithoutWithdrawn).FirstOrDefault() == 0 ? 0 :
                                dailyEquity.EquityByDate.Where(x => x.date == endDate.ToString()).Select(x => x.EquityWithoutWithdrawn).FirstOrDefault();
                if (startingNav == 0 || startingNav == endingNav || NavsForStatndardDeviaition.Count == 0)
                {
                    return(0);
                }
                else
                {
                    var portfolioReturn = (endingNav - startingNav) / startingNav;
                    //var standardDev = calculateStandardDeviation(new List<double> { startingNav, endingNav });
                    var standardDev = calculateStandardDeviation(NavsForStatndardDeviaition);

                    var sharpeRatio = Math.Round((portfolioReturn - (Convert.ToDouble(riskFreeRate) / 100)) / standardDev, 2);
                    return(sharpeRatio);
                }
            }
            else
            {
                return(0);
            }
        }