示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
            }
        }