public Setup Statistics(bool opt, decimal share) { if (trades.Count == 0) { return(null); } var groupTrades = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.ToList()); var countr = groupTrades.ToDictionary(x => x.Key, y => y.Value.Count); var cumsum = new Dictionary <DateTime, decimal>(); if (trade == null) { trade = trades.LastOrDefault(); } if (trade.AssetClass != "BMF.FUT") { trades.ForEach(t => { t.GetNetResult(t.ExitValue); t.Cost += t.BkrFixComm / countr[t.ExitTime.Value.Date]; t.NetResult = t.NetResult * share - 100 * t.BkrFixComm / t.EntryValue / t.Qnty / countr[t.ExitTime.Value.Date]; }); } else { trades.ForEach(t => { t.GetNetResult(t.ExitValue); t.NetResult = t.Capital * t.Result * t.Unit - t.Cost; }); } trades[0].CumResult = trades[0].NetResult; for (var i = 1; i < trades.Count; i++) { trades[i].CumResult = trades[i - 1].CumResult + trades[i].NetResult; } var dailyr = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.Sum(z => z.NetResult.Value)); #region Calculate DrawnDown var max = 0.0m; var mdd = 0.0m; var esum = 0.0m; foreach (var pair in dailyr) { esum += pair.Value; max = Math.Max(max, esum); mdd = Math.Max(mdd, (max - esum)); cumsum.Add(pair.Key, esum); } #endregion var months = (decimal)(trades.Last().ExitTime.Value - trades.First().EntryTime).TotalDays / 30.4368499m; this.action = 0; this.setup.MaxDrawndown = mdd; this.setup.TotalNetProfit = esum; this.setup.DailyNetProfit = esum / months; this.setup.TradesCount = trades.Count(); this.setup.TotalCosts = trades.Sum(t => t.Cost) / months; this.setup.SharpeRatio = GetSharpeRation(dailyr.Values); this.setup.SharpeRatio = this.setup.SharpeRatio * GetRSquared(cumsum); this.setup.PositiveTrades = 100 * trades.Count(t => t.NetResult > 0) / trades.Count; this.setup.Description = trades.First().EntryTime.ToShortDateString() + " " + trades.Last().ExitTime.Value.ToShortDateString() + "\t"; var nonnulltrades = trades.FindAll(t => t.NetResult.HasValue); this.setup.WinLossRatio = this.setup.PositiveTrades == 0 || this.setup.PositiveTrades == 100 ? 0 : - nonnulltrades.Where(t => t.NetResult.Value > 0).Average(t => t.NetResult.Value) / nonnulltrades.Where(t => t.NetResult.Value < 0).Average(t => t.NetResult.Value); var resultsDic = new Dictionary <string, string>(); var firstofthismonth = trade.ExitTime.Value.AddDays(1 - trade.ExitTime.Value.Day); var lastofthismonth = firstofthismonth.AddMonths(1).AddDays(-1); resultsDic.Add("Mês", Return(firstofthismonth, lastofthismonth)); var firstofthisyear = new DateTime(trade.ExitTime.Value.Year, 1, 1); resultsDic.Add("Ano", Return(firstofthisyear, lastofthismonth)); var startlast06months = trade.ExitTime.Value.AddMonths(-6); resultsDic.Add("6 meses", Return(startlast06months, lastofthismonth)); var startlast12months = trade.ExitTime.Value.AddMonths(-12); resultsDic.Add("12 meses", Return(startlast12months, lastofthismonth)); var startlast24months = trade.ExitTime.Value.AddMonths(-24); resultsDic.Add("24 meses", Return(startlast24months, lastofthismonth)); for (var i = 1; i <= 12; i++) { resultsDic.Add(firstofthismonth.AddMonths(-i).ToString(@"MMM/yy"), Return(firstofthismonth.AddMonths(-i), lastofthismonth.AddMonths(-i))); } this.setup.Description += string.Join(";", resultsDic.Keys) + "\r\n;" + string.Join(";", resultsDic.Values); if (opt) { if (esum > mdd) { OnStatusChanged(setup.ToString()); } var _file = String.Format(DataDir.Replace(@"\Data\", @"\Backtest\") + "{0:ID_000}_{1:yyMMddHHmm}.csv", setup.SetupId, DateTime.Now); if (File.Exists(_file)) { File.Delete(_file); } File.AppendAllText(_file, this.setup.ToString() + "\r\n", System.Text.Encoding.UTF8); foreach (var pair in countr) { File.AppendAllText(_file, "\r\n" + pair.Key.ToShortDateString() + ";" + pair.Value + ";" + dailyr[pair.Key] + ";" + cumsum[pair.Key]); } _file = _file.Replace(".csv", "_trades.csv"); if (File.Exists(_file)) { File.Delete(_file); } for (var i = 0; i < trades.Count; i++) { File.AppendAllText(_file, trades[i].ToString() + "\r\n"); } } this.trades.RemoveAll(t => t.EntryTime.Date != trade.EntryTime.Date); return(this.setup); }