297 lines
9.1 KiB
C#
297 lines
9.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Input;
|
|
using System.Windows.Threading;
|
|
using System.ComponentModel;
|
|
using System.Threading;
|
|
using System.Windows.Media;
|
|
using MarketData;
|
|
using MarketData.Utils;
|
|
using MarketData.Helper;
|
|
using MarketData.MarketDataModel;
|
|
using MarketData.DataAccess;
|
|
using TradeBlotter.Model;
|
|
using TradeBlotter.DataAccess;
|
|
using TradeBlotter.Command;
|
|
using TradeBlotter.UIUtils;
|
|
using TradeBlotter.Cache;
|
|
using MarketData.Cache;
|
|
|
|
namespace TradeBlotter.ViewModels
|
|
{
|
|
public class TradeViewModel : WorkspaceViewModel
|
|
{
|
|
private double weight;
|
|
private readonly BlotterTradeModel trade;
|
|
private readonly TradeRepository tradeRepository;
|
|
private bool isSelected;
|
|
private int todaysChangeDirection = 0;
|
|
private int returnChangeDirection = 0;
|
|
private int gainLossChangeDirection = 0;
|
|
|
|
public TradeViewModel(BlotterTradeModel trade, TradeRepository tradeRepository)
|
|
{
|
|
if (null == trade) throw new ArgumentNullException("trade");
|
|
if (null == tradeRepository) throw new ArgumentNullException("tradeRepository");
|
|
this.trade = trade;
|
|
this.tradeRepository = tradeRepository;
|
|
PropertyChanged += OnTradeViewModelPropertyChanged;
|
|
}
|
|
|
|
public override SaveParameters GetSaveParameters()
|
|
{
|
|
return null;
|
|
}
|
|
public override void SetSaveParameters(SaveParameters saveParameters)
|
|
{
|
|
}
|
|
public override bool CanPersist()
|
|
{
|
|
return false;
|
|
}
|
|
private void OnTradeViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs)
|
|
{
|
|
}
|
|
public int TradeId
|
|
{
|
|
get { return trade.TradeId; }
|
|
set { trade.TradeId = value; }
|
|
}
|
|
public String Symbol
|
|
{
|
|
get { return trade.Symbol; }
|
|
set { trade.Symbol = value; base.OnPropertyChanged("Symbol"); }
|
|
}
|
|
public DateTime TradeDate
|
|
{
|
|
get { return trade.TradeDate; }
|
|
set { trade.TradeDate = value; base.OnPropertyChanged("TradeDate"); }
|
|
}
|
|
public double Shares
|
|
{
|
|
get { return trade.Shares; }
|
|
set { trade.Shares = value; base.OnPropertyChanged("Shares"); }
|
|
}
|
|
public double Price
|
|
{
|
|
get { return trade.Price; }
|
|
set { trade.Price = value; base.OnPropertyChanged("Price"); }
|
|
}
|
|
public String BuySell
|
|
{
|
|
get { return trade.BuySell; }
|
|
set { trade.BuySell=value; base.OnPropertyChanged("BuySell"); }
|
|
}
|
|
public String Exposure
|
|
{
|
|
get
|
|
{
|
|
return trade.IsClosed?Constants.CONST_DASHES:Utility.FormatCurrency(trade.Exposure);
|
|
}
|
|
}
|
|
public String SellDate
|
|
{
|
|
get { return trade.IsClosed?Utility.DateTimeToStringMMSDDSYYYY(trade.SellDate):Constants.CONST_DASHES; }
|
|
set { trade.SellDate = DateTime.Parse(value); base.OnPropertyChanged("SellDate"); }
|
|
}
|
|
public String SellPrice
|
|
{
|
|
get { return trade.IsClosed?Utility.FormatPrice(trade.SellPrice):Constants.CONST_DASHES; }
|
|
set { trade.SellPrice = double.Parse(value); base.OnPropertyChanged("SellPrice"); }
|
|
}
|
|
public String Account
|
|
{
|
|
get { return trade.Account; }
|
|
set { trade.Account = value; base.OnPropertyChanged("Account"); }
|
|
}
|
|
public String Status
|
|
{
|
|
get { return trade.Status; }
|
|
set { trade.Status = value; base.OnPropertyChanged("Status"); }
|
|
}
|
|
public int DaysHeld
|
|
{
|
|
get
|
|
{
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
if (trade.IsOpen) return dateGenerator.DaysBetween(DateTime.Now,trade.TradeDate);
|
|
else return dateGenerator.DaysBetween(trade.SellDate,trade.TradeDate);
|
|
}
|
|
}
|
|
public bool IsOpen
|
|
{
|
|
get { return trade.IsOpen; }
|
|
}
|
|
|
|
public void Invalidate()
|
|
{
|
|
Price price = null;
|
|
price = GBPriceCache.GetInstance().GetPriceOrLatestAvailable(trade.Symbol,DateTime.Now);
|
|
if (null == price) return;
|
|
trade.LatestPrice = price.Close;
|
|
trade.PriceDate = price.Date;
|
|
trade.HasLatestPrice = true;
|
|
}
|
|
|
|
public void Validate()
|
|
{
|
|
base.OnPropertyChanged("GainLoss");
|
|
base.OnPropertyChanged("Return");
|
|
base.OnPropertyChanged("PriceDate");
|
|
base.OnPropertyChanged("CurrentPrice");
|
|
base.OnPropertyChanged("TodaysChange");
|
|
}
|
|
public String CurrentPrice
|
|
{
|
|
get
|
|
{
|
|
if (trade.IsClosed) return Constants.CONST_DASHES;
|
|
return Utility.FormatPrice(trade.LatestPrice);
|
|
}
|
|
set { trade.LatestPrice = double.Parse(value); base.OnPropertyChanged("CurrentPrice"); }
|
|
}
|
|
public String PriceDate
|
|
{
|
|
get { return Utility.DateTimeToStringMMSDDSYYYYHHMMSS(trade.PriceDate); }
|
|
set { trade.PriceDate = DateTime.Parse(value); base.OnPropertyChanged("PriceDate"); }
|
|
}
|
|
public String Commission
|
|
{
|
|
get
|
|
{
|
|
return Utility.FormatCurrency(trade.Commission);
|
|
}
|
|
set { trade.Commission = double.Parse(value); base.OnPropertyChanged("Commission"); }
|
|
}
|
|
public String GainLoss
|
|
{
|
|
get
|
|
{
|
|
double gainLoss = 0;
|
|
if (trade.IsClosed) gainLoss = (trade.SellPrice * trade.Shares) - (trade.Price * trade.Shares);
|
|
else gainLoss = (trade.LatestPrice * trade.Shares) - (trade.Price * trade.Shares);
|
|
if (gainLoss > 0) gainLossChangeDirection = 1;
|
|
else if (gainLoss < 0) gainLossChangeDirection = -1;
|
|
else gainLossChangeDirection = 0;
|
|
base.OnPropertyChanged("GainLossColor");
|
|
return Utility.FormatCurrency(gainLoss);
|
|
}
|
|
}
|
|
public Brush GainLossColor
|
|
{
|
|
get
|
|
{
|
|
if (gainLossChangeDirection > 0) return new SolidColorBrush(Colors.Green);
|
|
else if (gainLossChangeDirection < 0) return new SolidColorBrush(Colors.Red);
|
|
return new SolidColorBrush(Colors.Black);
|
|
}
|
|
}
|
|
public String Return
|
|
{
|
|
get
|
|
{
|
|
double calculatedReturn=0;
|
|
if (trade.IsClosed)calculatedReturn=((trade.SellPrice - trade.Price) / trade.Price);
|
|
else calculatedReturn = ((trade.LatestPrice - trade.Price) / trade.Price);
|
|
if (calculatedReturn > 0) returnChangeDirection = 1;
|
|
else if (calculatedReturn < 0) returnChangeDirection = -1;
|
|
else returnChangeDirection = 0;
|
|
base.OnPropertyChanged("ReturnColor");
|
|
return Utility.FormatPercent(calculatedReturn);
|
|
}
|
|
}
|
|
public Brush ReturnColor
|
|
{
|
|
get
|
|
{
|
|
if(trade.IsClosed)return new SolidColorBrush(Colors.Blue);
|
|
if (returnChangeDirection > 0) return new SolidColorBrush(Colors.Green);
|
|
else if (returnChangeDirection < 0) return new SolidColorBrush(Colors.Red);
|
|
return new SolidColorBrush(Colors.Black);
|
|
}
|
|
}
|
|
public Brush TodaysChangeColor
|
|
{
|
|
get
|
|
{
|
|
if (todaysChangeDirection > 0) return new SolidColorBrush(Colors.Green);
|
|
else if (todaysChangeDirection < 0) return new SolidColorBrush(Colors.Red);
|
|
return new SolidColorBrush(Colors.Black);
|
|
}
|
|
}
|
|
public String TodaysChange
|
|
{
|
|
get
|
|
{
|
|
if (trade.IsClosed) { todaysChangeDirection = 0; return Constants.CONST_DASHES; }
|
|
if (trade.IsOpen && trade.TradeDate.Date.Equals(DateTime.Now.Date)) { todaysChangeDirection = 0; return Constants.CONST_DASHES; }
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
DateTime prevBusinessDay = dateGenerator.FindPrevBusinessDay(DateTime.Now);
|
|
Price price=PricingDA.GetPrice(trade.Symbol,prevBusinessDay);
|
|
if (null == price) { todaysChangeDirection = 0; return Constants.CONST_DASHES; }
|
|
double todaysChange = (trade.LatestPrice * trade.Shares) - (price.Close * trade.Shares);
|
|
if (todaysChange > 0) todaysChangeDirection = 1;
|
|
else if (todaysChange < 0) todaysChangeDirection = -1;
|
|
else todaysChangeDirection = 0;
|
|
return Utility.FormatCurrency(todaysChange);
|
|
}
|
|
set
|
|
{
|
|
TodaysChange = value;
|
|
base.OnPropertyChanged("TodaysChange");
|
|
base.OnPropertyChanged("TodaysChangeColor");
|
|
}
|
|
}
|
|
public String MarketValue
|
|
{
|
|
get
|
|
{
|
|
if (trade.IsClosed) return Constants.CONST_DASHES;
|
|
if (!trade.HasLatestPrice)
|
|
{
|
|
Invalidate();
|
|
base.OnPropertyChanged("PriceDate");
|
|
base.OnPropertyChanged("CurrentPrice");
|
|
}
|
|
// if (trade.IsClosed) return Constants.CONST_DASHES;
|
|
return trade.HasLatestPrice ? Utility.FormatCurrency(trade.Shares * trade.LatestPrice) : "0.00";
|
|
// return Utility.FormatCurrency(trade.Shares*trade.LatestPrice);
|
|
}
|
|
}
|
|
public String Weight
|
|
{
|
|
get
|
|
{
|
|
return double.IsNaN(weight)||trade.IsClosed ? Constants.CONST_DASHES : Utility.FormatPercent(weight);
|
|
}
|
|
set
|
|
{
|
|
if(value.Equals("N/A") || value.Equals(Constants.CONST_DASHES))
|
|
{
|
|
weight = 0.00;
|
|
}
|
|
else weight = Utility.ParsePercent(value);
|
|
}
|
|
}
|
|
public override string DisplayName
|
|
{
|
|
get
|
|
{
|
|
return "Trade";
|
|
}
|
|
}
|
|
public bool IsSelected
|
|
{
|
|
get{return isSelected;}
|
|
set
|
|
{
|
|
if (value == isSelected) return;
|
|
isSelected = value;
|
|
base.OnPropertyChanged("IsSelected");
|
|
}
|
|
}
|
|
}
|
|
}
|