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