using MarketData.DataAccess; using MarketData.Generator.Interface; using MarketData.MarketDataModel; using MarketData.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Media; using System.Text; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Windows.Threading; using Position=MarketData.Generator.CMTrend.Position; namespace TradeBlotter.UIUtils { /// /// Interaction logic for ClosePositionDialog.xaml /// public partial class ClosePositionDialog:Window { private ManualResetEvent manualResetEvent=new ManualResetEvent(false); private String Symbol{get;set;} private DateTime PurchaseDate { get; set; } private DateTime SellDate{get;set;} private double SellPrice { get; set; } private bool DeleteStop{get;set;} private bool Result { get; set; } private ClosePositionDialog(String title,IPosition position,bool hasStopLimit) { this.Background=new SolidColorBrush(Colors.AliceBlue); this.Owner=Application.Current.MainWindow; InitializeComponent(); this.Loaded+=new RoutedEventHandler(CMTTrendModelClosePositionDialog_Loaded); this.Closing+=Window_Closing; dpPurchaseDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged; dpSellDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged; cbDeleteStop.Click+=cbDeleteStop_SelectionChanged; Title=title; Symbol=position.Symbol; PurchaseDate=position.PurchaseDate; if(Utility.IsEpoch(position.SellDate)) { SellDate = DateTime.Now; } else { SellDate=position.SellDate; } SellPrice=position.TrailingStopLimit; DeleteStop=hasStopLimit; txtSymbol.Text=Symbol; dpPurchaseDate.SelectedDate=PurchaseDate; dpSellDate.SelectedDate=SellDate; cbDeleteStop.IsChecked=DeleteStop; UpdateSellPrice(); UpdateCompanyName(); } public ManualResetEvent Event { get { return manualResetEvent; } } public static IPosition Prompt(string title,IPosition position,bool hasStopLimit,ref bool deleteStop) { ClosePositionDialog closePositionDialog=new ClosePositionDialog(title,position,hasStopLimit); try { closePositionDialog.ShowDialog(); } catch(Exception) { return null; } closePositionDialog.Event.WaitOne(); if( closePositionDialog.Result) { position.SellDate=closePositionDialog.SellDate; position.CurrentPrice=closePositionDialog.SellPrice; deleteStop=closePositionDialog.DeleteStop; return position; } return null; } void CMTTrendModelClosePositionDialog_Loaded(object sender,RoutedEventArgs e) { txtSellPrice.Focus(); } private void btnOk_Click(object sender,RoutedEventArgs e) { Result=Validate(); if(!Result) { SystemSounds.Beep.Play(); return; } Close(); Event.Set(); return; } private void cbDeleteStop_SelectionChanged(object sender,RoutedEventArgs e) { DeleteStop=cbDeleteStop.IsChecked.Value; } private void txtSellPrice_OnLostFocusHandler(Object sender,RoutedEventArgs routedEventArgs) { HandleSellPriceEvents(); } private void txtSellPrice_OnKeyDownHandler(object sender,KeyEventArgs e) { if(e.Key==Key.Return) { HandleSellPriceEvents(); } } private void HandleSellPriceEvents() { double value=0.00; value=Utility.ParseCurrency(txtSellPrice.Text); if(SellPrice.Equals(value)) return; SellPrice=value; UpdateSellPrice(); } private void dpPurchaseDate_SelectionChanged(object sender,RoutedEventArgs e) { if(null==dpPurchaseDate.SelectedDate) return; PurchaseDate=dpPurchaseDate.SelectedDate.Value; } private void dpSellDate_SelectionChanged(object sender,RoutedEventArgs e) { if(null==dpSellDate.SelectedDate) return; SellDate=dpSellDate.SelectedDate.Value; } private void Window_Closing(object sender,System.ComponentModel.CancelEventArgs e) { Event.Set(); } private void btnCancel_Click(object sender,RoutedEventArgs e) { Result=false; Close(); Event.Set(); } private bool Validate() { DateGenerator dateGenerator=new DateGenerator(); if(null==Symbol) { SetMessage("Invalid Symbol."); return false; } if(Utility.IsEpoch(PurchaseDate)) { SetMessage("Invalid Purchase Date."); return false; } if(Utility.IsEpoch(SellDate)) { SetMessage("Invalid Sell Date."); return false; } if(!dateGenerator.IsMarketOpen(SellDate)) { SetMessage("Market closed on Sell Date."); return false; } if(double.IsNaN(SellPrice)) { SetMessage("Invalid Sell Price."); return false; } SetMessage(""); return true; } private void UpdateSellPrice() { txtSellPrice.Text=Utility.FormatCurrency(SellPrice,3); } private void UpdateCompanyName() { CompanyProfile companyProfile=CompanyProfileDA.GetCompanyProfile(Symbol); if(null==companyProfile||null==companyProfile.CompanyName) return; lblCompanyName.Content=companyProfile.CompanyName.ToUpper(); } private void SetMessage(String message) { lblMessage.Content=message; } } }