Files
Avalonia/PortfolioManager/Dialogs/EditPositionDialogViewModel.cs
2026-01-25 11:50:38 -05:00

145 lines
4.1 KiB
C#

using System;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls;
using CommunityToolkit.Mvvm.Input;
using MarketData.DataAccess;
using MarketData.Generator.Interface;
using MarketData.MarketDataModel;
using MarketData.Numerical;
using MarketData.Utils;
using PortfolioManager.ViewModels;
namespace PortfolioManager.Dialogs
{
public partial class EditPositionDialogViewModel : DialogViewModelBase
{
private IPosition sourcePosition;
private bool syncTrailingStop = true;
public EditPositionDialogViewModel(Window dialogWindow, IPosition clonedPosition)
: base(dialogWindow)
{
sourcePosition = clonedPosition;
DisplayName = "Edit Position";
}
public String Symbol
{
get { return sourcePosition.Symbol; }
}
public String CompanyName
{
get
{
CompanyProfile companyProfile = CompanyProfileDA.GetCompanyProfile(sourcePosition.Symbol);
return companyProfile.CompanyName;
}
}
public String PurchaseDate
{
get
{
return sourcePosition.PurchaseDate.ToShortDateString();
}
}
public String PurchasePrice
{
get
{
return Utility.FormatCurrency(sourcePosition.PurchasePrice);
}
set
{
sourcePosition.PurchasePrice = Utility.ParseCurrency(value);
base.OnPropertyChanged("PurchasePrice");
base.OnPropertyChanged("InitialStopRecommendation");
}
}
public String InitialStopLimit
{
get
{
return Utility.FormatCurrency(sourcePosition.InitialStopLimit);
}
set
{
sourcePosition.InitialStopLimit = Utility.ParseCurrency(value);
base.OnPropertyChanged("InitialStopLimit");
if (syncTrailingStop)
{
TrailingStopLimit = Utility.FormatCurrency(sourcePosition.InitialStopLimit);
}
}
}
public bool SyncTrailingStop
{
get
{
return syncTrailingStop;
}
set
{
syncTrailingStop = value;
base.OnPropertyChanged("SyncTrailingStop");
}
}
public String InitialStopRecommendation
{
get
{
StringBuilder sb = new StringBuilder();
sb.Append("Recommended Initial Stop: ").Append(Utility.FormatCurrency(Numerics.Discount(sourcePosition.PurchasePrice,sourcePosition.PositionRiskPercentDecimal), 2));
sb.Append(" = Discount(").Append(Utility.FormatCurrency(sourcePosition.PurchasePrice,2)).Append(",").Append(Utility.FormatPercent(sourcePosition.PositionRiskPercentDecimal,2)).Append(")");
return sb.ToString();
}
}
public String InitialStopRecommendationDescription
{
get
{
return "InitialStopRecommendationDescription";
}
}
public String TrailingStopLimit
{
get
{
return Utility.FormatCurrency(sourcePosition.TrailingStopLimit);
}
set
{
if (Utility.ParseCurrency(value).Equals(sourcePosition.TrailingStopLimit)) return;
sourcePosition.TrailingStopLimit = Utility.ParseCurrency(value);
base.OnPropertyChanged("TrailingStopLimit");
}
}
public IPosition GetResult()
{
return sourcePosition;
}
[RelayCommand]
public async Task OkButtonClick()
{
IsSuccess = true;
await Close();
}
[RelayCommand]
public async Task CancelButtonClick()
{
await Close();
}
}
}