using System; using System.ComponentModel; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Threading.Tasks; using System.Linq; using System.Text; using System.Windows.Input; using System.Windows.Threading; using MarketData; using MarketData.Utils; using MarketData.MarketDataModel; using MarketData.Generator; using MarketData.DataAccess; using TradeBlotter.DataAccess; using TradeBlotter.Model; using TradeBlotter.Command; using Microsoft.Research.DynamicDataDisplay.DataSources; using TradeBlotter.Cache; namespace TradeBlotter.ViewModels { public class MovingAverageViewModel : WorkspaceViewModel { private MovingAverages movingAverages; private String symbol; private String companyName; private List symbols; private List watchLists; private String selectedWatchList; private RelayCommand refreshCommand; private List dayCounts; private Int32 selectedDayCount; private PortfolioTrades portfolioTrades; private bool busyIndicator = false; private String busyContent = "Generating Moving Average"; private bool isLegendVisible = true; public MovingAverageViewModel() { base.DisplayName = "MovingAverageView"; watchLists = WatchListDA.GetWatchLists(); watchLists.Insert(0, Constants.CONST_ALL); selectedWatchList = watchLists.Find(x => x.Equals("Valuations")); symbols = WatchListDA.GetWatchList(selectedWatchList); dayCounts = new List(); dayCounts.Add(60); dayCounts.Add(90); dayCounts.Add(180); dayCounts.Add(360); dayCounts.Add(720); dayCounts.Add(1440); dayCounts.Add(3600); selectedDayCount = dayCounts[3]; PropertyChanged += OnMovingAverageViewModelPropertyChanged; } public override SaveParameters GetSaveParameters() { SaveParameters saveParams = new SaveParameters(); if (null == symbol) return null; saveParams.Add(new KeyValuePair("Type", GetType().Namespace + "." + GetType().Name)); saveParams.Add(new KeyValuePair("SelectedSymbol", symbol)); saveParams.Add(new KeyValuePair("SelectedWatchList", selectedWatchList)); saveParams.Add(new KeyValuePair("SelectedDayCount", selectedDayCount.ToString())); saveParams.Add(new KeyValuePair("IsLegendVisible", isLegendVisible.ToString())); return saveParams; } public override void SetSaveParameters(SaveParameters saveParameters) { try { symbol = (from KeyValuePair item in saveParameters where item.Key.Equals("SelectedSymbol") select item).FirstOrDefault().Value; selectedWatchList = (from KeyValuePair item in saveParameters where item.Key.Equals("SelectedWatchList") select item).FirstOrDefault().Value; base.OnPropertyChanged("SelectedWatchList"); selectedDayCount = Int32.Parse((from KeyValuePair item in saveParameters where item.Key.Equals("SelectedDayCount") select item).FirstOrDefault().Value); try{isLegendVisible = Boolean.Parse((from KeyValuePair item in saveParameters where item.Key.Equals("IsLegendVisible") select item).FirstOrDefault().Value);} catch (Exception){;} Referer=saveParameters.Referer; base.OnPropertyChanged("SelectedSymbol"); } catch (Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception:{0}",exception.ToString())); } } public override bool CanPersist() { return true; } private void OnMovingAverageViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs) { if (eventArgs.PropertyName.Equals("SelectedSymbol")||(eventArgs.PropertyName.Equals("SelectedDayCount")&&null!=symbol)) { BusyIndicator = true; Task workerTask = Task.Factory.StartNew(() => { companyName = PricingDA.GetNameForSymbol(symbol); movingAverages = MovingAverageGenerator.GenerateMovingAverages(symbol, selectedDayCount); if (null != movingAverages) portfolioTrades = PortfolioDA.GetOpenTradesSymbolBetween(symbol, movingAverages.FromDate, movingAverages.ThruDate); else portfolioTrades = null; }); workerTask.ContinueWith((continuation) => { BusyIndicator = false; base.OnPropertyChanged("Close"); base.OnPropertyChanged("High"); base.OnPropertyChanged("Low"); base.OnPropertyChanged("MA200"); base.OnPropertyChanged("MA100"); base.OnPropertyChanged("MA55"); base.OnPropertyChanged("MA21"); base.OnPropertyChanged("MA5"); base.OnPropertyChanged("Title"); base.OnPropertyChanged("TradePoints"); base.OnPropertyChanged("LegendVisible"); }); } else if (eventArgs.PropertyName.Equals("SelectedWatchList")) { // if (selectedWatchList.Equals(Constants.CONST_ALL)) symbols = PricingDA.GetSymbols(); if (selectedWatchList.Equals(Constants.CONST_ALL)) symbols = SymbolCache.GetInstance().GetSymbols(); else symbols = WatchListDA.GetWatchList(selectedWatchList); base.OnPropertyChanged("Symbols"); } } public bool BusyIndicator { get { return busyIndicator; } set { busyIndicator = value; base.OnPropertyChanged("BusyIndicator"); } } public String BusyContent { get { return busyContent; } } public CompositeDataSource Close { get { CompositeDataSource compositeDataSource = MovingAverageModel.Close(movingAverages); return compositeDataSource; } } public CompositeDataSource High { get { CompositeDataSource compositeDataSource = MovingAverageModel.High(movingAverages); return compositeDataSource; } } public CompositeDataSource Low { get { CompositeDataSource compositeDataSource = MovingAverageModel.Low(movingAverages); return compositeDataSource; } } public CompositeDataSource MA200 { get { CompositeDataSource compositeDataSource = MovingAverageModel.MA200(movingAverages); return compositeDataSource; } } public CompositeDataSource MA100 { get { CompositeDataSource compositeDataSource = MovingAverageModel.MA100(movingAverages); return compositeDataSource; } } public CompositeDataSource MA55 { get { CompositeDataSource compositeDataSource = MovingAverageModel.MA55(movingAverages); return compositeDataSource; } } public CompositeDataSource MA21 { get { CompositeDataSource compositeDataSource = MovingAverageModel.MA21(movingAverages); return compositeDataSource; } } public CompositeDataSource MA5 { get { CompositeDataSource compositeDataSource = MovingAverageModel.MA5(movingAverages); return compositeDataSource; } } public CompositeDataSource TradePoints { get { CompositeDataSource compositeDataSource = PortfolioTradeModel.PortfolioTrades(portfolioTrades); return compositeDataSource; } } public override String Title { get { if (null == companyName || null == movingAverages || 0 == movingAverages.Count) return ""; StringBuilder sb=new StringBuilder(); String displayCompanyName=companyName; if(displayCompanyName.Length>40) displayCompanyName=displayCompanyName.Substring(0,40)+"..."; sb.Append(displayCompanyName); sb.Append(" (").Append(symbol).Append(") ").Append(Utility.DateTimeToStringMMHDDHYYYY(movingAverages.FromDate)).Append(" Thru ").Append(Utility.DateTimeToStringMMHDDHYYYY(movingAverages.ThruDate)); Prices prices=PricingDA.GetPrices(symbol,2); if(2==prices.Count) { float change=prices.GetReturns()[0]; sb.Append(" (").Append(Utility.FormatCurrency(prices[0].Close)); sb.Append("/").Append(Utility.FormatCurrency(prices[0].Low)); if(!float.IsNaN(change)) { sb.Append(","); sb.Append(change>=0.00?"+":"").Append(Utility.FormatPercent((double)change)); } sb.Append(")"); } return sb.ToString(); } } 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 List DayCounts { get { return dayCounts; } } public Int32 SelectedDayCount { get { return selectedDayCount; } set { selectedDayCount = value; base.OnPropertyChanged("SelectedDayCount"); } } public List Symbols { get { return symbols; } } public String SelectedSymbol { get { return symbol; } set { if (value == symbol || String.IsNullOrEmpty(value)) return; symbol = value; base.OnPropertyChanged("SelectedSymbol"); } } public List WatchListNames { get { return watchLists; } set { ;} } public String SelectedWatchList { get { return selectedWatchList; } set { selectedWatchList = value; base.OnPropertyChanged("SelectedWatchList"); } } private void Refresh() { base.OnPropertyChanged("SelectedSymbol"); } private Boolean CanRefresh { get { return true; } } public ICommand RefreshCommand { get { if (null == refreshCommand) refreshCommand = new RelayCommand(param => Refresh(), param => CanRefresh); return refreshCommand; } } } }