Files
ARM64/MarketData/MarketDataLib/Generator/GainLoss/GainLossGenerator.cs
Sean eee0418271
Some checks failed
Build .NET Project / build (push) Has been cancelled
Create GLPriceCache to be used by GainLoss Generator.
2026-02-26 10:23:08 -05:00

128 lines
7.3 KiB
C#
Executable File

using System;
using System.Linq;
using System.Collections.Generic;
using MarketData;
using MarketData.MarketDataModel;
using MarketData.MarketDataModel.GainLoss;
using MarketData.Utils;
using MarketData.DataAccess;
using MarketData.Cache;
namespace MarketData.Generator.GainLoss
{
// ***************************************************************** G A I N L O S S G E N E R A T O R **********************************************************
public class GainLossGenerator : ITotalGainLossGenerator
{
public GainLossGenerator()
{
}
// *****************************************************************************************************************************************************************
// ************************************************ G E N E R A T E T O T A L G A I N L O S S / T O T A L G A I N L O S S P E R C E N T *******************
// *****************************************************************************************************************************************************************
public TotalGainLossCollection GenerateTotalGainLoss(PortfolioTrades portfolioTrades,DateTime? maxDateRef=null)
{
if (null == portfolioTrades || 0 == portfolioTrades.Count) return null;
GLPriceCache.GetInstance().Add(portfolioTrades);
DateTime minTradeDate = portfolioTrades.GetMinTradeDate();
DateTime maxDate=GLPriceCache.GetInstance().GetLatestDate();
if(null!=maxDateRef)maxDate=maxDateRef.Value;
Dictionary<DateTime,TotalGainLossItem> gainLossCollection = new Dictionary<DateTime, TotalGainLossItem>();
DateGenerator dateGenerator = new DateGenerator();
List<DateTime> holdingDates = dateGenerator.GenerateHistoricalDates(maxDate, minTradeDate);
for (int index = holdingDates.Count - 1; index >= 0; index--)
{
DateTime holdingDate = holdingDates[index];
double totalGainLoss = 0.00;;
double totalExposure = 0.00;
double totalCostBasis=0.00;
double totalMarketValue=0.00;
PortfolioTrades tradesOnOrBefore = portfolioTrades.GetTradesOnOrBefore(holdingDate);
if (null == tradesOnOrBefore || 0 == tradesOnOrBefore.Count)
{
gainLossCollection.Add(holdingDate, new TotalGainLossItem(holdingDate, 0,0,0,0));
continue;
}
foreach (PortfolioTrade portfolioTrade in tradesOnOrBefore)
{
double? gainLoss = null;
double? exposure = null;
double? costBasis=null;
double? marketValue=null;
gainLoss=GainLossHelper.GetTotalGainLoss(holdingDate,portfolioTrade);
costBasis=GainLossHelper.GetTotalCostBasis(holdingDate,portfolioTrade);
marketValue=GainLossHelper.GetTotalMarketValue(holdingDate,portfolioTrade);
exposure=GainLossHelper.GetTotalExposure(holdingDate,portfolioTrade);
if (null == gainLoss || null==costBasis || null==marketValue) continue;
if(null!=gainLoss) totalGainLoss += gainLoss.Value;
if (null != exposure) totalExposure += exposure.Value;
if(null!=costBasis)totalCostBasis+=costBasis.Value;
if(null!=marketValue)totalMarketValue+=marketValue.Value;
}
TotalGainLossItem gainLossElement = null;
double totalGainLossPercent=0;
if(0!=totalCostBasis)totalGainLossPercent=((totalMarketValue-totalCostBasis)/totalCostBasis)*100.00;
gainLossElement=new TotalGainLossItem(holdingDate,totalGainLoss,totalGainLossPercent,totalExposure,totalMarketValue);
gainLossCollection.Add(holdingDate, gainLossElement);
}
TotalGainLossCollection gainLossList = new TotalGainLossCollection(gainLossCollection.Values);
gainLossList.Sort();
return gainLossList;
}
// *****************************************************************************************************************************************************************
// ************************************************ G E N E R A T E T O T A L G A I N L O S S W I T H D I V I D E N D S / T O T A L G A I N L O S S P E R C E N T *******************
// *****************************************************************************************************************************************************************
public TotalGainLossCollection GenerateTotalGainLossWithDividends(PortfolioTrades portfolioTrades,DividendPayments dividendPayments,DateTime? maxDateRef=null)
{
if (null == portfolioTrades || 0 == portfolioTrades.Count) return null;
GLPriceCache.GetInstance().Add(portfolioTrades);
DateTime minTradeDate = portfolioTrades.GetMinTradeDate();
DateTime maxDate=GLPriceCache.GetInstance().GetLatestDate();
if(null!=maxDateRef)maxDate=maxDateRef.Value;
Dictionary<DateTime,TotalGainLossItem> gainLossCollection = new Dictionary<DateTime, TotalGainLossItem>();
DateGenerator dateGenerator = new DateGenerator();
List<DateTime> holdingDates = dateGenerator.GenerateHistoricalDates(maxDate, minTradeDate);
for (int index = holdingDates.Count - 1; index >= 0; index--)
{
DateTime holdingDate = holdingDates[index];
double totalGainLoss = 0.00;;
double totalExposure = 0.00;
double totalCostBasis=0.00;
double totalMarketValue=0.00;
PortfolioTrades tradesOnOrBefore = portfolioTrades.GetTradesOnOrBefore(holdingDate);
if (null == tradesOnOrBefore || 0 == tradesOnOrBefore.Count)
{
gainLossCollection.Add(holdingDate, new TotalGainLossItem(holdingDate, 0,0,0,0));
continue;
}
foreach (PortfolioTrade portfolioTrade in tradesOnOrBefore)
{
double? gainLoss = null;
double? exposure = null;
double? costBasis=null;
double? marketValue=null;
gainLoss=GainLossHelper.GetTotalGainLoss(holdingDate,portfolioTrade);
costBasis=GainLossHelper.GetTotalCostBasis(holdingDate,portfolioTrade);
marketValue=GainLossHelper.GetTotalMarketValue(holdingDate,portfolioTrade);
exposure=GainLossHelper.GetTotalExposure(holdingDate,portfolioTrade);
if (null == gainLoss || null==costBasis || null==marketValue) continue;
if(null!=gainLoss) totalGainLoss += gainLoss.Value;
if (null != exposure) totalExposure += exposure.Value;
if(null!=costBasis)totalCostBasis+=costBasis.Value;
if(null!=marketValue)totalMarketValue+=marketValue.Value;
}
TotalGainLossItem gainLossElement = null;
double totalGainLossPercent=0;
double dividendPaymentsToDate=dividendPayments.GetDividendPaymentsToDate(holdingDate);
totalMarketValue+=dividendPaymentsToDate;
totalGainLoss+=dividendPaymentsToDate;
if(0!=totalCostBasis)totalGainLossPercent=((totalMarketValue-totalCostBasis)/totalCostBasis)*100.00;
gainLossElement=new TotalGainLossItem(holdingDate,totalGainLoss,totalGainLossPercent,totalExposure,totalMarketValue,dividendPaymentsToDate);
gainLossCollection.Add(holdingDate, gainLossElement);
}
TotalGainLossCollection gainLossList = new TotalGainLossCollection(gainLossCollection.Values);
gainLossList.Sort();
return gainLossList;
}
}
}