Add tooltips for MGSHMomentumView

This commit is contained in:
2025-06-11 14:45:03 -04:00
parent 46d4ccb8a5
commit 7e173bcf23
3 changed files with 823 additions and 14 deletions

View File

@@ -401,6 +401,13 @@ namespace PortfolioManager.ViewModels
{
base.OnPropertyChanged("ExpectationDescription");
base.OnPropertyChanged("CompanyDescriptionSelectedPosition");
base.OnPropertyChanged("ToolTipSold");
base.OnPropertyChanged("ToolTipExposure");
base.OnPropertyChanged("ToolTipInitialStop");
base.OnPropertyChanged("ToolTipTrailingStop");
base.OnPropertyChanged("ToolTipR");
base.OnPropertyChanged("ToolTipTotalRiskExposure");
base.OnPropertyChanged("ToolTipRMultiple");
}
private void UpdatePositionPrices(bool change = true)
@@ -685,6 +692,46 @@ namespace PortfolioManager.ViewModels
// ************************************************** T O O L T I P S *************************************************
public String ToolTipExposure
{
get
{
if (null == selectedPosition) return "No row selected.";
StringBuilder sb = new StringBuilder();
if (selectedPosition.IsActivePosition)
{
sb.Append("Exposure = PurchasePrice * Shares\n");
sb.Append($"{Utility.FormatCurrency(selectedPosition.Exposure)} = {Utility.FormatCurrency(selectedPosition.PurchasePrice)} * {Utility.FormatNumber(selectedPosition.Shares, 3)}");
}
else
{
sb.Append("Original Exposure = PurchasePrice * Shares\n");
sb.Append($"{Utility.FormatCurrency(selectedPosition.PurchasePrice * selectedPosition.Shares)} = {Utility.FormatCurrency(selectedPosition.PurchasePrice)} * {Utility.FormatNumber(selectedPosition.Shares, 3)}");
}
return sb.ToString();
}
}
public String ToolTipSold
{
get
{
if (null == selectedPosition) return "No row selected.";
StringBuilder sb = new StringBuilder();
if (selectedPosition.IsActivePosition)
{
sb.Append($"{selectedPosition.Symbol} is currently active.");
}
else
{
sb.Append($"{selectedPosition.Symbol} {selectedPosition.Comment}.");
}
return sb.ToString();
}
}
public String ExpectationDescription
{
get
@@ -706,20 +753,127 @@ namespace PortfolioManager.ViewModels
sb.Append("The calculations are based on closed positions.");
return sb.ToString();
}
}
}
public String CompanyDescriptionSelectedPosition
{
get
{
if(null== selectedPosition || null==selectedPosition.Symbol)return "No row selected.";
CompanyProfile companyProfile=CompanyProfileDA.GetCompanyProfile(selectedPosition.Symbol);
if(null==companyProfile || null==companyProfile.Description || "".Equals(companyProfile.Description))return "No description found.";
if (null == selectedPosition || null == selectedPosition.Symbol) return "No row selected.";
CompanyProfile companyProfile = CompanyProfileDA.GetCompanyProfile(selectedPosition.Symbol);
if (null == companyProfile || null == companyProfile.Description || "".Equals(companyProfile.Description)) return "No description found.";
StringBuilder sb = new StringBuilder();
sb.Append(companyProfile.Symbol).Append(" - ").Append(companyProfile.CompanyName).Append("\n");
sb.Append(companyProfile.Sector).Append("/").Append(companyProfile.Industry).Append("\n").Append(companyProfile.Description);
return sb.ToString();
}
}
public String ToolTipInitialStop
{
get
{
if (null == selectedPosition) return "No row selected.";
StringBuilder sb = new StringBuilder();
sb.Append("[InitialStop]=([InitialStopLimit])").Append("\n");
sb.Append(Utility.FormatCurrency(selectedPosition.InitialStopLimit)).Append("=").Append(Utility.FormatCurrency(selectedPosition.InitialStopLimit));
return sb.ToString();
}
}
public String ToolTipTrailingStop
{
get
{
if (null == selectedPosition) return "No row selected.";
StringBuilder sb = new StringBuilder();
sb.Append("[TrailingStop]=([TrailingStopLimit])").Append("\n");
sb.Append(Utility.FormatCurrency(selectedPosition.TrailingStopLimit)).Append("=").Append(Utility.FormatCurrency(selectedPosition.TrailingStopLimit)).Append("\n");
List<MarketData.Generator.Model.StopLimit> stopLimits = GetHistoricalStopLimits();
if (selectedPosition.TrailingStopLimit > selectedPosition.PurchasePrice)
{
sb.Append("Riskless Gain").Append(" = ");
sb.Append(String.Format("(Trailing Stop - Purchase Price) * Shares"));
sb.Append("\n");
sb.Append(String.Format("{0}", Utility.FormatCurrency((selectedPosition.TrailingStopLimit - selectedPosition.PurchasePrice) * selectedPosition.Shares)));
sb.Append(String.Format("=({0}-{1})*{2}", Utility.FormatCurrency(selectedPosition.TrailingStopLimit), Utility.FormatCurrency(selectedPosition.PurchasePrice), Utility.FormatNumber(selectedPosition.Shares, 3)));
sb.Append("\n");
}
if (null != stopLimits && 0 != stopLimits.Count)
{
sb.Append("Stop History").Append("\n");
foreach (MarketData.Generator.Model.StopLimit stopLimit in stopLimits)
{
sb.Append(String.Format("Analysis Date:{0} New Stop:{1} Previous Stop:{2}", Utility.DateTimeToStringMMSDDSYYYY(stopLimit.AnalysisDate), Utility.FormatCurrency(stopLimit.NewStop), Utility.FormatCurrency(stopLimit.PreviousStop)));
sb.Append("\n");
}
}
return sb.ToString();
}
}
public String ToolTipR
{
get
{
if(null==selectedPosition)return "No row selected.";
StringBuilder sb=new StringBuilder();
sb.Append("Current R/Share. See RMultiple for initial risk assumptions.").Append("\n");
sb.Append("R/Share=TrailingStop>PurchasePrice?0.00:PurchasePrice-TrailingStop").Append("\n");
if(selectedPosition.TrailingStopLimit>selectedPosition.PurchasePrice)
{
sb.Append(Utility.FormatCurrency(0)).Append("=").Append(Utility.FormatCurrency(0));
}
else
{
sb.Append(Utility.FormatCurrency(selectedPosition.TrailingStopLimit>selectedPosition.PurchasePrice?0.00:selectedPosition.PurchasePrice-selectedPosition.TrailingStopLimit));
sb.Append("=").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice)).Append("-").Append(Utility.FormatCurrency(selectedPosition.TrailingStopLimit));
}
return sb.ToString();
}
}
public String ToolTipTotalRiskExposure
{
get
{
if(null==selectedPosition)return "No row selected.";
StringBuilder sb=new StringBuilder();
sb.Append("Current Risk. See RMultiple for initial risk assumptions.").Append("\n");
sb.Append("[TotalRiskExposure]=([R/Share]*[Shares])").Append("\n");
if(null==selectedPosition) return sb.ToString();
sb.Append(Utility.FormatCurrency(selectedPosition.TotalRiskExposure)).Append("=(").Append(Utility.FormatCurrency(selectedPosition.R)).Append("*").Append(Utility.FormatNumber(selectedPosition.Shares,0)).Append(")");
return sb.ToString();
}
}
public String ToolTipRMultiple
{
get
{
if(null==selectedPosition)return "Please select a position by clicking on a row.";
StringBuilder sb=new StringBuilder();
sb.Append("RMultiple is based on original position setup.").Append("\n");
sb.Append("Original Exposure=").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice*selectedPosition.Shares)).Append("\n");
sb.Append("Original R/Share=PurchasePrice-InitialStop").Append("\n");
sb.Append(Utility.FormatCurrency(selectedPosition.PurchasePrice-selectedPosition.InitialStopLimit)).Append("=").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice)).Append("-").Append(Utility.FormatCurrency(selectedPosition.InitialStopLimit)).Append("\n");
sb.Append("Original Risk=Original R/Share*Shares").Append("\n");
sb.Append(Utility.FormatCurrency((selectedPosition.PurchasePrice-selectedPosition.InitialStopLimit)*selectedPosition.Shares)).Append("=").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice-selectedPosition.InitialStopLimit)).Append("*").Append(selectedPosition.Shares).Append("\n");
sb.Append("RMultiple=(CurrentPrice-PurchasePrice)/(PurchasePrice-InitialStop)").Append("\n");
sb.Append(selectedPosition.RMultipleAsString).Append("=").Append("(").Append(Utility.FormatCurrency(selectedPosition.CurrentPrice)).Append("-").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice)).Append(")");
sb.Append("/").Append("(").Append(Utility.FormatCurrency(selectedPosition.PurchasePrice)).Append("-").Append(Utility.FormatCurrency(selectedPosition.InitialStopLimit)).Append(")");
return sb.ToString();
}
}
// ************************************************************** T O O L T I P H E L P E R S **************************************************************
public MarketData.Generator.Model.StopLimits GetHistoricalStopLimits()
{
if (null == sessionParams || null == selectedPosition) return null;
MarketData.Generator.Model.StopLimits stopLimits = new MarketData.Generator.Model.StopLimits(
(from MarketData.Generator.Model.StopLimit stopLimit in sessionParams.StopLimits where stopLimit.StopLimitId.Equals(selectedPosition.Symbol + Utility.DateTimeToStringYYYYMMDDMMSSTT(selectedPosition.PurchaseDate)) select stopLimit)
.OrderByDescending(x => x.AnalysisDate).ToList());
return stopLimits;
}
}
}