public static List <SummaryStats> SummaryProfitLoss(List <Trade> Trades, Period Period) { var TradeList_Stats = new List <Trade>(); List <SummaryStats> statsList = new List <SummaryStats>(); if (TradeList_Stats.Count == 0) { foreach (Trade t in Trades) { if (t.RunningProfit != 0) { TradeList_Stats.Add(t); } } } try { #region Weekly if (Period == Period.Weekly) { var weekly = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, W = Math.Floor((decimal)q.TimeStamp.DayOfYear / 7) + 1, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M, FGroup.Key.W select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, Week = FGroup.Key.W, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in weekly) { SummaryStats stat = new SummaryStats(); stat.Detail = "Weekly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = (int)v.Week; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Week + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion #region Fortnight if (Period == Period.TwoWeekly) { var fortnight = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, W = q.TimeStamp.Day <= 15 ? 1 : 2, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M, FGroup.Key.W select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, Week = FGroup.Key.W, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in fortnight) { SummaryStats stat = new SummaryStats(); stat.Detail = "Fortnightly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = (int)v.Week; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Week + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion #region Monthly if (Period == Period.Monthly) { var monthly = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in monthly) { SummaryStats stat = new SummaryStats(); stat.Detail = "Monthly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = 0; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion } catch { return(statsList); } return(statsList); }
private void PopulateStatBox(SummaryStats Stats) { statsListView.Items.Clear(); ListViewItem n = new ListViewItem("Total Profit"); n.SubItems.Add(Stats.TotalProfit.ToString()); statsListView.Items.Add(n); ListViewItem n1 = new ListViewItem("Trade Count"); n1.SubItems.Add(Stats.TradeCount.ToString()); statsListView.Items.Add(n1); ListViewItem n2 = new ListViewItem("Total avg Profit"); n2.SubItems.Add(Stats.Total_Avg_PL.ToString()); statsListView.Items.Add(n2); ListViewItem n3 = new ListViewItem("Win Trades"); n3.SubItems.Add(Stats.Pct_Prof.ToString()); statsListView.Items.Add(n3); ListViewItem n4 = new ListViewItem("Loss Trades"); n4.SubItems.Add(Stats.Pct_Loss.ToString()); statsListView.Items.Add(n4); }
public List <CompletedTrade> CalcExpandedTradeStats(List <CompletedTrade> Trades) { double totalProfit = 0; double tradeCount = Trades.Count; double prof_count = 0; double loss_count = 0; double prof_sum = 0; double loss_sum = 0; foreach (var t in Trades) { t.OpenTrade.Extention.newTotalProfit = totalProfit; if (t.CloseTrade.Reason == Trade.Trigger.CloseLong) { double prof = (t.CloseTrade.TradedPrice - t.OpenTrade.TradedPrice) * t.OpenTrade.Extention.OrderVol; t.CloseTrade.Extention.newRunningProf = prof; totalProfit += prof; t.CloseTrade.Extention.newTotalProfit = totalProfit; if (prof > 0) { prof_sum += prof; prof_count++; } else { loss_sum += prof; loss_count++; } } if (t.CloseTrade.Reason == Trade.Trigger.CloseShort) { double prof = (t.OpenTrade.TradedPrice - t.CloseTrade.TradedPrice) * t.OpenTrade.Extention.OrderVol; t.CloseTrade.Extention.newRunningProf = prof; totalProfit += prof; t.CloseTrade.Extention.newTotalProfit = totalProfit; if (prof > 0) { prof_sum += prof; prof_count++; } else { loss_sum += prof; loss_count++; } } } decimal avg_pl = (decimal)Math.Round((totalProfit / tradeCount), 5); decimal loss_pct = (decimal)Math.Round((loss_count / tradeCount) * 100, 2); decimal prof_pct = (decimal)Math.Round((prof_count / tradeCount) * 100, 2); decimal pl_ratio = (decimal)Math.Round((prof_sum / loss_sum), 2); decimal avg_profit = (decimal)Math.Round((prof_count / prof_sum), 2); decimal avg_loss = (decimal)Math.Round((loss_count / loss_sum), 2); SummaryStats s = new SummaryStats() { TotalProfit = totalProfit, TradeCount = tradeCount, Total_Avg_PL = avg_pl, Pct_Prof = prof_pct, Pct_Loss = loss_pct, Avg_Loss = avg_loss, Avg_Prof = avg_profit, }; try { StatsCalculatedEvent sc = new StatsCalculatedEvent(); sc.SumStats = s; OnStatsCaculated(this, sc); } catch { } return(Trades); }
public List <Trade> CalcBasicTradeStats(List <Trade> Trades) { double totalProfit = 0; double tradeCount = 0; double prof_count = 0; double loss_count = 0; double prof_sum = 0; double loss_sum = 0; for (int x = 1; x < Trades.Count; x++) { if (Trades[x].TradeTriggerGeneral == Trade.Trigger.Close) { totalProfit += Trades[x].RunningProfit; tradeCount++; if (Trades[x].RunningProfit <= 0) { loss_count++; loss_sum += Trades[x].RunningProfit; } if (Trades[x].RunningProfit > 0) { prof_count++; prof_sum += Trades[x].RunningProfit; } Trades[x].TotalPL = totalProfit; Trades[x].TradeCount = (int)tradeCount; } if (Trades[x].Reason == Trade.Trigger.OpenLong || Trades[x].Reason == Trade.Trigger.OpenShort) { Trades[x].TotalPL = totalProfit; } } decimal avg_pl = (decimal)Math.Round((totalProfit / tradeCount), 5); decimal loss_pct = (decimal)Math.Round((loss_count / tradeCount) * 100, 2); decimal prof_pct = (decimal)Math.Round((prof_count / tradeCount) * 100, 2); decimal pl_ratio = (decimal)Math.Round((prof_sum / loss_sum), 2); decimal avg_profit = (decimal)Math.Round((prof_count / prof_sum), 2); decimal avg_loss = (decimal)Math.Round((loss_count / loss_sum), 2); SummaryStats s = new SummaryStats() { TotalProfit = totalProfit, TradeCount = tradeCount, Total_Avg_PL = avg_pl, Pct_Prof = prof_pct, Pct_Loss = loss_pct, Avg_Loss = avg_loss, Avg_Prof = avg_profit, }; try { StatsCalculatedEvent sc = new StatsCalculatedEvent(); sc.SumStats = s; OnStatsCaculated(this, sc); } catch { } return(Trades); }
public static List<SummaryStats> SummaryProfitLoss(List<Trade> Trades, Period Period) { var TradeList_Stats = new List<Trade>(); List<SummaryStats> statsList = new List<SummaryStats>(); if (TradeList_Stats.Count == 0) foreach (Trade t in Trades) if (t.RunningProfit != 0) TradeList_Stats.Add(t); try { #region Weekly if (Period == Period.Weekly) { var weekly = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, W = Math.Floor((decimal)q.TimeStamp.DayOfYear / 7) + 1, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M, FGroup.Key.W select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, Week = FGroup.Key.W, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in weekly) { SummaryStats stat = new SummaryStats(); stat.Detail = "Weekly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = (int)v.Week; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Week + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion #region Fortnight if (Period == Period.TwoWeekly) { var fortnight = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, W = q.TimeStamp.Day <= 15 ? 1 : 2, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M, FGroup.Key.W select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, Week = FGroup.Key.W, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in fortnight) { SummaryStats stat = new SummaryStats(); stat.Detail = "Fortnightly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = (int)v.Week; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Week + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion #region Monthly if (Period == Period.Monthly) { var monthly = from q in TradeList_Stats group q by new { Y = q.TimeStamp.Year, M = q.TimeStamp.Month, //D=(DateTime)q.TimeStamp } into FGroup orderby FGroup.Key.Y, FGroup.Key.M select new { Year = FGroup.Key.Y, Month = FGroup.Key.M, FirstTradeDate = FGroup.First().TimeStamp, LastTradeDate = FGroup.Last().TimeStamp, Count = FGroup.Count(z => z.Reason != Trade.Trigger.None), AvPrice = (double)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Average(t => t.RunningProfit), SumPrice = (int)FGroup.Where(z => z.Reason == Trade.Trigger.CloseShort || z.Reason == Trade.Trigger.CloseLong) .Sum(t => t.RunningProfit), marketmovement = (FGroup.Last().CurrentPrice) - (FGroup.First().CurrentPrice), Prices = FGroup.Select(z => z.CurrentPrice), }; foreach (var v in monthly) { SummaryStats stat = new SummaryStats(); stat.Detail = "Monthly Profit and Loss Summary"; stat.Period = Period; stat.Year = (int)v.Year; stat.Month = (int)v.Month; stat.Week = 0; stat.Count = (int)v.Count; stat.Sum = (int)v.SumPrice; stat.Average = (double)v.AvPrice; stat.FirstTrade = v.FirstTradeDate; stat.LastTrade = v.LastTradeDate; stat.MarketMovement = v.marketmovement; stat.StandardDeviation = StandardDeviation(v.Prices.ToList()); statsList.Add(stat); // Debug.WriteLine(v.Year + " " + v.Month + " " + v.Count + " " + v.SumPrice + " " + v.AvPrice); } } #endregion } catch { return statsList; } return statsList; }
public List<CompletedTrade> CalcExpandedTradeStats(List<CompletedTrade> Trades) { double totalProfit = 0; double tradeCount = Trades.Count; double prof_count = 0; double loss_count = 0; double prof_sum = 0; double loss_sum = 0; foreach (var t in Trades) { t.OpenTrade.Extention.newTotalProfit = totalProfit; if (t.CloseTrade.Reason == Trade.Trigger.CloseLong) { double prof = (t.CloseTrade.TradedPrice - t.OpenTrade.TradedPrice) * t.OpenTrade.Extention.OrderVol; t.CloseTrade.Extention.newRunningProf = prof; totalProfit += prof; t.CloseTrade.Extention.newTotalProfit = totalProfit; if (prof > 0) { prof_sum += prof; prof_count++; } else { loss_sum += prof; loss_count++; } } if (t.CloseTrade.Reason == Trade.Trigger.CloseShort) { double prof = (t.OpenTrade.TradedPrice - t.CloseTrade.TradedPrice) * t.OpenTrade.Extention.OrderVol; t.CloseTrade.Extention.newRunningProf = prof; totalProfit += prof; t.CloseTrade.Extention.newTotalProfit = totalProfit; if (prof > 0) { prof_sum += prof; prof_count++; } else { loss_sum += prof; loss_count++; } } } decimal avg_pl = (decimal)Math.Round((totalProfit / tradeCount), 5); decimal loss_pct = (decimal)Math.Round((loss_count / tradeCount) * 100, 2); decimal prof_pct = (decimal)Math.Round((prof_count / tradeCount) * 100, 2); decimal pl_ratio = (decimal)Math.Round((prof_sum / loss_sum), 2); decimal avg_profit = (decimal)Math.Round((prof_count / prof_sum), 2); decimal avg_loss = (decimal)Math.Round((loss_count / loss_sum), 2); SummaryStats s = new SummaryStats() { TotalProfit = totalProfit, TradeCount = tradeCount, Total_Avg_PL = avg_pl, Pct_Prof = prof_pct, Pct_Loss = loss_pct, Avg_Loss = avg_loss, Avg_Prof = avg_profit, }; try { StatsCalculatedEvent sc = new StatsCalculatedEvent(); sc.SumStats = s; OnStatsCaculated(this, sc); } catch { } return Trades; }
public List<Trade> CalcBasicTradeStats(List<Trade> Trades) { double totalProfit = 0; double tradeCount = 0; double prof_count = 0; double loss_count = 0; double prof_sum = 0; double loss_sum = 0; for (int x = 1; x < Trades.Count; x++) { if (Trades[x].TradeTriggerGeneral == Trade.Trigger.Close) { totalProfit += Trades[x].RunningProfit; tradeCount++; if (Trades[x].RunningProfit <= 0) { loss_count++; loss_sum += Trades[x].RunningProfit; } if (Trades[x].RunningProfit > 0) { prof_count++; prof_sum += Trades[x].RunningProfit; } Trades[x].TotalPL = totalProfit; Trades[x].TradeCount = (int)tradeCount; } if (Trades[x].Reason == Trade.Trigger.OpenLong || Trades[x].Reason == Trade.Trigger.OpenShort) Trades[x].TotalPL = totalProfit; } decimal avg_pl = (decimal)Math.Round((totalProfit / tradeCount), 5); decimal loss_pct = (decimal)Math.Round((loss_count / tradeCount) * 100, 2); decimal prof_pct = (decimal)Math.Round((prof_count / tradeCount) * 100, 2); decimal pl_ratio = (decimal)Math.Round((prof_sum / loss_sum), 2); decimal avg_profit = (decimal)Math.Round((prof_count / prof_sum), 2); decimal avg_loss = (decimal)Math.Round((loss_count / loss_sum), 2); SummaryStats s = new SummaryStats() { TotalProfit = totalProfit, TradeCount = tradeCount, Total_Avg_PL = avg_pl, Pct_Prof = prof_pct, Pct_Loss = loss_pct, Avg_Loss = avg_loss, Avg_Prof = avg_profit, }; try { StatsCalculatedEvent sc = new StatsCalculatedEvent(); sc.SumStats = s; OnStatsCaculated(this, sc); } catch { } return Trades; }