diff --git a/UIUtils/ClosePositionDialog.xaml b/UIUtils/ClosePositionDialog.xaml
new file mode 100644
index 0000000..204f793
--- /dev/null
+++ b/UIUtils/ClosePositionDialog.xaml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Symbol
+
+
+
+
+
+
+
+
+ 100.00
+
+
+ Delete Stop
+
+
+
+
+
+
+
+
+
diff --git a/UIUtils/ClosePositionDialog.xaml.cs b/UIUtils/ClosePositionDialog.xaml.cs
new file mode 100644
index 0000000..875b7f7
--- /dev/null
+++ b/UIUtils/ClosePositionDialog.xaml.cs
@@ -0,0 +1,213 @@
+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);
+ }
+
+ 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;
+ }
+ }
+}
diff --git a/UIUtils/ClosePositionDialogNoStop.xaml b/UIUtils/ClosePositionDialogNoStop.xaml
new file mode 100644
index 0000000..2cb2e44
--- /dev/null
+++ b/UIUtils/ClosePositionDialogNoStop.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Symbol
+
+
+
+
+
+
+
+
+ 100.00
+
+
+
+
+
+
+
+
+
+
diff --git a/UIUtils/ClosePositionDialogNoStop.xaml.cs b/UIUtils/ClosePositionDialogNoStop.xaml.cs
new file mode 100644
index 0000000..070dec5
--- /dev/null
+++ b/UIUtils/ClosePositionDialogNoStop.xaml.cs
@@ -0,0 +1,203 @@
+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 ClosePositionDialogNoStop.xaml
+ ///
+ public partial class ClosePositionDialogNoStop : 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 Result { get; set; }
+
+ private ClosePositionDialogNoStop(String title,IPurePosition position)
+ {
+ this.Background=new SolidColorBrush(Colors.AliceBlue);
+ this.Owner=Application.Current.MainWindow;
+ InitializeComponent();
+ this.Loaded+=new RoutedEventHandler(ClosePositionDialogNoStop_Loaded);
+ this.Closing+=Window_Closing;
+
+ dpPurchaseDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged;
+ dpSellDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged;
+
+ Title=title;
+ Symbol=position.Symbol;
+ PurchaseDate=position.PurchaseDate;
+ if(Utility.IsEpoch(position.SellDate))
+ {
+ SellDate = DateTime.Now;
+ }
+ else
+ {
+ SellDate=position.SellDate;
+ }
+// SellPrice=position.TrailingStopLimit;
+ txtSymbol.Text=Symbol;
+ dpPurchaseDate.SelectedDate=PurchaseDate;
+ dpSellDate.SelectedDate=SellDate;
+
+ UpdateSellPrice();
+ UpdateCompanyName();
+ }
+
+ public ManualResetEvent Event
+ {
+ get
+ {
+ return manualResetEvent;
+ }
+ }
+
+ public static IPurePosition Prompt(string title,IPurePosition position)
+ {
+ ClosePositionDialogNoStop closePositionDialog=new ClosePositionDialogNoStop(title,position);
+ try { closePositionDialog.ShowDialog(); }
+ catch(Exception) { return null; }
+ closePositionDialog.Event.WaitOne();
+ if( closePositionDialog.Result)
+ {
+ position.SellDate=closePositionDialog.SellDate;
+ position.CurrentPrice=closePositionDialog.SellPrice;
+ return position;
+ }
+ return null;
+ }
+
+ void ClosePositionDialogNoStop_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 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);
+ }
+
+ 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;
+ }
+ }
+}
diff --git a/UIUtils/EditPositionDialog.xaml b/UIUtils/EditPositionDialog.xaml
new file mode 100644
index 0000000..ed5f32a
--- /dev/null
+++ b/UIUtils/EditPositionDialog.xaml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Symbol
+
+
+
+
+
+
+
+
+
+ 100.00
+ Sync Trailing Stop
+
+
+
+
+ 100.00
+
+
+
+
+
+
+
+
+
diff --git a/UIUtils/EditPositionDialog.xaml.cs b/UIUtils/EditPositionDialog.xaml.cs
new file mode 100644
index 0000000..b8ac4eb
--- /dev/null
+++ b/UIUtils/EditPositionDialog.xaml.cs
@@ -0,0 +1,229 @@
+using MarketData.DataAccess;
+using MarketData.MarketDataModel;
+using MarketData.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+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 System.Media;
+using Position=MarketData.Generator.CMTrend.Position;
+using MarketData.Generator.Interface;
+
+namespace TradeBlotter.UIUtils
+{
+ ///
+ /// Interaction logic for EditPositionDialog.xaml
+ ///
+ public partial class EditPositionDialog : Window
+ {
+ private ManualResetEvent manualResetEvent=new ManualResetEvent(false);
+ private String Symbol { get; set; }
+ private DateTime PurchaseDate { get; set; }
+ private double PurchasePrice{get;set;}
+ private double TrailingStop{get;set;}
+ private double InitialStop{get;set;}
+ private double PositionRiskPercentDecimal{get;set;}
+ private bool Result { get; set; }
+
+ private EditPositionDialog(String title,IPosition position)
+ {
+ this.Background=new SolidColorBrush(Colors.AliceBlue);
+ this.Owner=Application.Current.MainWindow;
+ InitializeComponent();
+ this.Loaded+=new RoutedEventHandler(EditPositionDialog_Loaded);
+ this.Closing+=Window_Closing;
+
+ dpPurchaseDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged;
+
+ Title=title;
+ Symbol=position.Symbol;
+ PurchaseDate=position.PurchaseDate;
+ PurchasePrice=position.PurchasePrice;
+ TrailingStop=position.TrailingStopLimit;
+ InitialStop=position.InitialStopLimit;
+ PositionRiskPercentDecimal=position.PositionRiskPercentDecimal;
+
+ txtSymbol.Text=Symbol;
+ dpPurchaseDate.SelectedDate=PurchaseDate;
+
+ lblInitialStopRecommendation.FontSize=12;
+
+ cbSyncTrailingStop.IsChecked=true;
+
+ UpdatePurchasePrice();
+ UpdateInitialStop();
+ UpdateTrailingStop();
+ UpdateCompanyName();
+ UpdateInitialStopRecommendation();
+ }
+ public ManualResetEvent Event { get { return manualResetEvent; } }
+
+ public static IPosition Prompt(string title,IPosition position)
+ {
+ EditPositionDialog editPositionDialog=new EditPositionDialog(title,position);
+ try { editPositionDialog.ShowDialog(); }
+ catch(Exception) { return null; }
+ editPositionDialog.Event.WaitOne();
+ if(editPositionDialog.Result)
+ {
+ position.PurchaseDate=editPositionDialog.PurchaseDate;
+ position.PurchasePrice=editPositionDialog.PurchasePrice;
+ position.TrailingStopLimit=editPositionDialog.TrailingStop;
+ position.InitialStopLimit=editPositionDialog.InitialStop;
+ return position;
+ }
+ return null;
+ }
+ void EditPositionDialog_Loaded(object sender,RoutedEventArgs e)
+ {
+ txtPurchasePrice.Focus();
+ }
+ private void btnOk_Click(object sender,RoutedEventArgs e)
+ {
+ Result=Validate();
+ if(!Result)
+ {
+ SystemSounds.Beep.Play();
+ return;
+ }
+ Close();
+ Event.Set();
+ return;
+ }
+// *******************************************************************************************************************************************************************************
+// ********************************************************************************** P U R C H A S E P R I C E ***************************************************************
+// *******************************************************************************************************************************************************************************
+ private void txtPurchasePrice__OnLostFocusHandler(Object sender,RoutedEventArgs routedEventArgs)
+ {
+ HandlePurchasePriceEvents();
+ }
+ private void txtPurchasePrice_OnKeyDownHandler(object sender,KeyEventArgs e)
+ {
+ if(e.Key==Key.Return)
+ {
+ HandlePurchasePriceEvents();
+ }
+ }
+ private void HandlePurchasePriceEvents()
+ {
+ double value=0.00;
+ value=Utility.ParseCurrency(txtPurchasePrice.Text);
+ if(PurchasePrice.Equals(value)) return;
+ PurchasePrice=value;
+ UpdatePurchasePrice();
+ UpdateInitialStopRecommendation();
+ }
+ private void UpdatePurchasePrice()
+ {
+ txtPurchasePrice.Text=Utility.FormatCurrency(PurchasePrice);
+ }
+// *******************************************************************************************************************************************************************************
+// ********************************************************************************** I N I T I A L S T O P R E C O M M E N D A T I O N **************************************
+// *******************************************************************************************************************************************************************************
+ private void UpdateInitialStopRecommendation()
+ {
+ lblInitialStopRecommendation.Content="Recommended Initial Stop: "+Utility.FormatCurrency(PurchasePrice*(1.00-PositionRiskPercentDecimal),2);
+ }
+// *******************************************************************************************************************************************************************************
+// ********************************************************************************** I N I T I A L S T O P *****************************************************************
+// *******************************************************************************************************************************************************************************
+ private void txtInitialStop__OnLostFocusHandler(Object sender,RoutedEventArgs routedEventArgs)
+ {
+ HandleInitialStopEvents();
+ }
+ private void txtInitialStop_OnKeyDownHandler(object sender,KeyEventArgs e)
+ {
+ if(e.Key==Key.Return)
+ {
+ HandleInitialStopEvents();
+ }
+ }
+ private void HandleInitialStopEvents()
+ {
+ double value=0.00;
+ value=Utility.ParseCurrency(txtInitialStop.Text);
+ if(InitialStop.Equals(value)) return;
+ InitialStop=value;
+ UpdateInitialStop();
+ if(null!= cbSyncTrailingStop.IsChecked && cbSyncTrailingStop.IsChecked.Value)
+ {
+ TrailingStop=value;
+ UpdateTrailingStop();
+ }
+ }
+ private void UpdateInitialStop()
+ {
+ txtInitialStop.Text=Utility.FormatCurrency(InitialStop);
+ }
+// *******************************************************************************************************************************************************************************
+// ********************************************************************************** T R A I L I N G S T O P *****************************************************************
+// *******************************************************************************************************************************************************************************
+ private void txtTrailingStop__OnLostFocusHandler(Object sender,RoutedEventArgs routedEventArgs)
+ {
+ HandleTrailingStopEvents();
+ }
+ private void txtTrailingStop_OnKeyDownHandler(object sender,KeyEventArgs e)
+ {
+ if(e.Key==Key.Return)
+ {
+ HandleTrailingStopEvents();
+ }
+ }
+ private void HandleTrailingStopEvents()
+ {
+ double value=0.00;
+ value=Utility.ParseCurrency(txtTrailingStop.Text);
+ if(TrailingStop.Equals(value)) return;
+ TrailingStop=value;
+ UpdateTrailingStop();
+ }
+ private void UpdateTrailingStop()
+ {
+ txtTrailingStop.Text=Utility.FormatCurrency(TrailingStop);
+ }
+// *********************************************************************************************************************************************************************************
+ private void dpPurchaseDate_SelectionChanged(object sender,RoutedEventArgs e)
+ {
+ if(null==dpPurchaseDate.SelectedDate) return;
+ PurchaseDate=dpPurchaseDate.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) return false;
+ if(Utility.IsEpoch(PurchaseDate)) return false;
+ if(!dateGenerator.IsMarketOpen(PurchaseDate))return false;
+ if(double.IsNaN(PurchasePrice)) return false;
+ if(double.IsNaN(TrailingStop)) return false;
+ if(double.IsNaN(InitialStop)) return false;
+ return true;
+ }
+ private void UpdateCompanyName()
+ {
+ CompanyProfile companyProfile=CompanyProfileDA.GetCompanyProfile(Symbol);
+ if(null==companyProfile||null==companyProfile.CompanyName) return;
+ lblCompanyName.Content=companyProfile.CompanyName.ToUpper();
+ }
+ }
+}
diff --git a/UIUtils/EditPositionDialogNoStop.xaml b/UIUtils/EditPositionDialogNoStop.xaml
new file mode 100644
index 0000000..cfa4506
--- /dev/null
+++ b/UIUtils/EditPositionDialogNoStop.xaml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Symbol
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UIUtils/EditPositionDialogNoStop.xaml.cs b/UIUtils/EditPositionDialogNoStop.xaml.cs
new file mode 100644
index 0000000..470a50f
--- /dev/null
+++ b/UIUtils/EditPositionDialogNoStop.xaml.cs
@@ -0,0 +1,150 @@
+using MarketData.DataAccess;
+using MarketData.MarketDataModel;
+using MarketData.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+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 System.Media;
+using Position=MarketData.Generator.CMTrend.Position;
+using MarketData.Generator.Interface;
+
+namespace TradeBlotter.UIUtils
+{
+ ///
+ /// Interaction logic for EditPositionDialogNoStop.xaml
+ ///
+ public partial class EditPositionDialogNoStop : Window
+ {
+ private ManualResetEvent manualResetEvent=new ManualResetEvent(false);
+ private String Symbol { get; set; }
+ private DateTime PurchaseDate { get; set; }
+ private double PurchasePrice{get;set;}
+ private bool Result { get; set; }
+
+ private EditPositionDialogNoStop(String title,IPurePosition position)
+ {
+ this.Background=new SolidColorBrush(Colors.AliceBlue);
+ this.Owner=Application.Current.MainWindow;
+ InitializeComponent();
+ this.Loaded+=new RoutedEventHandler(EditPositionDialog_Loaded);
+ this.Closing+=Window_Closing;
+
+ dpPurchaseDate.SelectedDateChanged+=dpPurchaseDate_SelectionChanged;
+
+ Title=title;
+ Symbol=position.Symbol;
+ PurchaseDate=position.PurchaseDate;
+ PurchasePrice=position.PurchasePrice;
+
+ txtSymbol.Text=Symbol;
+ dpPurchaseDate.SelectedDate=PurchaseDate;
+
+
+ UpdatePurchasePrice();
+ UpdateCompanyName();
+ }
+
+ public ManualResetEvent Event { get { return manualResetEvent; } }
+
+ public static IPurePosition Prompt(string title,IPurePosition position)
+ {
+ EditPositionDialogNoStop editPositionDialog=new EditPositionDialogNoStop(title,position);
+ try { editPositionDialog.ShowDialog(); }
+ catch(Exception) { return null; }
+ editPositionDialog.Event.WaitOne();
+ if(editPositionDialog.Result)
+ {
+ position.PurchaseDate=editPositionDialog.PurchaseDate;
+ position.PurchasePrice=editPositionDialog.PurchasePrice;
+ return position;
+ }
+ return null;
+ }
+ void EditPositionDialog_Loaded(object sender,RoutedEventArgs e)
+ {
+ txtPurchasePrice.Focus();
+ }
+ private void btnOk_Click(object sender,RoutedEventArgs e)
+ {
+ Result=Validate();
+ if(!Result)
+ {
+ SystemSounds.Beep.Play();
+ return;
+ }
+ Close();
+ Event.Set();
+ return;
+ }
+// *******************************************************************************************************************************************************************************
+// ********************************************************************************** P U R C H A S E P R I C E ***************************************************************
+// *******************************************************************************************************************************************************************************
+ private void txtPurchasePrice__OnLostFocusHandler(Object sender,RoutedEventArgs routedEventArgs)
+ {
+ HandlePurchasePriceEvents();
+ }
+ private void txtPurchasePrice_OnKeyDownHandler(object sender,KeyEventArgs e)
+ {
+ if(e.Key==Key.Return)
+ {
+ HandlePurchasePriceEvents();
+ }
+ }
+ private void HandlePurchasePriceEvents()
+ {
+ double value=0.00;
+ value=Utility.ParseCurrency(txtPurchasePrice.Text);
+ if(PurchasePrice.Equals(value)) return;
+ PurchasePrice=value;
+ UpdatePurchasePrice();
+ }
+ private void UpdatePurchasePrice()
+ {
+ txtPurchasePrice.Text=Utility.FormatCurrency(PurchasePrice);
+ }
+// *********************************************************************************************************************************************************************************
+ private void dpPurchaseDate_SelectionChanged(object sender,RoutedEventArgs e)
+ {
+ if(null==dpPurchaseDate.SelectedDate) return;
+ PurchaseDate=dpPurchaseDate.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) return false;
+ if(Utility.IsEpoch(PurchaseDate)) return false;
+ if(!dateGenerator.IsMarketOpen(PurchaseDate))return false;
+ if(double.IsNaN(PurchasePrice)) return false;
+
+ return true;
+ }
+ private void UpdateCompanyName()
+ {
+ CompanyProfile companyProfile=CompanyProfileDA.GetCompanyProfile(Symbol);
+ if(null==companyProfile||null==companyProfile.CompanyName) return;
+ lblCompanyName.Content=companyProfile.CompanyName.ToUpper();
+ }
+ }
+}