Commit Latest

This commit is contained in:
2025-06-26 20:20:26 -04:00
parent 27881870f6
commit 961eb11e82
3 changed files with 703 additions and 675 deletions

View File

@@ -1,3 +1,6 @@
vscode settings are in C:\Users\skess\AppData\Roaming\Code\User/settings.json
dotnet new avalonia.window -na EditPositionDialog -n PortfolioManager.Dialog
dotnet new avalonia.usercontrol -na [namespace] -n [name]

View File

@@ -66,7 +66,6 @@ namespace PortfolioManager.Renderers
private int selectedDayCount = int.MinValue;
private Price latestPrice = default;
private Price zeroPrice = default;
private bool showLabels = true;
private bool showMarkers = true;
private bool showLegend = false;
private bool showTradeLabels = true;
@@ -90,13 +89,7 @@ namespace PortfolioManager.Renderers
private void OnBollingerBandRendererPropertyChanged(Object sender, PropertyChangedEventArgs eventArgs)
{
if (eventArgs.PropertyName.Equals("ShowLabels"))
{
}
else if (eventArgs.PropertyName.Equals("ShowMarkers"))
{
}
else if (eventArgs.PropertyName.Equals("ShowLegend"))
if (eventArgs.PropertyName.Equals("ShowLegend"))
{
if (!ShowLegend) Plotter.Plot.HideLegend();
else Plotter.Plot.ShowLegend();
@@ -106,10 +99,6 @@ namespace PortfolioManager.Renderers
if (!ShowLegend) Plotter.Plot.HideLegend();
else Plotter.Plot.ShowLegend();
}
// else if (eventArgs.PropertyName.Equals("ShowInsiderTransactions"))
// {
// SetData(selectedSymbol, selectedDayCount);
// }
}
public void Render()
@@ -169,12 +158,15 @@ namespace PortfolioManager.Renderers
bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices);
CalculateOffsets();
GenerateBollingerBands();
GenerateZeroPoint(zeroPrice);
GenerateInsiderTransactions();
GenerateStopLimits();
GenerateTradePoints();
GenerateZeroPoint(zeroPrice);
}
/// <summary>
/// These offsets are used to place markers relative to the area in which the graph occupies.
/// </summary>
private void CalculateOffsets()
{
double maxBollingerDate = bollingerBands.Max(x => x.Date).ToOADate();
@@ -276,7 +268,7 @@ namespace PortfolioManager.Renderers
else
{
if (null == zeroPrice) return;
if (null == stopLimit || null == zeroPrice || !showTradeLabels) return;
if (null == stopLimit || null == zeroPrice) return;
Price latestPrice = prices[0];
double percentOffsetFromLow = ((latestPrice.Low - stopLimit.StopPrice) / stopLimit.StopPrice);
@@ -295,7 +287,7 @@ namespace PortfolioManager.Renderers
/// </summary>
private void GenerateTradePoints()
{
if (null == portfolioTradesLots || 0 == portfolioTradesLots.Count || !showTradeLabels) return;
if (null == portfolioTradesLots || 0 == portfolioTradesLots.Count) return;
// Here we add the image markers
Image tradePointMarker = TextMarkerImageGenerator.ToSPImage(ImageCache.GetInstance().GetImage(ImageCache.ImageType.YellowTriangleUp));
for (int index = 0; index < portfolioTradesLots.Count; index++)
@@ -305,6 +297,8 @@ namespace PortfolioManager.Renderers
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, tradePointMarker, SizeFactor.Normal);
}
if (showTradeLabels)
{
// This adds the text markers
for (int index = 0; index < portfolioTradesLots.Count; index++)
{
@@ -320,6 +314,7 @@ namespace PortfolioManager.Renderers
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
}
}
}
/// <summary>
/// Generate Insider Transactions
@@ -524,16 +519,16 @@ namespace PortfolioManager.Renderers
}
}
public bool ShowLabels
public bool ShowTradeLabels
{
get
{
return showLabels;
return showTradeLabels;
}
set
{
showLabels = value;
base.OnPropertyChanged("ShowLabels");
showTradeLabels = value;
base.OnPropertyChanged("ShowTradeLabels");
}
}

View File

