using System; using System.Collections.Generic; using System.Linq; using Telerik.Windows.Data; using MarketData.Utils; using MarketData.MarketDataModel; using TradeBlotter.Model; using TradeBlotter.ViewModels; using System.Text; using MarketData.DividendRiskParity; using MarketData.MarketDataModel.GainLoss; namespace TradeBlotter.UIUtils { // ********************************************************************************************************************************** // ********************************************************* G A I N L O S S V I E W ***************************************** // ********************************************************************************************************************************** public class GainLossViewSumFunctionSymbol : AggregateFunction { public GainLossViewSumFunctionSymbol() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { int itemCount=0; if(null!=source)itemCount=source.Count(); return String.Format("{0} rows",itemCount); } } // ********************************************************************************************************************************** // ********************************************************* D I V I D E N D P A R I T Y ***************************************** // ********************************************************************************************************************************** public class DividendRiskParitySumFunctionGainLossPercent : AggregateFunction { public DividendRiskParitySumFunctionGainLossPercent() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalMV=source.Sum(x=>x.CurrentPrice*x.Shares); double totalExposure = source.Sum(x => x.Exposure); return Utility.FormatPercent((totalMV-totalExposure)/totalExposure); } } public class DividendRiskParitySumFunctionPrice : AggregateFunction { public DividendRiskParitySumFunctionPrice() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalExposure = source.Sum(x => x.Exposure); double totalShares = source.Sum(x => x.Shares); return Utility.FormatCurrency(totalExposure/totalShares, 2); } } public class DividendRiskParitySumFunctionShares : AggregateFunction { public DividendRiskParitySumFunctionShares() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalShares = source.Sum(x => x.Shares); return Utility.FormatNumber(totalShares, 3,true); } } public class DividendRiskParitySumFunctionExposure : AggregateFunction { public DividendRiskParitySumFunctionExposure() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalExposure = source.Sum(x => x.Exposure); return Utility.FormatCurrency(totalExposure, 2); } } public class DividendRiskParitySumFunctionWeightedDividend : AggregateFunction { public DividendRiskParitySumFunctionWeightedDividend() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalWeightedDividendPercent = source.Sum(x => x.WeightedDividendPercent); return Utility.FormatNumber(totalWeightedDividendPercent,2,true); } } public class DividendRiskParitySumFunctionDividendPayment : AggregateFunction { public DividendRiskParitySumFunctionDividendPayment() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalDividendPayment = source.Sum(x => x.DividendPayment); return Utility.FormatCurrency(totalDividendPayment,2); } } public class DividendRiskParitySumFunctionWeight : AggregateFunction { public DividendRiskParitySumFunctionWeight() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalWeight = source.Sum(x => x.Weight); return Utility.FormatPercent(totalWeight); } } public class DividendRiskParitySumFunctionGainLoss : AggregateFunction { public DividendRiskParitySumFunctionGainLoss() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalGainLoss = source.Sum(x => x.GainLoss); return Utility.FormatCurrency(totalGainLoss, 2); } } // ********************************************************************************************************************************** // ********************************************************* Q U A N T U M M O M E N T U M ****************************************************** // ********************************************************************************************************************************** public class MomentumPositionSumFunctionShares : AggregateFunction { public MomentumPositionSumFunctionShares() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double sum=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Shares).Sum(); return Utility.FormatNumber(sum,3,false); } } public class MomentumPositionSumFunctionExposure : AggregateFunction { public MomentumPositionSumFunctionExposure() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double exposure=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); return Utility.FormatCurrency(exposure); } } public class MomentumPositionSumFunctionMarketValue : AggregateFunction { public MomentumPositionSumFunctionMarketValue() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double marketValue=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); return Utility.FormatCurrency(marketValue); } } public class MomentumPositionSumFunctionGainLoss : AggregateFunction { public MomentumPositionSumFunctionGainLoss() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double sum=(from MGPositionModel positionModel in source select positionModel.GainLoss).Sum(); sb.Append("Total:").Append(Utility.FormatCurrency(sum)).Append("\n"); sum=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.GainLoss).Sum(); sb.Append("Active:").Append(Utility.FormatCurrency(sum)); return sb.ToString(); } } public class MomentumPositionSumFunctionGainLossPcnt : AggregateFunction { public MomentumPositionSumFunctionGainLossPcnt() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double marketValue=0.00; double exposure=0.00; double gainLossPcnt=0.00; double cumulativeReturn=ModelPerformanceAggregator.CalculateCumulativeReturn(source); sb.Append("Total:").Append(Utility.FormatPercent(cumulativeReturn,2)).Append("\n"); marketValue=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); exposure=(from MGPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); if(0.00!=exposure)gainLossPcnt=(marketValue-exposure)/exposure; sb.Append("Active:").Append(Utility.FormatPercent(gainLossPcnt,2)); return sb.ToString(); } } // ********************************************************************************************************************************** // ********************************************************* M G S H Q U A N T U M M O M E N T U M ****************************************************** // ********************************************************************************************************************************** public class MGSHMomentumPositionSumFunctionShares : AggregateFunction { public MGSHMomentumPositionSumFunctionShares() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double sum=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Shares).Sum(); return Utility.FormatNumber(sum,3,false); } } public class MGSHMomentumPositionSumFunctionExposure : AggregateFunction { public MGSHMomentumPositionSumFunctionExposure() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double exposure=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); return Utility.FormatCurrency(exposure); } } public class MGSHMomentumPositionSumFunctionMarketValue : AggregateFunction { public MGSHMomentumPositionSumFunctionMarketValue() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double marketValue=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); return Utility.FormatCurrency(marketValue); } } public class MGSHMomentumPositionSumFunctionGainLoss : AggregateFunction { public MGSHMomentumPositionSumFunctionGainLoss() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double sum=(from MGSHPositionModel positionModel in source select positionModel.GainLoss).Sum(); sb.Append("Total:").Append(Utility.FormatCurrency(sum)).Append("\n"); sum=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.GainLoss).Sum(); sb.Append("Active:").Append(Utility.FormatCurrency(sum)); return sb.ToString(); } } public class MGSHMomentumPositionSumFunctionGainLossPcnt : AggregateFunction { public MGSHMomentumPositionSumFunctionGainLossPcnt() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double marketValue=0.00; double exposure=0.00; double gainLossPcnt=0.00; double cumulativeReturn=ModelPerformanceAggregator.CalculateCumulativeReturn(source); sb.Append("Total:").Append(Utility.FormatPercent(cumulativeReturn,2)).Append("\n"); marketValue=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); exposure=(from MGSHPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); if(0.00!=exposure)gainLossPcnt=(marketValue-exposure)/exposure; sb.Append("Active:").Append(Utility.FormatPercent(gainLossPcnt,2)); return sb.ToString(); } } public class MGSHPositionSumFunctionRisk:AggregateFunction { public MGSHPositionSumFunctionRisk() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); List activePositions=source.Where(x => x.IsActivePosition).ToList(); double sum=activePositions.Sum(x => x.TotalRiskExposure); return Utility.FormatCurrency(sum); } } // ********************************************************************************************************************************** // ********************************************************* C M M O M E N T U M ****************************************************** // ********************************************************************************************************************************** public class CMMomentumPositionSumFunctionShares : AggregateFunction { public CMMomentumPositionSumFunctionShares() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double sum = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Shares).Sum(); return Utility.FormatNumber(sum, 3, false); } } public class CMMomentumPositionSumFunctionExposure : AggregateFunction { public CMMomentumPositionSumFunctionExposure() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double exposure = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); return Utility.FormatCurrency(exposure); } } public class CMMomentumPositionSumFunctionMarketValue : AggregateFunction { public CMMomentumPositionSumFunctionMarketValue() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double marketValue = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); return Utility.FormatCurrency(marketValue); } } public class CMMomentumPositionSumFunctionGainLoss : AggregateFunction { public CMMomentumPositionSumFunctionGainLoss() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb = new StringBuilder(); double sum = (from CMPositionModel positionModel in source select positionModel.GainLoss).Sum(); sb.Append("Total:").Append(Utility.FormatCurrency(sum)).Append("\n"); sum = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.GainLoss).Sum(); sb.Append("Active:").Append(Utility.FormatCurrency(sum)); return sb.ToString(); } } public class CMMomentumPositionSumFunctionGainLossPcnt : AggregateFunction { public CMMomentumPositionSumFunctionGainLossPcnt() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb = new StringBuilder(); double marketValue=0.00; double exposure=0.00; double gainLossPcnt=0.00; double cumulativeReturn=ModelPerformanceAggregator.CalculateCumulativeReturn(source); sb.Append("Total:").Append(Utility.FormatPercent(cumulativeReturn,2)).Append("\n"); marketValue = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); exposure = (from CMPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); if (0.00 != exposure) gainLossPcnt = (marketValue - exposure) / exposure; sb.Append("Active:").Append(Utility.FormatPercent(gainLossPcnt,2)); return sb.ToString(); } } public class CMMomentumPositionSumFunctionSharpeRatio : AggregateFunction { public CMMomentumPositionSumFunctionSharpeRatio() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { try { StringBuilder sb = new StringBuilder(); List weights = new List(); List items = new List(source.ToList()); int itemCount = items.Count(); double totalExposure = (from CMPositionModel positionModel in items select positionModel.Exposure).Sum(); double totalSharpeRatio = 0.00; foreach (CMPositionModel cmPositionModel in items) weights.Add(cmPositionModel.Exposure / totalExposure); for (int index = 0; index < itemCount; index++) { CMPositionModel cmPositionModel = items[index]; double weight = weights[index]; totalSharpeRatio += cmPositionModel.SharpeRatio * weight; } return Utility.FormatNumber(totalSharpeRatio, 4); } catch (Exception) { return Constants.CONST_DASHES; } } } public class CMMomentumPositionSumFunctionBeta : AggregateFunction { public CMMomentumPositionSumFunctionBeta() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { try { StringBuilder sb = new StringBuilder(); List weights = new List(); List items = new List(source.ToList()); int itemCount = items.Count(); double totalExposure = (from CMPositionModel positionModel in items select positionModel.Exposure).Sum(); double totalBeta = 0.00; foreach (CMPositionModel cmPositionModel in items) weights.Add(cmPositionModel.Exposure / totalExposure); for (int index = 0; index < itemCount; index++) { CMPositionModel cmPositionModel = items[index]; double weight = weights[index]; totalBeta += cmPositionModel.Beta * weight; } return Utility.FormatNumber(totalBeta, 4); } catch (Exception) { return Constants.CONST_DASHES; } } } // ********************************************************************************************************************************** // ********************************* C M T T R E N D (M A R C M I N E R V I N I / V A N T H A R P E ******************************* // ********************************************************************************************************************************** public class CMTTrendPositionSumFunctionShares:AggregateFunction { public CMTTrendPositionSumFunctionShares() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { double sum=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Shares).Sum(); return Utility.FormatNumber(sum,3,false); } } public class CMTTrendPositionSumFunctionExposure:AggregateFunction { public CMTTrendPositionSumFunctionExposure() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { double exposure=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); return Utility.FormatCurrency(exposure); } } public class CMTTrendPositionSumFunctionEdgeRatio:AggregateFunction { public CMTTrendPositionSumFunctionEdgeRatio() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { double sumERatio=0.00; List openItems=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel).ToList(); if(null==openItems || 0==openItems.Count)return Utility.FormatNumber(sumERatio,2); double totalExposure=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); double[] weightedRatios=new double[openItems.Count]; for(int index=0;index { public CMTTrendPositionSumFunctionMarketValue() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { double marketValue=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); return Utility.FormatCurrency(marketValue); } } public class CMTTrendPositionSumFunctionGainLoss:AggregateFunction { public CMTTrendPositionSumFunctionGainLoss() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double sum=(from CMTPositionModel positionModel in source select positionModel.GainLoss).Sum(); sb.Append("Total:").Append(Utility.FormatCurrency(sum)).Append("\n"); sum=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.GainLoss).Sum(); sb.Append("Active:").Append(Utility.FormatCurrency(sum)); return sb.ToString(); } } public class CMTTrendPositionSumFunctionGainLossPcnt:AggregateFunction { public CMTTrendPositionSumFunctionGainLossPcnt() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); double marketValue=0.00; double exposure=0.00; double gainLossPcnt=0.00; double cumulativeReturn=ModelPerformanceAggregator.CalculateCumulativeReturn(source); sb.Append("Total:").Append(Utility.FormatPercent(cumulativeReturn,2)).Append("\n"); marketValue=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.MarketValue).Sum(); exposure=(from CMTPositionModel positionModel in source where Utility.IsEpoch(positionModel.SellDate) select positionModel.Exposure).Sum(); if(0.00!=exposure) gainLossPcnt=(marketValue-exposure)/exposure; sb.Append("Active:").Append(Utility.FormatPercent(gainLossPcnt)); return sb.ToString(); } } public class CMTTrendPositionSumFunctionRisk:AggregateFunction { public CMTTrendPositionSumFunctionRisk() { this.AggregationExpression=items => Sum(items); } private String Sum(IEnumerable source) { StringBuilder sb=new StringBuilder(); List activePositions=source.Where(x => x.IsActivePosition).ToList(); double sum=activePositions.Sum(x => x.TotalRiskExposure); return Utility.FormatCurrency(sum); } } // ********************************************************************************************************************************** // ******************************************************** V A L U E A T R I S K ************************************************ // ********************************************************************************************************************************** public class ValueAtRiskModelMarketValueFunction : AggregateFunction { public ValueAtRiskModelMarketValueFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { return Utility.FormatCurrency((from portfolioHoldingViewModel in source select portfolioHoldingViewModel.MarketValue).Sum()); } } public class ValueAtRiskModelWeightFunction : AggregateFunction { public ValueAtRiskModelWeightFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { return Utility.FormatPercent((from portfolioHoldingViewModel in source select portfolioHoldingViewModel.Weight).Sum()); } } public class ValueAtRiskModelWeightExpFunction : AggregateFunction { public ValueAtRiskModelWeightExpFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { return Utility.FormatPercent((from portfolioHoldingViewModel in source select portfolioHoldingViewModel.WeightExp).Sum()); } } public class ValueAtRiskModelVaRContributionFunction : AggregateFunction { public ValueAtRiskModelVaRContributionFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { return Utility.FormatPercent((from portfolioHoldingViewModel in source select portfolioHoldingViewModel.Contribution).Sum()); } } public class ValueAtRiskModelExposureFunction : AggregateFunction { public ValueAtRiskModelExposureFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { return Utility.FormatCurrency((from portfolioHoldingViewModel in source select portfolioHoldingViewModel.Exposure).Sum()); } } // **************************************************************** public class SumFunctionWeight : AggregateFunction { public SumFunctionWeight() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalWeight = 0.00; foreach (TradeViewModel model in source) { if (!model.IsOpen) continue; totalWeight += Utility.ParsePercent(model.Weight); } return Utility.FormatPercent(totalWeight); } } // ****************************** public class SumFunctionTodaysChange : AggregateFunction { public SumFunctionTodaysChange() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalTodaysChange = 0.00; foreach (TradeViewModel model in source) { if (!model.IsOpen || model.TodaysChange.Equals(Constants.CONST_DASHES)) continue; totalTodaysChange += Utility.ParseCurrency(model.TodaysChange); } return Utility.FormatCurrency(totalTodaysChange); } } // ****************************** public class SumFunctionShares : AggregateFunction { public SumFunctionShares() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalShares = 0.00; foreach (TradeViewModel model in source) { if (!model.IsOpen) continue; totalShares += model.Shares; } return Utility.FormatNumber(totalShares); } } // ****************************** public class SumFunctionMarketValue : AggregateFunction { public SumFunctionMarketValue() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalMarketValue = 0.00; foreach (TradeViewModel model in source) { if (model.MarketValue.Equals(Constants.CONST_DASHES) || model.MarketValue.Equals("N.A.")) continue; totalMarketValue += Utility.ParseCurrency(model.MarketValue); } return Utility.FormatCurrency(totalMarketValue); } } // ****************************** public class SumFunctionExposure : AggregateFunction { public SumFunctionExposure() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalExposure = 0.00; foreach (TradeViewModel model in source) { if (!model.IsOpen) continue; totalExposure += Utility.ParseCurrency(model.Exposure); } return Utility.FormatCurrency(totalExposure); } } // ****************************** public class SumFunctionGainLoss : AggregateFunction { public SumFunctionGainLoss() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalGainLoss = 0.00; foreach (TradeViewModel model in source) { if(model.IsOpen)totalGainLoss += Utility.ParseCurrency(model.GainLoss); } return Utility.FormatCurrency(totalGainLoss); } } // ****************************** public class TotalReturnFunction : AggregateFunction { public TotalReturnFunction() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalExposure = 0.00; double totalMarketValue = 0.00; foreach (TradeViewModel model in source) { if (model.IsOpen) { totalExposure += Utility.ParseCurrency(model.Exposure); totalMarketValue += Utility.ParseCurrency(model.MarketValue); } } String totalReturn = Utility.FormatPercent(((totalMarketValue - totalExposure) / totalExposure)); return totalReturn; } } // **************************************************************** public class ETFHoldingsSumFunctionPercentOfAssets : AggregateFunction { public ETFHoldingsSumFunctionPercentOfAssets() { this.AggregationExpression = items => Sum(items); } private String Sum(IEnumerable source) { double totalWeight = 0.00; foreach (ETFHoldingModel model in source) { totalWeight += model.PercentOfAssets; } return Utility.FormatNumber(totalWeight,2); } } }