Add ability to show image markers.

This commit is contained in:
2025-06-15 20:11:58 -04:00
parent 9b1135b5ec
commit 20d253d50e
14 changed files with 236 additions and 54 deletions

View File

@@ -5,6 +5,7 @@ using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Media;
using CommunityToolkit.Mvvm.Input;
using DynamicData;
using Eremex.AvaloniaUI.Charts;
@@ -227,6 +228,12 @@ namespace PortfolioManager.ViewModels
syncTradeToBand = value;
if (syncTradeToBand) showTradeLabels = true;
base.OnPropertyChanged("SyncTradeToBand");
base.OnPropertyChanged("TradePoints");
base.OnPropertyChanged("ZeroPoint");
base.OnPropertyChanged("StopLimits");
base.OnPropertyChanged("TradePointMarkers");
base.OnPropertyChanged("ZeroPointMarkers");
base.OnPropertyChanged("StopLimitMarkers");
}
}
@@ -296,7 +303,21 @@ namespace PortfolioManager.ViewModels
}
}
// ******************************************************************* P E R S I S T E N C E ***************************************************
/// <summary>
/// See the XAML and also OSValueConverter in UIUtils for an explanation.
/// </summary>
public int MarkerSize
{
get
{
return 0;
}
}
// *********************************************************************************************************************************************
// ******************************************************************* P E R S I S T E N C E ***************************************************
public override bool CanPersist()
{
@@ -313,8 +334,6 @@ namespace PortfolioManager.ViewModels
saveParams.Add(new KeyValuePair<String, String>("SelectedDayCount", selectedDayCount.ToString()));
saveParams.Add(new KeyValuePair<String, String>("SyncTradeToBand", syncTradeToBand.ToString()));
saveParams.Add(new KeyValuePair<String, String>("ShowTradeLabels", showTradeLabels.ToString()));
// saveParams.Add(new KeyValuePair<String, String>("ShowRiskFree", showRiskFree.ToString()));
// saveParams.Add(new KeyValuePair<String, String>("IsLegendVisible", isLegendVisible.ToString()));
saveParams.Add(new KeyValuePair<String, String>("UseLeastSquaresFit", useLeastSquaresFit.ToString()));
saveParams.Add(new KeyValuePair<String, String>("ShowInsiderTransactions", showInsiderTransactions.ToString()));
if(null!=stopLimits && 0!=stopLimits.Count)
@@ -353,11 +372,6 @@ namespace PortfolioManager.ViewModels
else showTradeLabels=true;
}
catch (Exception) { showTradeLabels = true; }
// try
// {
// if(saveParameters.ContainsKey("IsLegendVisible"))isLegendVisible=Boolean.Parse((from KeyValuePair<String,String> item in saveParameters where item.Key.Equals("IsLegendVisible") select item).FirstOrDefault().Value);
// }
// catch (Exception){;}
try
{
if(saveParameters.ContainsKey("UseLeastSquaresFit"))useLeastSquaresFit=Boolean.Parse((from KeyValuePair<String,String> item in saveParameters where item.Key.Equals("UseLeastSquaresFit") select item).FirstOrDefault().Value);
@@ -368,9 +382,6 @@ namespace PortfolioManager.ViewModels
if(saveParameters.ContainsKey("ShowInsiderTransactions"))showInsiderTransactions=Boolean.Parse((from KeyValuePair<String,String> item in saveParameters where item.Key.Equals("ShowInsiderTransactions") select item).FirstOrDefault().Value);
}
catch (Exception){;}
// try{showRiskFree = Boolean.Parse((from KeyValuePair<String, String> item in saveParameters where item.Key.Equals("ShowRiskFree") select item).FirstOrDefault().Value);}
// catch (Exception){;}
try
{
if(saveParameters.ContainsKey("StopHistoryCount"))
@@ -418,8 +429,6 @@ namespace PortfolioManager.ViewModels
{
base.DisplayName = "Bollinger(" + selectedSymbol + ")";
base.OnPropertyChanged("DisplayName");
// InitializeDataSources();
// InitializeData();
stopLimit = PortfolioDA.GetStopLimit(selectedSymbol);
portfolioTrades = PortfolioDA.GetTradesSymbol(selectedSymbol);
portfolioTradesLots = LotAggregator.CombineLots(portfolioTrades);
@@ -480,13 +489,14 @@ namespace PortfolioManager.ViewModels
base.OnPropertyChanged("LeastSquares");
base.OnPropertyChanged("GraphTitle");
base.OnPropertyChanged("Title");
// base.OnPropertyChanged("TradePoints");
// base.OnPropertyChanged("Markers");
// base.OnPropertyChanged("ZeroPoint");
// base.OnPropertyChanged("ZeroPointMarkers");
// base.OnPropertyChanged("StopLimit");
// base.OnPropertyChanged("StopLimitMarkers");
base.OnPropertyChanged("TradePoints");
base.OnPropertyChanged("ZeroPoint");
base.OnPropertyChanged("StopLimits");
base.OnPropertyChanged("TradePointMarkers");
base.OnPropertyChanged("ZeroPointMarkers");
base.OnPropertyChanged("StopLimitMarkers");
base.OnPropertyChanged("InsiderTransactionPointDisposedSmall");
base.OnPropertyChanged("InsiderTransactionPointDisposedMedium");
@@ -496,7 +506,6 @@ namespace PortfolioManager.ViewModels
base.OnPropertyChanged("InsiderTransactionPointAcquiredMedium");
base.OnPropertyChanged("InsiderTransactionPointAcquiredLarge");
// base.OnPropertyChanged("InsiderTransactionPointMarkersDisposedSmall");
// base.OnPropertyChanged("InsiderTransactionPointMarkersDisposedMedium");
// base.OnPropertyChanged("InsiderTransactionPointMarkersDisposedLarge");
@@ -528,9 +537,6 @@ namespace PortfolioManager.ViewModels
base.OnPropertyChanged("Symbols");
});
}
}
// ************************************************* C O M P O S I T E P R O P E R T I E S ********************************************
@@ -609,10 +615,65 @@ namespace PortfolioManager.ViewModels
}
}
public CompositeDataSource TradePoints
{
get
{
if (!showTradeLabels) return Empty();
return compositeDataSourceTradePoints;
}
}
public IImage TradePointMarkers
{
get
{
if (!showTradeLabels) return null;
return ImageCache.GetInstance().GetImage(ImageCache.ImageType.YellowTriangleUp);
}
}
public CompositeDataSource ZeroPoint
{
get
{
if (!showTradeLabels) return Empty();
return compositeDataSourceZeroPoint;
}
}
public IImage ZeroPointMarkers
{
get
{
if (!showTradeLabels) return null;
return ImageCache.GetInstance().GetImage(ImageCache.ImageType.BlueTriangleUp);
}
}
public CompositeDataSource StopLimits
{
get
{
if (!showTradeLabels) return Empty();
return compositeDataSourceStopLimit;
}
}
public IImage StopLimitMarkers
{
get
{
if (!showTradeLabels) return null;
return ImageCache.GetInstance().GetImage(ImageCache.ImageType.RedTriangleUp);
}
}
public CompositeDataSource InsiderTransactionPointDisposedSmall
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointDisposedSmall;
}
}
@@ -621,6 +682,7 @@ namespace PortfolioManager.ViewModels
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointDisposedMedium;
}
}
@@ -629,6 +691,7 @@ namespace PortfolioManager.ViewModels
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointDisposedLarge;
}
}
@@ -637,6 +700,7 @@ namespace PortfolioManager.ViewModels
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointAcquiredSmall;
}
}
@@ -645,6 +709,7 @@ namespace PortfolioManager.ViewModels
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointAcquiredMedium;
}
}
@@ -653,14 +718,12 @@ namespace PortfolioManager.ViewModels
{
get
{
if (!showInsiderTransactions) return Empty();
return compositeDataSourceInsiderTransactionPointAcquiredLarge;
}
}
// *********************************************************************************************************************************************
public void CreateCompositeDataSources()
{
if (null == prices || 0 == prices.Count) return;

View File

@@ -8,6 +8,7 @@ using Avalonia.Threading;
using Axiom.Utils;
using MarketData.Cache;
using MarketData.DataAccess;
using PortfolioManager.Cache;
using PortfolioManager.Command;
namespace PortfolioManager.ViewModels
@@ -43,9 +44,10 @@ namespace PortfolioManager.ViewModels
}
try { LocalPriceCache.GetInstance().Dispose(); } catch (Exception) {; }
try { GBPriceCache.GetInstance().Dispose(); } catch (Exception) {; }
try { ImageCache.GetInstance().Dispose(); } catch (Exception) {; }
//try{PriceCache.GetInstance().Dispose();}catch(Exception){;}
// try{SymbolCache.GetInstance().Dispose();}catch(Exception){;}
base.OnDispose();
// try{SymbolCache.GetInstance().Dispose();}catch(Exception){;}
base.OnDispose();
MDTrace.WriteLine(LogLevel.DEBUG, "[MainWindowViewModel:OnDispose] LEAVE");
}