Init
This commit is contained in:
317
ViewModels/ValueAtRiskViewModel.cs
Normal file
317
ViewModels/ValueAtRiskViewModel.cs
Normal file
@@ -0,0 +1,317 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user