773 lines
32 KiB
C#
773 lines
32 KiB
C#
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.Windows.Input;
|
|
using System.Threading.Tasks;
|
|
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 System.Threading;
|
|
using System.Windows;
|
|
using TradeBlotter.Cache;
|
|
|
|
namespace TradeBlotter.ViewModels
|
|
{
|
|
public class HeadlinesViewModel : WorkspaceViewModel
|
|
{
|
|
private enum Tasks{SelectedSymbol,SelectedDate};
|
|
private Dictionary<Tasks,Semaphore> semaphorePool=new Dictionary<Tasks,Semaphore>();
|
|
private const String DISPLAY_NAME = "Headlines";
|
|
private List<String> symbols;
|
|
private List<String> watchLists;
|
|
private List<String> dates;
|
|
private String selectedWatchList;
|
|
private String selectedSymbol;
|
|
private String selectedCompany;
|
|
private String selectedDate = null;
|
|
private ObservableCollection<HeadlineSentiment> headlinesSentimentCollection = null;
|
|
private bool busyIndicator = false;
|
|
private RelayCommand browserCommand;
|
|
private RelayCommand refreshCommand;
|
|
private RelayCommand stochasticsCommand;
|
|
private RelayCommand relativeStrengthCommand;
|
|
private RelayCommand macdCommand;
|
|
private RelayCommand bollingerBandCommand;
|
|
private RelayCommand priceHistoryCommand;
|
|
private RelayCommand stickerValuationCommand;
|
|
private RelayCommand dcfValuationCommand;
|
|
private RelayCommand dividendHistoryCommand;
|
|
private RelayCommand analystRatingsCommand;
|
|
private RelayCommand displaySECFilingsCommand;
|
|
private RelayCommand movingAverageCommand;
|
|
private RelayCommand displayHistoricalCommand;
|
|
private RelayCommand displayHeadlinesCommand;
|
|
private RelayCommand removeFromWatchListCommand;
|
|
private RelayCommand addToWatchListCommand;
|
|
private RelayCommand proformaDividendRiskCommand = null;
|
|
private HeadlineSentiment selectedItem;
|
|
|
|
public HeadlinesViewModel(bool loadedFromParams=false)
|
|
{
|
|
semaphorePool.Add(Tasks.SelectedSymbol,new Semaphore(1,1));
|
|
semaphorePool.Add(Tasks.SelectedDate,new Semaphore(1,1));
|
|
base.DisplayName = DISPLAY_NAME;
|
|
watchLists = WatchListDA.GetWatchLists();
|
|
watchLists.Insert(0, Constants.CONST_ALL);
|
|
selectedWatchList = watchLists.Find(x => x.Equals("Valuations"));
|
|
symbols = WatchListDA.GetWatchList(selectedWatchList);
|
|
symbols.Insert(0, Constants.CONST_ALL);
|
|
selectedSymbol=symbols[0];
|
|
dates = HeadlinesDA.GetHeadlineDates();
|
|
if(dates.Count>0)selectedDate = dates[0];
|
|
PropertyChanged += OnHeadlinesViewModelPropertyChanged;
|
|
if(!loadedFromParams)base.OnPropertyChanged("SelectedSymbol");
|
|
}
|
|
// ******************************************************************************************** P E R S I S T E N C E ********************************************************************************************
|
|
public override bool CanPersist()
|
|
{
|
|
return true;
|
|
}
|
|
public override SaveParameters GetSaveParameters()
|
|
{
|
|
SaveParameters saveParams = new SaveParameters();
|
|
if (null == selectedSymbol) return null;
|
|
saveParams.Add(new KeyValuePair<String, String>("Type", GetType().Namespace + "." + GetType().Name));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedSymbol", selectedSymbol));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedCompany", selectedCompany));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedWatchList", selectedWatchList));
|
|
saveParams.Add(new KeyValuePair<String, String>("SelectedDate", selectedDate));
|
|
return saveParams;
|
|
}
|
|
public override void SetSaveParameters(SaveParameters saveParameters)
|
|
{
|
|
try
|
|
{
|
|
selectedSymbol = (from KeyValuePair<String, String> item in saveParameters where item.Key.Equals("SelectedSymbol") select item).FirstOrDefault().Value;
|
|
selectedWatchList = (from KeyValuePair<String, String> item in saveParameters where item.Key.Equals("SelectedWatchList") select item).FirstOrDefault().Value;
|
|
selectedCompany = (from KeyValuePair<String, String> item in saveParameters where item.Key.Equals("SelectedCompany") select item).FirstOrDefault().Value;
|
|
selectedDate = (from KeyValuePair<String, String> item in saveParameters where item.Key.Equals("SelectedDate") select item).FirstOrDefault().Value;
|
|
if(null==selectedCompany)selectedCompany=PricingDA.GetNameForSymbol(selectedSymbol);
|
|
if (null == selectedDate || selectedDate!=DateTime.Now.Date.ToShortDateString()) selectedDate = HeadlinesDA.GetMaxHeadlineDate().ToShortDateString();
|
|
Referer=saveParameters.Referer;
|
|
base.OnPropertyChanged("SelectedWatchList");
|
|
base.OnPropertyChanged("SelectedSymbol");
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception:{0}", exception.ToString()));
|
|
}
|
|
}
|
|
// ******************************************************************************************************************************************************
|
|
public bool BusyIndicator
|
|
{
|
|
get { return busyIndicator; }
|
|
set
|
|
{
|
|
busyIndicator = value;
|
|
base.OnPropertyChanged("BusyIndicator");
|
|
}
|
|
}
|
|
public ObservableCollection<MenuItem> MenuItems
|
|
{
|
|
get
|
|
{
|
|
ObservableCollection<MenuItem> collection = new ObservableCollection<MenuItem>();
|
|
collection.Add(new MenuItem() { Text = "Search for articles", MenuItemClickedCommand = DisplayBrowserSearch, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Bollinger Band", MenuItemClickedCommand = DisplayBollingerBand, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Sticker Valuation", MenuItemClickedCommand = DisplayStickerValuation, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Dividend History", MenuItemClickedCommand = DisplayDividendHistory, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Proforma Dividend Risk", MenuItemClickedCommand = DisplayProformaDividendRisk, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Historical", MenuItemClickedCommand = DisplayHistorical, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Analyst Ratings", MenuItemClickedCommand = DisplayAnalystRatings, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Stochastics", MenuItemClickedCommand = DisplayStochastics, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Relative Strength", MenuItemClickedCommand=DisplayRelativeStrength, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display MACD", MenuItemClickedCommand = DisplayMACD, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Moving Average", MenuItemClickedCommand = DisplayMovingAverage, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Price History", MenuItemClickedCommand = DisplayPriceHistory, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display DCF Valuation", MenuItemClickedCommand = DisplayDCFValuation, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display SEC Filings", MenuItemClickedCommand = DisplaySECFilings, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Display Headlines", MenuItemClickedCommand = DisplayHeadlines, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Remove from Watchlist", MenuItemClickedCommand = RemoveFromWatchList, StaysOpenOnClick = false });
|
|
collection.Add(new MenuItem() { Text = "Add to Watchlist", MenuItemClickedCommand = AddToWatchList, StaysOpenOnClick = false });
|
|
return collection;
|
|
}
|
|
}
|
|
private void OnHeadlinesViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs)
|
|
{
|
|
if (eventArgs.PropertyName.Equals("SelectedDate") )
|
|
{
|
|
HandleSelectedDate();
|
|
}
|
|
else if (eventArgs.PropertyName.Equals("SelectedSymbol"))
|
|
{
|
|
HandleSelectedSymbol();
|
|
}
|
|
else if (eventArgs.PropertyName.Equals("SelectedWatchList"))
|
|
{
|
|
HandleSelectedWatchList();
|
|
}
|
|
}
|
|
private void HandleSelectedDate()
|
|
{
|
|
try
|
|
{
|
|
semaphorePool[Tasks.SelectedDate].WaitOne();
|
|
BusyIndicator = true;
|
|
Task workerTask = Task.Factory.StartNew(() =>
|
|
{
|
|
if (Constants.CONST_ALL.Equals(selectedDate))
|
|
{
|
|
Headlines headlines=HeadlinesDA.GetHeadlines(selectedSymbol);
|
|
HeadlinesSentiment headlinesSentiment=SentimentGenerator.GetInstance().ProcessHeadlines(headlines);
|
|
selectedCompany = PricingDA.GetNameForSymbol(selectedSymbol);
|
|
if (null != headlinesSentiment && 0 != headlinesSentiment.Count) headlinesSentimentCollection = new ObservableCollection<HeadlineSentiment>(headlinesSentiment);
|
|
else headlinesSentimentCollection = null;
|
|
}
|
|
else if (null != selectedSymbol && !Constants.CONST_ALL.Equals(selectedSymbol))
|
|
{
|
|
Headlines headlines = HeadlinesDA.GetHeadlines(selectedSymbol, DateTime.Parse(selectedDate));
|
|
HeadlinesSentiment headlinesSentiment=SentimentGenerator.GetInstance().ProcessHeadlines(headlines);
|
|
selectedCompany = PricingDA.GetNameForSymbol(selectedSymbol);
|
|
if (null != headlinesSentiment && 0 != headlinesSentiment.Count) headlinesSentimentCollection = new ObservableCollection<HeadlineSentiment>(headlinesSentiment);
|
|
else headlinesSentimentCollection = null;
|
|
}
|
|
else
|
|
{
|
|
Headlines headlines = HeadlinesDA.GetHeadlines(DateTime.Parse(selectedDate));
|
|
HeadlinesSentiment headlinesSentiment=SentimentGenerator.GetInstance().ProcessHeadlines(headlines);
|
|
if (null != headlinesSentiment && 0 != headlinesSentiment.Count) headlinesSentimentCollection = new ObservableCollection<HeadlineSentiment>(headlinesSentiment);
|
|
else headlinesSentimentCollection = null;
|
|
}
|
|
});
|
|
workerTask.ContinueWith((continuation)=>
|
|
{
|
|
BusyIndicator = false;
|
|
base.OnPropertyChanged("AllItems");
|
|
base.OnPropertyChanged("Title");
|
|
});
|
|
}
|
|
finally
|
|
{
|
|
semaphorePool[Tasks.SelectedDate].Release();
|
|
}
|
|
}
|
|
private void HandleSelectedSymbol()
|
|
{
|
|
try
|
|
{
|
|
semaphorePool[Tasks.SelectedSymbol].WaitOne();
|
|
BusyIndicator = true;
|
|
Task workerTask = Task.Factory.StartNew(() =>
|
|
{
|
|
// SentimentGenerator sentimentGenerator=new SentimentGenerator();
|
|
if (null != selectedSymbol && !Constants.CONST_ALL.Equals(selectedSymbol))
|
|
{
|
|
base.DisplayName = DISPLAY_NAME + "(" + selectedSymbol + ")";
|
|
Headlines headlines = HeadlinesDA.GetHeadlines(selectedSymbol);
|
|
HeadlinesSentiment headlinesSentiment=SentimentGenerator.GetInstance().ProcessHeadlines(headlines);
|
|
selectedCompany = PricingDA.GetNameForSymbol(selectedSymbol);
|
|
if (null != headlinesSentiment && 0 != headlinesSentiment.Count) headlinesSentimentCollection = new ObservableCollection<HeadlineSentiment>(headlinesSentiment);
|
|
else headlinesSentimentCollection = null;
|
|
// if (null != headlines && 0 != headlines.Count) headlinesCollection = new ObservableCollection<Headline>(headlines);
|
|
// else headlinesCollection = null;
|
|
}
|
|
else if (null == selectedSymbol || Constants.CONST_ALL.Equals(selectedSymbol))
|
|
{
|
|
Headlines headlines = null;
|
|
if (null == selectedDate || Constants.CONST_ALL.Equals(selectedDate)) headlines = HeadlinesDA.GetHeadlines();
|
|
else headlines = HeadlinesDA.GetHeadlines(DateTime.Parse(selectedDate));
|
|
HeadlinesSentiment headlinesSentiment=SentimentGenerator.GetInstance().ProcessHeadlines(headlines);
|
|
if (null != headlinesSentiment && 0 != headlinesSentiment.Count) headlinesSentimentCollection = new ObservableCollection<HeadlineSentiment>(headlinesSentiment);
|
|
else headlinesSentimentCollection = null;
|
|
//if (null != headlines && 0 != headlines.Count) headlinesCollection = new ObservableCollection<Headline>(headlines);
|
|
//else headlinesCollection = null;
|
|
}
|
|
});
|
|
workerTask.ContinueWith((continuation) =>
|
|
{
|
|
BusyIndicator = false;
|
|
base.OnPropertyChanged("AllItems");
|
|
base.OnPropertyChanged("Title");
|
|
base.OnPropertyChanged("DisplayName");
|
|
});
|
|
}
|
|
finally
|
|
{
|
|
semaphorePool[Tasks.SelectedSymbol].Release();
|
|
}
|
|
}
|
|
private void HandleSelectedWatchList()
|
|
{
|
|
// if (selectedWatchList.Equals(Constants.CONST_ALL)) symbols = PricingDA.GetSymbols();
|
|
if (selectedWatchList.Equals(Constants.CONST_ALL)) symbols = SymbolCache.GetInstance().GetSymbols();
|
|
else
|
|
{
|
|
symbols = WatchListDA.GetWatchList(selectedWatchList);
|
|
symbols.Insert(0, Constants.CONST_ALL);
|
|
}
|
|
base.OnPropertyChanged("Symbols");
|
|
}
|
|
//public ObservableCollection<Headline> AllItems
|
|
//{
|
|
// get { return headlinesCollection; }
|
|
//}
|
|
public ObservableCollection<HeadlineSentiment> AllItems
|
|
{
|
|
get { return headlinesSentimentCollection; }
|
|
}
|
|
// ************************************************************************ T O O L T I P C A L L O U T S ****************************************************************
|
|
public String Description
|
|
{
|
|
get
|
|
{
|
|
if(null== selectedItem || null==selectedItem.Symbol)return "No row selected.";
|
|
CompanyProfile companyProfile=CompanyProfileDA.GetCompanyProfile(selectedItem.Symbol);
|
|
if(null==companyProfile || null==companyProfile.Description)return "No description found.";
|
|
return companyProfile.Description;
|
|
}
|
|
}
|
|
public String Parity
|
|
{
|
|
get
|
|
{
|
|
if(null== selectedItem || null==selectedItem.Symbol)return "No row selected.";
|
|
StringBuilder sb=new StringBuilder();
|
|
PortfolioTrades portfolioTrades=PortfolioDA.GetOpenTradesSymbol(selectedItem.Symbol);
|
|
DateTime currentDate=PricingDA.GetLatestDate(selectedItem.Symbol);
|
|
if(null!=portfolioTrades&&0!=portfolioTrades.Count)
|
|
{
|
|
sb.Append("You own this security (").Append(selectedItem.Symbol).Append(") in ").Append(portfolioTrades.Count).Append(" lot(s). ").Append("Exposure:").Append(Utility.FormatCurrency(portfolioTrades.Sum(x=>x.Exposure())));
|
|
ParityElement parityElement=ParityGenerator.GenerateBreakEven(selectedItem.Symbol);
|
|
if(null!=parityElement)
|
|
{
|
|
sb.Append("\n").Append(parityElement.ToString());
|
|
}
|
|
}
|
|
else sb.Append("You don't hold any shares of '").Append(selectedItem.Symbol).Append("'");
|
|
sb.Append(".");
|
|
DateGenerator dateGenerator=new DateGenerator();
|
|
DateTime priorDate=dateGenerator.FindPrevBusinessDay(currentDate);
|
|
Price p1=PricingDA.GetPrice(selectedItem.Symbol,currentDate);
|
|
Price p2=PricingDA.GetPrice(selectedItem.Symbol,priorDate);
|
|
if(null==p2&&null!=p1)
|
|
{
|
|
priorDate=dateGenerator.FindPrevBusinessDay(priorDate);
|
|
p2=PricingDA.GetPrice(selectedItem.Symbol,priorDate);
|
|
}
|
|
if(null==p1||null==p2)return sb.ToString();
|
|
sb.Append("\n");
|
|
double change=(p1.Close-p2.Close)/p2.Close;
|
|
sb.Append(String.Format("Latest Price {0} {1} ({2}{3})",Utility.DateTimeToStringMMSDDSYYYY(p1.Date),Utility.FormatCurrency(p1.Close),change<0?"-":"+",Utility.FormatPercent(Math.Abs(change))));
|
|
return sb.ToString();
|
|
|
|
}
|
|
}
|
|
public override String DisplayName
|
|
{
|
|
get
|
|
{
|
|
if (null != selectedSymbol && !Constants.CONST_ALL.Equals(selectedSymbol))return "Headline (" + selectedSymbol + ")";
|
|
else return "Headlines";
|
|
}
|
|
}
|
|
public override String Title
|
|
{
|
|
get
|
|
{
|
|
StringBuilder sb=new StringBuilder();
|
|
sb.Append("");
|
|
if(null!=headlinesSentimentCollection&&0!=headlinesSentimentCollection.Count) sb.Append(headlinesSentimentCollection.Count).Append(" ");
|
|
if (null != selectedSymbol && !Constants.CONST_ALL.Equals(selectedSymbol))sb.Append("Headline (").Append(selectedSymbol).Append(")");
|
|
else sb.Append("Headlines");
|
|
if(null!=selectedDate)
|
|
{
|
|
DateTime selectedDateDt=DateTime.Parse(selectedDate);
|
|
sb.Append(" on ").Append(selectedDateDt.DayOfWeek).Append(", ").Append(Utility.DateTimeToStringMMMM(selectedDateDt)).Append(" ").Append(selectedDateDt.Day).Append(", ").Append(selectedDateDt.Year);
|
|
}
|
|
if(null!=headlinesSentimentCollection)
|
|
{
|
|
double negativeCount=(from HeadlineSentiment s in headlinesSentimentCollection where s.Sentiment.Equals(LexicalElement.NEGATIVE_SENTIMENT) select s).ToList().Count();
|
|
double positiveCount=(from HeadlineSentiment s in headlinesSentimentCollection where s.Sentiment.Equals(LexicalElement.POSITIVE_SENTIMENT) select s).ToList().Count();
|
|
sb.Append(" (Sentiment : ").Append(Utility.FormatPercent(positiveCount/(positiveCount+negativeCount))).Append(")");
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
private void Refresh()
|
|
{
|
|
symbols = WatchListDA.GetWatchList(selectedWatchList);
|
|
symbols.Insert(0, Constants.CONST_ALL);
|
|
selectedSymbol=symbols[0];
|
|
dates = HeadlinesDA.GetHeadlineDates();
|
|
dates.Insert(0, Constants.CONST_ALL);
|
|
if (dates.Count > 1) selectedDate = dates[1];
|
|
else selectedDate = dates[0];
|
|
base.OnPropertyChanged("Symbols");
|
|
base.OnPropertyChanged("Dates");
|
|
base.OnPropertyChanged("SelectedDate");
|
|
base.OnPropertyChanged("SelectedSymbol");
|
|
base.OnPropertyChanged("Title");
|
|
}
|
|
private bool CanReset
|
|
{
|
|
get { return true; }
|
|
}
|
|
public ICommand RefreshCommand
|
|
{
|
|
get
|
|
{
|
|
if (refreshCommand == null)
|
|
{
|
|
refreshCommand = new RelayCommand(param => this.Refresh(), param => {return true;});
|
|
}
|
|
return refreshCommand;
|
|
}
|
|
}
|
|
public List<String> Dates
|
|
{
|
|
get
|
|
{
|
|
return dates;
|
|
}
|
|
}
|
|
public List<String> Symbols
|
|
{
|
|
get
|
|
{
|
|
return symbols;
|
|
}
|
|
}
|
|
public String SelectedSymbol
|
|
{
|
|
get
|
|
{
|
|
return selectedSymbol;
|
|
}
|
|
set
|
|
{
|
|
if (value == selectedSymbol || String.IsNullOrEmpty(value)) return;
|
|
selectedSymbol = value;
|
|
base.OnPropertyChanged("SelectedSymbol");
|
|
}
|
|
}
|
|
public String SelectedDate
|
|
{
|
|
get { return selectedDate; }
|
|
set
|
|
{
|
|
selectedDate = value;
|
|
base.OnPropertyChanged("SelectedDate");
|
|
}
|
|
}
|
|
public List<String> WatchListNames
|
|
{
|
|
get
|
|
{
|
|
return watchLists;
|
|
}
|
|
set { ;}
|
|
}
|
|
public String SelectedWatchList
|
|
{
|
|
get { return selectedWatchList; }
|
|
set { selectedWatchList = value; base.OnPropertyChanged("SelectedWatchList"); }
|
|
}
|
|
// **************************************************************************************************************************************************************
|
|
// ********************************************************************* I C O M M A N D ************************************************************************
|
|
// **************************************************************************************************************************************************************
|
|
public ICommand DisplayHistorical
|
|
{
|
|
get
|
|
{
|
|
if (displayHistoricalCommand == null)
|
|
{
|
|
displayHistoricalCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.HistoricalViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All}");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return displayHistoricalCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayBrowserSearch
|
|
{
|
|
get
|
|
{
|
|
if (browserCommand == null)
|
|
{
|
|
browserCommand = new RelayCommand(param => this.BrowserSearch(), param => { return null != selectedItem && null != selectedItem.Symbol;;});
|
|
}
|
|
return browserCommand;
|
|
}
|
|
}
|
|
public ICommand DisplaySECFilings
|
|
{
|
|
get
|
|
{
|
|
if (null == displaySECFilingsCommand)
|
|
{
|
|
displaySECFilingsCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.SECFilingViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,Valuations");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null!=selectedItem.Symbol; });
|
|
}
|
|
return displaySECFilingsCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayAnalystRatings
|
|
{
|
|
get
|
|
{
|
|
if (analystRatingsCommand == null)
|
|
{
|
|
analystRatingsCommand = new RelayCommand(param => this.DisplayAnalystRatingsCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return analystRatingsCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayMACD
|
|
{
|
|
get
|
|
{
|
|
if (macdCommand == null)
|
|
{
|
|
macdCommand = new RelayCommand(param => this.DisplayMACDCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return macdCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayMovingAverage
|
|
{
|
|
get
|
|
{
|
|
if (movingAverageCommand == null)
|
|
{
|
|
movingAverageCommand = new RelayCommand(param => this.DisplayMovingAverageCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return movingAverageCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayStochastics
|
|
{
|
|
get
|
|
{
|
|
if (stochasticsCommand == null)
|
|
{
|
|
stochasticsCommand = new RelayCommand(param => this.DisplayStochasticsCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return stochasticsCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayRelativeStrength
|
|
{
|
|
get
|
|
{
|
|
if (relativeStrengthCommand == null)
|
|
{
|
|
relativeStrengthCommand = new RelayCommand(param => this.DisplayRelativeStrengthCommand(),
|
|
param => { return null != selectedItem && null!=selectedItem.Symbol; });
|
|
}
|
|
return relativeStrengthCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayHeadlines
|
|
{
|
|
get
|
|
{
|
|
if (null == displayHeadlinesCommand)
|
|
{
|
|
displayHeadlinesCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.HeadlinesViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,Valuations");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null!=selectedItem.Symbol; });
|
|
}
|
|
return displayHeadlinesCommand;
|
|
}
|
|
}
|
|
public ICommand RemoveFromWatchList
|
|
{
|
|
get
|
|
{
|
|
if (removeFromWatchListCommand == null)
|
|
{
|
|
removeFromWatchListCommand = new RelayCommand(param => this.RemoveFromWatchListCommand(selectedItem.Symbol),
|
|
param =>
|
|
{
|
|
if (null == selectedItem || null == selectedItem.Symbol) return false;
|
|
if (!WatchListDA.IsInWatchList(selectedItem.Symbol)) return false;
|
|
PortfolioTrades portfolioTrades=PortfolioDA.GetOpenTradesSymbol(selectedItem.Symbol);
|
|
if(null!=portfolioTrades&&0!=portfolioTrades.Count)return false;
|
|
return true;
|
|
});
|
|
}
|
|
return removeFromWatchListCommand;
|
|
}
|
|
}
|
|
public ICommand AddToWatchList
|
|
{
|
|
get
|
|
{
|
|
if (addToWatchListCommand == null)
|
|
{
|
|
addToWatchListCommand = new RelayCommand(param => this.AddToWatchListCommand(selectedItem.Symbol),
|
|
param =>
|
|
{
|
|
if(null==selectedItem || null==selectedItem.Symbol)return false;
|
|
if (WatchListDA.IsInWatchList(selectedItem.Symbol)) return false;
|
|
return true;
|
|
});
|
|
}
|
|
return addToWatchListCommand;
|
|
}
|
|
}
|
|
// *********************************************************************************************************************************************************************
|
|
public void RemoveFromWatchListCommand(String symbol)
|
|
{
|
|
if (!WatchListDA.IsInWatchList(symbol))
|
|
{
|
|
System.Windows.MessageBox.Show("'" + symbol + "' is not in watchlist", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
return;
|
|
}
|
|
if (!WatchListDA.RemoveFromWatchList(symbol))
|
|
{
|
|
System.Windows.MessageBox.Show("Error removing '" + selectedItem.Symbol + "' from watchlist", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
}
|
|
else
|
|
{
|
|
System.Windows.MessageBox.Show("Removed '" + selectedItem.Symbol + "'", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
}
|
|
public void AddToWatchListCommand(String symbol)
|
|
{
|
|
if (WatchListDA.IsInWatchList(symbol))
|
|
{
|
|
System.Windows.MessageBox.Show("'"+symbol+"' is already in watchlist","Info", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
return;
|
|
}
|
|
if (!WatchListDA.AddToWatchList(symbol))
|
|
{
|
|
System.Windows.MessageBox.Show("Error adding '"+symbol+"' to watchlist","Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
}
|
|
else
|
|
{
|
|
System.Windows.MessageBox.Show("Added '"+symbol+"'","Success", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
}
|
|
public void DisplayAnalystRatingsCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.AnalystRatingsViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All}");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public void BrowserSearch()
|
|
{
|
|
Utility.LaunchBrowserSearch(selectedItem.Entry);
|
|
}
|
|
public void DisplayStochasticsCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.StochasticsViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,180");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public void DisplayRelativeStrengthCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.RSIViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,60,SelectedRSIDayCount,14");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public void DisplayMACDCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.MACDViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,180");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public void DisplayMovingAverageCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.MovingAverageViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,360");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public ICommand DisplayStickerValuation
|
|
{
|
|
get
|
|
{
|
|
if (null == stickerValuationCommand)
|
|
{
|
|
stickerValuationCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.StickerPriceViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All}");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null!=selectedItem.Symbol; });
|
|
}
|
|
return stickerValuationCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayDCFValuation
|
|
{
|
|
get
|
|
{
|
|
if (null == dcfValuationCommand)
|
|
{
|
|
dcfValuationCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.DCFValuationViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All}");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null!=selectedItem.Symbol; });
|
|
}
|
|
return dcfValuationCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayPriceHistory
|
|
{
|
|
get
|
|
{
|
|
if (priceHistoryCommand == null)
|
|
{
|
|
priceHistoryCommand = new RelayCommand(param => this.DisplayPriceHistoryCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return priceHistoryCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayDividendHistory
|
|
{
|
|
get
|
|
{
|
|
if (dividendHistoryCommand == null)
|
|
{
|
|
dividendHistoryCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.DividendHistoryViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All}");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return dividendHistoryCommand;
|
|
}
|
|
}
|
|
public ICommand DisplayProformaDividendRisk
|
|
{
|
|
get
|
|
{
|
|
if (proformaDividendRiskCommand == null)
|
|
{
|
|
proformaDividendRiskCommand = new RelayCommand(param =>
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.DividendRiskParityViewModel,SelectedSymbol," + selectedItem.Symbol + "");
|
|
saveParams.Referer = this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}, param =>
|
|
{
|
|
if(null==selectedItem || null==selectedItem.Symbol)return false;
|
|
PortfolioTrades portfolioTrades = PortfolioDA.GetOpenTradesSymbol(selectedItem.Symbol);
|
|
return null!=portfolioTrades && 0!=portfolioTrades.Count;
|
|
});
|
|
}
|
|
return proformaDividendRiskCommand;
|
|
}
|
|
}
|
|
public void DisplayPriceHistoryCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.PricingViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,180");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public ICommand DisplayBollingerBand
|
|
{
|
|
get
|
|
{
|
|
if (bollingerBandCommand == null)
|
|
{
|
|
bollingerBandCommand = new RelayCommand(param => this.DisplayBollingerBandCommand(), param => { return null != selectedItem && null != selectedItem.Symbol; });
|
|
}
|
|
return bollingerBandCommand;
|
|
}
|
|
}
|
|
public void DisplayBollingerBandCommand()
|
|
{
|
|
SaveParameters saveParams = SaveParameters.Parse("Type,TradeBlotter.ViewModels.BollingerBandViewModel,SelectedSymbol," + selectedItem.Symbol + ",SelectedWatchList,{All},SelectedDayCount,180");
|
|
saveParams.Referer=this;
|
|
WorkspaceInstantiator.Invoke(saveParams);
|
|
}
|
|
public HeadlineSentiment SelectedItem
|
|
{
|
|
get
|
|
{
|
|
return selectedItem;
|
|
}
|
|
set
|
|
{
|
|
selectedItem = value;
|
|
}
|
|
}
|
|
//public Headline SelectedItem
|
|
//{
|
|
// get
|
|
// {
|
|
// return selectedItem;
|
|
// }
|
|
// set
|
|
// {
|
|
// selectedItem = value;
|
|
// }
|
|
// }
|
|
}
|
|
}
|