using System; using System.ComponentModel; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using MarketData; using MarketData.Utils; using MarketData.MarketDataModel; using MarketData.Generator; using MarketData.DataAccess; using TradeBlotter.DataAccess; using TradeBlotter.Command; using TradeBlotter.Model; using Microsoft.Research.DynamicDataDisplay.DataSources; using MarketData.Generator.TermStructure; using Microsoft.Research.DynamicDataDisplay.PointMarkers; using System.Threading; using MarketData.Numerical; namespace TradeBlotter.ViewModels { public class YieldCurveViewModel : WorkspaceViewModel { private enum Tasks { SelectedItem}; private Dictionary semaphorePool = new Dictionary(); private List dayCounts; private List curves; private Int32 selectedDayCount; private String selectedCurve; private YieldCurve yieldCurve; private DMAValues yieldCurveMA5; private DMAValues yieldCurveMA21; private DMAValues yieldCurveMA55; private TermStructureInterpolatorByDate termStrucureInterpolatorByDate; private DateTime selectedTermStructureDate; private List termStructureDates; private CurveData termStructureTenorCurveData; private CompositeDataSource termStructureTenorPointsDataSource; private CompositeDataSource termStructureDataSource; private CurveData termStructureTenorCurveData90; private CompositeDataSource termStructureTenorPointsDataSource90; private CompositeDataSource termStructureDataSource90; private CurveData termStructureTenorCurveData180; private CompositeDataSource termStructureTenorPointsDataSource180; private CompositeDataSource termStructureDataSource180; private CompositeDataSource yieldCurveCompositeDataSource; private CompositeDataSource ma5CompositeDataSource; private CompositeDataSource ma21CompositeDataSource; private CompositeDataSource ma55CompositeDataSource; private double dataSlope=double.NaN; // This is the slope of whatever data is presently being displayed. If TermStructure then it respresents the slope of the most recent curve private bool isLegendVisible = true; private bool busyIndicator = false; public YieldCurveViewModel() { semaphorePool.Add(Tasks.SelectedItem, new Semaphore(1, 1)); base.DisplayName = "YieldCurveView"; curves = new List(); curves.Add("1-Month"); curves.Add("3-Month"); curves.Add("6-Month"); curves.Add("1-Year"); curves.Add("2-Year"); curves.Add("3-Year"); curves.Add("5-Year"); curves.Add("7-Year"); curves.Add("10-Year"); curves.Add("20-Year"); curves.Add("30-Year"); curves.Add("Term Structure"); dayCounts = new List(); dayCounts.Add(60); dayCounts.Add(90); dayCounts.Add(180); dayCounts.Add(360); dayCounts.Add(720); dayCounts.Add(1440); dayCounts.Add(3600); termStructureDates=YieldCurveDA.GetYieldCurveDates(); PropertyChanged += OnYieldCurveViewModelPropertyChanged; selectedDayCount = dayCounts[1]; selectedCurve = curves[curves.Count-1]; base.OnPropertyChanged("SelectedDayCount"); SelectedTermStructureDate=termStructureDates[0]; } public override SaveParameters GetSaveParameters() { return null; } public override void SetSaveParameters(SaveParameters saveParameters) { } public override bool CanPersist() { return false; } public bool BusyIndicator { get { return busyIndicator; } set { busyIndicator = value; base.OnPropertyChanged("BusyIndicator"); } } private void OnYieldCurveViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs) { if (eventArgs.PropertyName.Equals("SelectedDayCount") || eventArgs.PropertyName.Equals("SelectedCurve")||eventArgs.PropertyName.Equals("SelectedTermStructureDate")) { BusyIndicator = true; Task workerTask = Task.Factory.StartNew(() => { if (null == selectedCurve) return; semaphorePool[Tasks.SelectedItem].WaitOne(); InitializeDataSource(); UpdateProperties(); yieldCurve = YieldCurveDA.GetYieldCurve(selectedDayCount * 2); if (selectedCurve.Equals("1-Month")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo1, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo1, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo1, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Mo1); CalculateSlope(values); } else if (selectedCurve.Equals("3-Month")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo3, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo3, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo3, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Mo3); CalculateSlope(values); } else if (selectedCurve.Equals("6-Month")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo6, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo6, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Mo6, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Mo6); CalculateSlope(values); } else if (selectedCurve.Equals("1-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr1, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr1, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr1, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr1); CalculateSlope(values); } else if (selectedCurve.Equals("2-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr2, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr2, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr2, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr2); CalculateSlope(values); } else if (selectedCurve.Equals("3-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr3, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr3, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr3, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr3); CalculateSlope(values); } else if (selectedCurve.Equals("5-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr5, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr5, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr5, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr5); CalculateSlope(values); } else if (selectedCurve.Equals("7-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr7, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr7, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr7, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr7); CalculateSlope(values); } else if (selectedCurve.Equals("10-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr10, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr10, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr10, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr10); CalculateSlope(values); } else if (selectedCurve.Equals("20-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr20, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr20, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr20, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55);; double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr20); CalculateSlope(values); } else if (selectedCurve.Equals("30-Year")) { termStrucureInterpolatorByDate=null; yieldCurveMA5 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr30, 5); yieldCurveMA21 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr30, 21); yieldCurveMA55 = yieldCurve.GetMovingAverage(YieldCurve.CurveType.Yr30, 55); yieldCurveCompositeDataSource=YieldCurveModel.Value(yieldCurveMA5); ma5CompositeDataSource=YieldCurveModel.MA(yieldCurveMA5); ma21CompositeDataSource=YieldCurveModel.MA(yieldCurveMA21); ma55CompositeDataSource=YieldCurveModel.MA(yieldCurveMA55); double[] values=yieldCurve.GetYieldCurveDataOrderByDateAscending(YieldCurve.CurveType.Yr30); CalculateSlope(values); } else if(selectedCurve.Equals("Term Structure")) { termStrucureInterpolatorByDate=new TermStructureInterpolatorByDate(); DateGenerator dateGenerator=new DateGenerator(); DateTime termStructureDate90=dateGenerator.GenerateHistoricalDate(selectedTermStructureDate,90); DateTime termStructureDate180=dateGenerator.GenerateHistoricalDate(selectedTermStructureDate,180); termStrucureInterpolatorByDate.Add(selectedTermStructureDate,new TermStructureInterpolator(selectedTermStructureDate)); termStrucureInterpolatorByDate.Add(termStructureDate90,new TermStructureInterpolator(termStructureDate90)); termStrucureInterpolatorByDate.Add(termStructureDate180,new TermStructureInterpolator(termStructureDate180)); termStructureTenorCurveData=TermStructureModel.GetTenorCurve(termStrucureInterpolatorByDate,selectedTermStructureDate); termStructureDataSource=TermStructureModel.GetInterpolatedRates(termStrucureInterpolatorByDate,selectedTermStructureDate); termStructureTenorPointsDataSource=TermStructureModel.GetTenorRates(termStrucureInterpolatorByDate,selectedTermStructureDate); termStructureTenorCurveData90=TermStructureModel.GetTenorCurve(termStrucureInterpolatorByDate,termStructureDate90); termStructureDataSource90=TermStructureModel.GetInterpolatedRates(termStrucureInterpolatorByDate,termStructureDate90); termStructureTenorPointsDataSource90=TermStructureModel.GetTenorRates(termStrucureInterpolatorByDate,termStructureDate90); termStructureTenorCurveData180=TermStructureModel.GetTenorCurve(termStrucureInterpolatorByDate,termStructureDate180); termStructureDataSource180=TermStructureModel.GetInterpolatedRates(termStrucureInterpolatorByDate,termStructureDate180); termStructureTenorPointsDataSource180=TermStructureModel.GetTenorRates(termStrucureInterpolatorByDate,termStructureDate180); double[] values=(from Tenor tenor in termStructureTenorCurveData.CurveTenors select tenor.ValueNum).ToArray(); CalculateSlope(values); yieldCurve = null; yieldCurveMA5 = null; yieldCurveMA21 = null; yieldCurveMA55 = null; } }); workerTask.ContinueWith((continuation) => { BusyIndicator = false; UpdateProperties(); semaphorePool[Tasks.SelectedItem].Release(); }); } } public void CalculateSlope(double[] observations) { if(observations==null)return; LeastSquaresResultWithR2 leastSquaresResult=LeastSquaresHelper.CalculateLeastSquaresWithR2(observations); dataSlope=leastSquaresResult.Slope; } public void InitializeDataSource() { termStrucureInterpolatorByDate=null; if(null!=yieldCurveCompositeDataSource)yieldCurveCompositeDataSource.Clear(); if(null!=termStructureTenorPointsDataSource)termStructureTenorPointsDataSource.Clear(); if(null!=termStructureDataSource)termStructureDataSource.Clear(); if(null!=termStructureTenorPointsDataSource90)termStructureTenorPointsDataSource90.Clear(); if(null!=termStructureDataSource90)termStructureDataSource90.Clear(); if(null!=termStructureTenorPointsDataSource180)termStructureTenorPointsDataSource180.Clear(); if(null!=termStructureDataSource180)termStructureDataSource180.Clear(); if(null!=ma5CompositeDataSource)ma5CompositeDataSource.Clear(); if(null!=ma21CompositeDataSource)ma21CompositeDataSource.Clear(); if(null!=ma55CompositeDataSource)ma55CompositeDataSource.Clear(); } private void UpdateProperties() { base.OnPropertyChanged("Values"); base.OnPropertyChanged("MA5"); base.OnPropertyChanged("MA21"); base.OnPropertyChanged("MA55"); base.OnPropertyChanged("TermStructure"); base.OnPropertyChanged("TermStructure90"); base.OnPropertyChanged("TermStructure180"); base.OnPropertyChanged("TermStructureTenors"); base.OnPropertyChanged("TermStructureTenors90"); base.OnPropertyChanged("TermStructureTenors180"); base.OnPropertyChanged("TermStructureTenorMarkers"); base.OnPropertyChanged("TermStructureTenorMarkers90"); base.OnPropertyChanged("TermStructureTenorMarkers180"); base.OnPropertyChanged("DayCountsEnabled"); base.OnPropertyChanged("TermStructureDatesEnabled"); base.OnPropertyChanged("DataSlope"); base.OnPropertyChanged("DataSlopeDescription"); base.OnPropertyChanged("Title"); } // **************************************************** C O M P O S I T E D A T A S O U R C E ************************************************* // ********************************************************************************************************************************************** public CompositeDataSource Values { get { if (null == selectedCurve||selectedCurve.Equals("Term Structure")) return null; return yieldCurveCompositeDataSource; } } public CompositeDataSource MA5 { get { if (null == selectedCurve||selectedCurve.Equals("Term Structure")) return null; return ma5CompositeDataSource; } } public CompositeDataSource MA21 { get { if (null == selectedCurve||selectedCurve.Equals("Term Structure")) return null; return ma21CompositeDataSource; } } public CompositeDataSource MA55 { get { if (null == selectedCurve||selectedCurve.Equals("Term Structure")) return null; return ma55CompositeDataSource; // return YieldCurveModel.MA(yieldCurveMA55); } } // **************************************************************************************************************************************************** // ****************************************************************** T E R M S T R U C T U R E **************************************************** // **************************************************************************************************************************************************** public CompositeDataSource TermStructure { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource||!selectedCurve.Equals("Term Structure"))return null; return termStructureDataSource; } } public CompositeDataSource TermStructureTenors { get { if(null==termStrucureInterpolatorByDate||null==termStructureTenorPointsDataSource||!selectedCurve.Equals("Term Structure"))return null; return termStructureTenorPointsDataSource; } } public CenteredTextMarker[] TermStructureTenorMarkers { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource||!selectedCurve.Equals("Term Structure"))return null; List centeredTextMarkers=new List(); if(null==termStructureTenorCurveData)return null; CenteredTextMarker centeredTextMarker=null; StringBuilder sb=null; sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("1D")).Append("(").Append("1D").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("1M")).Append("(").Append("1M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("3M")).Append("(").Append("3M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("6M")).Append("(").Append("6M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("1Y")).Append("(").Append("1Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("2Y")).Append("(").Append("2Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("3Y")).Append("(").Append("3Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("5Y")).Append("(").Append("5Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("7Y")).Append("(").Append("7Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("10Y")).Append("(").Append("10Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("20Y")).Append("(").Append("20Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData.GetTenorValue("30Y")).Append("(").Append("30Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarker.VerticalShift="45"; centeredTextMarkers.Add(centeredTextMarker); return centeredTextMarkers.ToArray(); } } public CompositeDataSource TermStructure90 { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource90||!selectedCurve.Equals("Term Structure"))return null; return termStructureDataSource90; } } public CompositeDataSource TermStructureTenors90 { get { if(null==termStrucureInterpolatorByDate||null==termStructureTenorPointsDataSource90||!selectedCurve.Equals("Term Structure"))return null; return termStructureTenorPointsDataSource90; } } public CenteredTextMarker[] TermStructureTenorMarkers90 { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource90||!selectedCurve.Equals("Term Structure"))return null; List centeredTextMarkers=new List(); if(null==termStructureTenorCurveData90)return null; CenteredTextMarker centeredTextMarker=null; StringBuilder sb=null; sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("1D")).Append("(").Append("1D").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("1M")).Append("(").Append("1M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("3M")).Append("(").Append("3M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("6M")).Append("(").Append("6M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("1Y")).Append("(").Append("1Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("2Y")).Append("(").Append("2Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("3Y")).Append("(").Append("3Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("5Y")).Append("(").Append("5Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("7Y")).Append("(").Append("7Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("10Y")).Append("(").Append("10Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("20Y")).Append("(").Append("20Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData90.GetTenorValue("30Y")).Append("(").Append("30Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarker.VerticalShift="45"; centeredTextMarkers.Add(centeredTextMarker); return centeredTextMarkers.ToArray(); } } public CompositeDataSource TermStructure180 { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource180||!selectedCurve.Equals("Term Structure"))return null; return termStructureDataSource180; } } public CompositeDataSource TermStructureTenors180 { get { if(null==termStrucureInterpolatorByDate||null==termStructureTenorPointsDataSource180||!selectedCurve.Equals("Term Structure"))return null; return termStructureTenorPointsDataSource180; } } public CenteredTextMarker[] TermStructureTenorMarkers180 { get { if(null==termStrucureInterpolatorByDate||null==termStructureDataSource180||!selectedCurve.Equals("Term Structure"))return null; List centeredTextMarkers=new List(); if(null==termStructureTenorCurveData180)return null; CenteredTextMarker centeredTextMarker=null; StringBuilder sb=null; sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("1D")).Append("(").Append("1D").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("1M")).Append("(").Append("1M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("3M")).Append("(").Append("3M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("6M")).Append("(").Append("6M").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("1Y")).Append("(").Append("1Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("2Y")).Append("(").Append("2Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("3Y")).Append("(").Append("3Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("5Y")).Append("(").Append("5Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("7Y")).Append("(").Append("7Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("10Y")).Append("(").Append("10Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("20Y")).Append("(").Append("20Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarkers.Add(centeredTextMarker); sb=new StringBuilder(); centeredTextMarker=new CenteredTextMarker(); sb.Append(termStructureTenorCurveData180.GetTenorValue("30Y")).Append("(").Append("30Y").Append(")"); centeredTextMarker.Text=sb.ToString(); centeredTextMarker.VerticalShift="45"; centeredTextMarkers.Add(centeredTextMarker); return centeredTextMarkers.ToArray(); } } // ********************************************************************************************************************************************************* public Boolean CheckBoxLegendVisible { get { return isLegendVisible; } set { isLegendVisible = value; base.OnPropertyChanged("CheckBoxLegendVisible"); base.OnPropertyChanged("LegendVisible"); } } public String LegendVisible { get { if (isLegendVisible) return "true"; return "false"; } set { isLegendVisible = Boolean.Parse(value); base.OnPropertyChanged("LegendVisible"); } } public override String Title { get { if(selectedCurve.Equals("Term Structure")) { return "Treasury Yield Curve - Interest Rates "+"("+selectedCurve+") Curve Date ("+Utility.DateTimeToStringMMSDDSYYYY(selectedTermStructureDate)+")"; } else { if(null==yieldCurve||0==yieldCurve.Count)return ""; return "Treasury Yield Curve - Interest Rates "+"("+selectedCurve+") Thru "+Utility.DateTimeToStringMMSDDSYYYY(yieldCurve[0].Date); } } } public bool TermStructureDatesEnabled { get{return selectedCurve.Equals("Term Structure")?true:false;} } public Boolean DayCountsEnabled { get{return selectedCurve.Equals("Term Structure")?false:true;} } public DateTime SelectedTermStructureDate { get{return selectedTermStructureDate;} set{selectedTermStructureDate=value;base.OnPropertyChanged("SelectedTermStructureDate");} } public List TermStructureDates { get{return termStructureDates;} } public List DayCounts { get { return dayCounts; } } public Int32 SelectedDayCount { get { return selectedDayCount; } set { selectedDayCount = value; base.OnPropertyChanged("SelectedDayCount"); } } public List Curves { get { return curves; } } public String SelectedCurve { get { return selectedCurve; } set { selectedCurve = value; base.OnPropertyChanged("SelectedCurve"); } } public String DataSlope { get { if(dataSlope.Equals(double.NaN))return Utility.FormatNumber(0,3); return Utility.FormatNumber(dataSlope,3); } } // *********************************************************************************************************************************************************************************** // ********************************************************************************* T O O L T I P C A L L O U T S **************************************************************** // *********************************************************************************************************************************************************************************** public String DataSlopeDescription { get { StringBuilder sb=new StringBuilder(); if(selectedCurve.Equals("Term Structure")) { sb.Append("Term Structure: A positive slope implies the bond market expects the economy to do well,").Append("\n"); sb.Append("and a negative slope implies the bond market expects the economy to do badly.").Append("\n"); sb.Append("A negatively sloped – inverted – yield curve implies that investors expect interest").Append("\n"); sb.Append(" rates to be lower in the future."); } else { sb.Append("Slope of selected data tenor."); } return sb.ToString(); } } } }