Files
TradeBlotter/ViewModels/ValueAtRiskViewModel.cs
2024-02-23 06:58:53 -05:00

318 lines
10 KiB
C#

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using MarketData.Utils;
using MarketData.MarketDataModel;
using MarketData.DataAccess;
using MarketData.ValueAtRisk;
using TradeBlotter.Command;
using TradeBlotter.Model;
using System.Windows;
namespace TradeBlotter.ViewModels
{
public class ValueAtRiskViewModel : WorkspaceViewModel
{
private List<String> dayCounts = new List<String>() { "30", "60", "90", "180", "252","504" };
private List<String> confidenceValues = new List<String>() {"90","95","98" };
private String selectedDayCount;
private String selectedConfidence;
private DateTime selectedDate = Utility.Epoch;
private DateTime selectableDateStart = Utility.Epoch;
private DateTime selectableDateEnd = DateTime.Now;
private PortfolioHoldingViewModel selectedItem = null;
private ObservableCollection<PortfolioHoldingViewModel> portfolioHoldingsViewModelCollection = null;
private VaRResult varResult;
private bool busyIndicator = true;
private String busyContent = "Calculating VaR";
private RelayCommand removeCommand;
private RelayCommand resetCommand;
public ValueAtRiskViewModel()
{
base.DisplayName = "ValueAtRiskViewModel";
PropertyChanged += OnValueAtRiskViewModelPropertyChanged;
Initialize();
}
private void Initialize()
{
BusyIndicator = true;
selectedDayCount = dayCounts[3];
selectedConfidence = confidenceValues[1];
PortfolioTrades portfolioTrades = PortfolioDA.GetOpenTrades();
selectableDateStart=(from portfolioTrade in portfolioTrades select portfolioTrade.TradeDate).Min();
List<String> holdingSymbols = (from portfolioTrade in portfolioTrades select portfolioTrade.Symbol).Distinct().ToList();
selectedDate = selectableDateEnd=PricingDA.GetLatestDate(holdingSymbols);
PortfolioHoldings portfolioHoldings = PortfolioHoldings.GetPortfolioHoldings(portfolioTrades, Int16.Parse(selectedDayCount),selectedDate);
portfolioHoldingsViewModelCollection =PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldings);
varResult = HistoricalVaR.GetVaR(portfolioHoldings, double.Parse(selectedConfidence));
base.OnPropertyChanged("SelectedDayCount");
base.OnPropertyChanged("SelectedConfidence");
base.OnPropertyChanged("AllHoldings");
base.OnPropertyChanged("ValueAtRisk");
base.OnPropertyChanged("ValueAtRiskPercent");
base.OnPropertyChanged("SelectedDate");
BusyIndicator = false;
}
private void CalculateVaR()
{
}
public override SaveParameters GetSaveParameters()
{
return null;
}
public override void SetSaveParameters(SaveParameters saveParameters)
{
}
public override bool CanPersist()
{
return false;
}
private void OnValueAtRiskViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs)
{
if (eventArgs.PropertyName.Equals("SelectedDate"))
{
Task workerTask = Task.Factory.StartNew(() =>
{
BusyIndicator = true;
PortfolioTrades portfolioTrades = PortfolioDA.GetOpenTradesAsOf(selectedDate);
PortfolioHoldings portfolioHoldings = PortfolioHoldings.GetPortfolioHoldings(portfolioTrades, Int16.Parse(selectedDayCount), selectedDate);
varResult = HistoricalVaR.GetVaR(portfolioHoldings, double.Parse(selectedConfidence));
portfolioHoldingsViewModelCollection = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldings);
if(!varResult.Success) {MessageBox.Show(varResult.Message,varResult.Success.ToString());ZeroVaRData();}
});
workerTask.ContinueWith((continuation)=>
{
BusyIndicator = false;
base.OnPropertyChanged("AllHoldings");
base.OnPropertyChanged("ValueAtRisk");
base.OnPropertyChanged("ValueAtRiskPercent");
});
}
else if (eventArgs.PropertyName.Equals("SelectedDayCount"))
{
BusyIndicator = true;
Task workerTask = Task.Factory.StartNew(() =>
{
PortfolioHoldings portfolioHoldings = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldingsViewModelCollection);
portfolioHoldings.UpdateDayCount(Int16.Parse(selectedDayCount));
varResult = HistoricalVaR.GetVaR(portfolioHoldings, double.Parse(selectedConfidence));
portfolioHoldingsViewModelCollection = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldings);
if(!varResult.Success) {MessageBox.Show(varResult.Message,varResult.Success.ToString());ZeroVaRData();}
});
workerTask.ContinueWith((continuation) =>
{
BusyIndicator = false;
base.OnPropertyChanged("AllHoldings");
base.OnPropertyChanged("ValueAtRisk");
base.OnPropertyChanged("ValueAtRiskPercent");
});
}
else if (eventArgs.PropertyName.Equals("SelectedConfidence"))
{
BusyIndicator = true;
Task workerTask = Task.Factory.StartNew(() =>
{
PortfolioHoldings portfolioHoldings = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldingsViewModelCollection);
varResult = HistoricalVaR.GetVaR(portfolioHoldings, double.Parse(selectedConfidence));
portfolioHoldingsViewModelCollection = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldings);
if(!varResult.Success) {MessageBox.Show(varResult.Message,varResult.Success.ToString());ZeroVaRData();}
});
workerTask.ContinueWith((continuation) =>
{
BusyIndicator = false;
base.OnPropertyChanged("AllHoldings");
base.OnPropertyChanged("ValueAtRisk");
base.OnPropertyChanged("ValueAtRiskPercent");
});
}
}
public bool BusyIndicator
{
get{return busyIndicator;}
set
{
busyIndicator=value;
base.OnPropertyChanged("BusyIndicator");
}
}
public String BusyContent
{
get{return busyContent;}
}
public override String Title
{
get { return "Historical VaR"; }
}
public PortfolioHoldingViewModel SelectedItem
{
get
{
return selectedItem;
}
set
{
selectedItem = value;
foreach (PortfolioHoldingViewModel portfolioHoldingViewModel in portfolioHoldingsViewModelCollection)
{
portfolioHoldingViewModel.IsSelected = false;
}
if (null != selectedItem)
{
selectedItem.IsSelected = true;
}
}
}
private void ZeroVaRData()
{
foreach(PortfolioHoldingViewModel item in portfolioHoldingsViewModelCollection)
{
item.Contribution=0.00;
item.ContributionDate=Utility.Epoch;
}
}
// VaR measure a negaitve event (i.e.) losses to portfolio value and is therefore a negative number. However, convention has been to display this number as a positive number
// presumably to make for an easier visual interpretation. We follow that convention here by making VaR positive as it is passed to the view.
public double ValueAtRisk
{
get
{
return Math.Abs(varResult.VaRExpectedLoss);
}
}
public double ValueAtRiskPercent
{
get
{
return Math.Abs(varResult.VaRPercent);
}
}
public ObservableCollection<PortfolioHoldingViewModel> AllHoldings
{
get
{
return portfolioHoldingsViewModelCollection;
}
set
{
portfolioHoldingsViewModelCollection = value;
}
}
public List<String> DayCounts
{
get { return dayCounts; }
}
public String SelectedDayCount
{
get
{
return selectedDayCount;
}
set
{
selectedDayCount = value;
base.OnPropertyChanged("SelectedDayCount");
}
}
public List<String> ConfidenceValues
{
get { return confidenceValues; }
}
public String SelectedConfidence
{
get
{
return selectedConfidence;
}
set
{
selectedConfidence = value;
base.OnPropertyChanged("SelectedConfidence");
}
}
public DateTime SelectedDate
{
get
{
return selectedDate;
}
set
{
if (!value.Date.Equals(selectedDate.Date))
{
selectedDate = value;
base.OnPropertyChanged("SelectedDate");
}
}
}
public DateTime SelectableDateStart
{
get { return selectableDateStart; }
}
public DateTime SelectableDateEnd
{
get { return selectableDateEnd; }
}
// ****************************************************C O M M A N D S ***************************************************
private void Reset()
{
Initialize();
}
private bool CanReset
{
get { return true; }
}
public ICommand ResetCommand
{
get
{
if (resetCommand == null)
{
resetCommand = new RelayCommand(param => this.Reset(), param => this.CanReset);
}
return resetCommand;
}
}
private void Remove()
{
if (null == selectedItem)
{
Console.Beep();
return;
}
BusyIndicator = true;
portfolioHoldingsViewModelCollection.Remove(selectedItem);
PortfolioHoldings portfolioHoldings = PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldingsViewModelCollection);
varResult = HistoricalVaR.GetVaR(portfolioHoldings, double.Parse(selectedConfidence));
portfolioHoldingsViewModelCollection=PortfolioHoldingsViewModelCollectionHelper.CreateCollection(portfolioHoldings);
BusyIndicator = false;
selectedItem = null;
base.OnPropertyChanged("AllHoldings");
base.OnPropertyChanged("ValueAtRisk");
base.OnPropertyChanged("ValueAtRiskPercent");
base.OnPropertyChanged("SelectedItem");
}
private bool CanRemove
{
get { return true; }
}
public ICommand RemoveCommand
{
get
{
if (removeCommand == null)
{
removeCommand = new RelayCommand(param => this.Remove(), param => this.CanRemove);
}
return removeCommand;
}
}
}
}