@@ -8,13 +8,11 @@ using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
using DynamicData;
using MarketData;
using MarketData.Cache;
using MarketData.DataAccess;
using MarketData.MarketDataModel;
using MarketData.Utils;
using PortfolioManager.Renderers;
using PortfolioManager.UIUtils;
using ScottPlot.Avalonia;
namespace PortfolioManager.ViewModels
{
@@ -30,6 +28,8 @@ namespace PortfolioManager.ViewModels
private String companyName = default;
private BollingerBandRenderer bollingerBandRenderer = default;
private bool showInsiderTransactions = true;
private bool showTradeLabels = true;
private bool syncTradeToBand = true;
public ScottPlotViewModel()
{
@@ -45,6 +45,23 @@ namespace PortfolioManager.ViewModels
base.OnDispose();
}
public override String Title
{
get
{
if (null == selectedSymbol) return DisplayName;
return "Bollinger " + "(" + selectedSymbol + ")";
}
}
public override String DisplayName
{
get
{
return "Bollinger Band";
}
}
private void Initialize(bool executePropertyChanged = true)
{
Task workerTask = Task.Factory.StartNew(() =>
@@ -96,19 +113,23 @@ namespace PortfolioManager.ViewModels
{
companyName = PricingDA.GetNameForSymbol(selectedSymbol);
bollingerBandRenderer = new BollingerBandRenderer(Plotter);
bollingerBandRenderer.ShowInsiderTransactions=showInsiderTransactions;
bollingerBandRenderer.SyncTradeToBand = syncTradeToBand;
bollingerBandRenderer.ShowInsiderTransactions = showInsiderTransactions;
bollingerBandRenderer.ShowTradeLabels = showTradeLabels;
bollingerBandRenderer.SetData(selectedSymbol, selectedDayCount);
bollingerBandRenderer.Render();
});
workerTask.ContinueWith((continuation) =>
{
base.OnPropertyChanged("GraphTitle");
base.OnPropertyChanged("Title");
IsBusy = false;
});
}
}
// ********************************************** P E R S I S T E N C E *************************
public override bool CanPersist()
{
return false;
@@ -117,6 +138,29 @@ namespace PortfolioManager.ViewModels
public override SaveParameters GetSaveParameters()
{
return null;
// SaveParameters saveParams = new SaveParameters();
// if (String.IsNullOrEmpty(selectedSymbol)) return null;
// saveParams.Add(new KeyValuePair<String, String>("Type", GetType().Namespace + "." + GetType().Name));
// saveParams.Add(new KeyValuePair<String, String>("SelectedSymbol", selectedSymbol));
// saveParams.Add(new KeyValuePair<String, String>("SelectedWatchList", selectedWatchList));
// 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>("UseLeastSquaresFit", useLeastSquaresFit.ToString()));
// saveParams.Add(new KeyValuePair<String, String>("ShowInsiderTransactions", showInsiderTransactions.ToString()));
// if (null != stopLimits && 0 != stopLimits.Count)
// {
// saveParams.Add(new KeyValuePair<String, String>("StopHistoryCount", stopLimits.Count.ToString()));
// for (int index = 0; index < stopLimits.Count; index++)
// {
// String strItemKey = String.Format("StopHistory_{0}", index);
// StopLimit stopLimit = stopLimits[index];
// NVPCollection nvpCollection = stopLimit.ToNVPCollection();
// String strStopHistoryItem = nvpCollection.ToString();
// saveParams.Add(new KeyValuePair<String, String>(strItemKey, strStopHistoryItem));
// }
// }
// return saveParams;
}
public override void SetSaveParameters(SaveParameters saveParameters)
@@ -125,8 +169,6 @@ namespace PortfolioManager.ViewModels
// ****************************************************** P R O P E R T I E S ************************************************
// public AvaPlot Plotter { get; set; } = default;
public String GraphTitle
{
get
@@ -235,26 +277,16 @@ namespace PortfolioManager.ViewModels
}
}
public override String Title
{
get
{
if (null == selectedSymbol) return DisplayName;
return "Bollinger " + "(" + selectedSymbol + ")";
}
}
public bool SyncTradeToBand
{
get
{
if (null == bollingerBandRenderer) return false;
return bollingerBandRenderer.SyncTradeToBand;
return syncTradeToBand;
}
set
{
bollingerBandRenderer.SyncTradeToBand = value;
syncTradeToBand = value;
base.OnPropertyChanged("SyncTradeToBand");
}
}
@@ -262,13 +294,12 @@ namespace PortfolioManager.ViewModels
{
get
{
if (null == bollingerBandRenderer) return false;
return bollingerBandRenderer.ShowLabels;
return showTradeLabels;
}
set
{
bollingerBandRenderer.ShowLabels = value;
showTradeLabels = value;
base.OnPropertyChanged("ShowTradeLabels");
}
}
@@ -285,7 +316,6 @@ namespace PortfolioManager.ViewModels
}
}
[RelayCommand]
public async Task Refresh()
{