internal static List <Drawdown> allDrawdowns(StatisticsCollector collector) { var equities = cumulativeSum(collector.pnl()); var highWaterMarks = cumulativeMax(equities); Drawdown current = null; var drawdowns = new List <Drawdown>(); each(equities, highWaterMarks, (equity, highWaterMark) => { if (equity == highWaterMark) { if (current != null) { current.closed(); } current = null; return; } if (current == null) { current = new Drawdown(); drawdowns.Add(current); } current.add(equity, highWaterMark); }); return(drawdowns); }
private void ParseResult(Result result) { var windows = result.RollingWindow.GroupBy(v => v.Key.Split('_')[1]) .Select(g => new { Date = DateTime.ParseExact(g.Key, "yyyyMMdd", CultureInfo.InvariantCulture), M1 = g.First(x => x.Key.StartsWith("M1")).Value, M3 = g.First(x => x.Key.StartsWith("M3")).Value, M6 = g.First(x => x.Key.StartsWith("M6")).Value, M12 = g.First(x => x.Key.StartsWith("M12")).Value }); foreach (var window in windows) { if (!Drawdown.ContainsKey(window.Date)) { Drawdown[window.Date] = new RollingStatisticsItemViewModel(); } var drawdown = Drawdown[window.Date]; drawdown.M1 = window.M1.PortfolioStatistics.Drawdown; drawdown.M3 = window.M3.PortfolioStatistics.Drawdown; drawdown.M6 = window.M6.PortfolioStatistics.Drawdown; drawdown.M12 = window.M12.PortfolioStatistics.Drawdown; if (!AvgWinRate.ContainsKey(window.Date)) { AvgWinRate[window.Date] = new RollingStatisticsItemViewModel(); } var avgWinRate = AvgWinRate[window.Date]; avgWinRate.M1 = window.M1.PortfolioStatistics.AverageWinRate; avgWinRate.M3 = window.M3.PortfolioStatistics.AverageWinRate; avgWinRate.M6 = window.M6.PortfolioStatistics.AverageWinRate; avgWinRate.M12 = window.M12.PortfolioStatistics.AverageWinRate; } }