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); } }
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); }
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); } }
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); }
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; } }