/// <summary> /// Calculates the performance for <paramref name="sellingTransaction"/> /// </summary> /// <param name="sellingTransaction">The current selling transaction</param> /// <param name="buyingTransactions">All buying transaction for the same stock</param> /// <param name="mfe">Maximum favorable excursion</param> /// <param name="mae">Maximum adverse excursion</param> /// <returns>Performance</returns> public ITransactionPerformance GetPerformance( ISellingTransactionBookEntry sellingTransaction, IEnumerable <IBuyingTransactionBookEntry> buyingTransactions, decimal?mfe, decimal?mae) { var purchases = buyingTransactions.OrderBy(t => t.OrderDate).ToList(); var profit = GetProfit( purchases.Sum(t => t.Shares * t.PricePerShare), purchases.Sum(t => t.OrderCosts), sellingTransaction.Shares * sellingTransaction.PricePerShare, sellingTransaction.OrderCosts, sellingTransaction.Taxes); var r = decimal.Round(profit.ProfitAbsolute / GetMaximumRisk(sellingTransaction.OrderDate), 2); var performance = new TransactionPerformance(sellingTransaction.TransactionId, profit.ProfitAbsolute, profit.ProfitPercentage, purchases.First().OrderDate, sellingTransaction.OrderDate, r); if (mfe.HasValue && mae.HasValue) { performance.EntryEfficiency = GetEntryEfficiency(mae, mfe, GetAverageBuyingPricePerUnit(purchases)); performance.ExitEfficiency = GetExitEfficiency(mae, mfe, sellingTransaction.PricePerShare); performance.MAEAbsolute = GetMAEAbsolute(mae, purchases, sellingTransaction.OrderCosts); performance.MFEAbsolute = GetMFEAbsolute(mfe, purchases, sellingTransaction.OrderCosts); } return(performance); }
/// <summary> /// Processes the given event <paramref name="eventData"/> /// </summary> /// <param name="eventData">Event data</param> public void Handle(TransactionPerformanceCalculatedEvent eventData) { var item = new TransactionPerformance( eventData.AggregateId, eventData.ProfitAbsolute, eventData.ProfitPercentage, eventData.HoldingPeriod.StartDate, eventData.HoldingPeriod.EndDate, eventData.R) { EntryEfficiency = eventData.EntryEfficiency, ExitEfficiency = eventData.ExitEfficiency, MAEAbsolute = eventData.MAEAbsolute, MFEAbsolute = eventData.MFEAbsolute }; if (_writerRepository.GetById(eventData.AggregateId) == null) { _writerRepository.Add(item); } else { _writerRepository.Update(item); } }
/// <summary> /// Calculates the performance for <paramref name="dividendTransaction"/> /// </summary> /// <param name="dividendTransaction">The current dividend transaction</param> /// <param name="buyingTransactions">All buying transaction for the same stock</param> /// <returns>Performance</returns> public ITransactionPerformance GetPerformance(IDividendTransactionBookEntry dividendTransaction, IEnumerable <IBuyingTransactionBookEntry> buyingTransactions) { var purchases = buyingTransactions.OrderBy(t => t.OrderDate).ToList(); var buyingCosts = purchases.Sum(t => t.Shares * t.PricePerShare); var dividend = (dividendTransaction.Shares * dividendTransaction.PricePerShare) - (dividendTransaction.OrderCosts + dividendTransaction.Taxes); var profit = decimal.Round(dividend, 2); var percentage = decimal.Round((profit / buyingCosts) * 100, 2); var r = decimal.Round(profit / GetMaximumRisk(dividendTransaction.OrderDate), 2); var performance = new TransactionPerformance(dividendTransaction.TransactionId, profit, percentage, purchases.First().OrderDate, dividendTransaction.OrderDate, r); return(performance); }
/// <summary> /// Processes the given event <paramref name="eventData"/> /// </summary> /// <param name="eventData">Event data</param> public void Handle(TransactionDividendCalculatedEvent eventData) { var item = new TransactionPerformance( eventData.AggregateId, eventData.ProfitAbsolute, eventData.ProfitPercentage, eventData.HoldingPeriod.StartDate, eventData.HoldingPeriod.EndDate, eventData.R); if (_writerRepository.GetById(eventData.AggregateId) == null) { _writerRepository.Add(item); } else { _writerRepository.Update(item); } }