diff --git a/PortfolioManager/ViewModels/BollingerBandViewModel.cs b/PortfolioManager/ViewModels/BollingerBandViewModel.cs index 80a4238..24ac178 100644 --- a/PortfolioManager/ViewModels/BollingerBandViewModel.cs +++ b/PortfolioManager/ViewModels/BollingerBandViewModel.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -21,28 +22,44 @@ using PortfolioManager.DataSeriesViewModels; using PortfolioManager.Extensions; using PortfolioManager.Models; using PortfolioManager.UIUtils; +using ScottPlot; using SkiaSharp; namespace PortfolioManager.ViewModels { public static class TextMarkerImageGenerator { - public static IImage GenerateImage(String text) + public static Image GenerateImage(String text) { ImageHelper imageHelper = new ImageHelper(); int fontSize = 36; - int width = 640; + int width = 130; imageHelper.CreateImage(width, fontSize); imageHelper.Fill(SKColors.White); SKTextAlign align = SKTextAlign.Center; SKFont font = new SKFont(SKTypeface.FromFamilyName("Helvetica"), fontSize); imageHelper.DrawText(text, new SKPoint(width / 2, fontSize - 2), SKColors.Black, align, font); - Avalonia.Media.Imaging.Bitmap avBitmap = new Avalonia.Media.Imaging.Bitmap(imageHelper.ToStream()); - return avBitmap; - // avBitmap.Save("c:\\3\\mybitmap.jpg"); } + using MemoryStream memoryStream = new MemoryStream(); + imageHelper.ToStream().CopyTo(memoryStream); + return new ScottPlot.Image(memoryStream.ToArray()); } + + // public static IImage GenerateImage(String text) + // { + // ImageHelper imageHelper = new ImageHelper(); + // int fontSize = 36; + // int width = 130; + // imageHelper.CreateImage(width, fontSize); + // imageHelper.Fill(SKColors.White); + // SKTextAlign align = SKTextAlign.Center; + // SKFont font = new SKFont(SKTypeface.FromFamilyName("Helvetica"), fontSize); + // imageHelper.DrawText(text, new SKPoint(width / 2, fontSize - 2), SKColors.Black, align, font); + // Avalonia.Media.Imaging.Bitmap avBitmap = new Avalonia.Media.Imaging.Bitmap(imageHelper.ToStream()); + // return avBitmap; + // // avBitmap.Save("c:\\3\\mybitmap.jpg"); } + // } - public static IImage GenerateImage(int width, int height,SKColor color) + public static IImage GenerateImage(int width, int height, SKColor color) { ImageHelper imageHelper = new ImageHelper(); imageHelper.CreateImage(width, height); diff --git a/PortfolioManager/ViewModels/ScottPlotViewModel.cs b/PortfolioManager/ViewModels/ScottPlotViewModel.cs index 7284329..e5e0858 100644 --- a/PortfolioManager/ViewModels/ScottPlotViewModel.cs +++ b/PortfolioManager/ViewModels/ScottPlotViewModel.cs @@ -1,10 +1,12 @@ using System; +using Avalonia.Media; using Eremex.AvaloniaUI.Charts; using MarketData.DataAccess; using MarketData.Generator; using MarketData.MarketDataModel; using PortfolioManager.DataSeriesViewModels; using PortfolioManager.Models; +using ScottPlot; using ScottPlot.Avalonia; using ScottPlot.Plottables; using ShimSkiaSharp; @@ -12,13 +14,60 @@ using SkiaSharp; namespace PortfolioManager.ViewModels { - public class BollingerBandCompositeDataSourceGenerater + public class BollingerBandCompositeDataSourceGenerater + { + public BollingerBandCompositeDataSourceGenerater() { - public BollingerBandCompositeDataSourceGenerater() - { - } + } - public void GenerateCompositeDataSources(AvaPlot plotter, BollingerBands bollingerBands) + public void Render(AvaPlot plotter) + { + plotter.Plot.Axes.AutoScale(); + plotter.Refresh(); + } + + public void SetData(String selectedSymbol, int selectedDayCount, AvaPlot plotter) + { + Prices prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount); + BollingerBands bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices); + + // calculate the break even price on the open trades for this symbol + PortfolioTrades portfolioTrades = PortfolioDA.GetTradesSymbol(selectedSymbol); + PortfolioTrades openTrades = portfolioTrades.GetOpenTrades(); + DateTime latestPricingDate = PricingDA.GetLatestDate(selectedSymbol); + Price latestPrice = PricingDA.GetPrice(selectedSymbol, latestPricingDate); + Price zeroPrice = ParityGenerator.GenerateGainLossValue(openTrades, latestPrice); + GenerateCompositeDataSources(plotter, bollingerBands); + GenerateZeroPoint(plotter, zeroPrice); + } + + private void GenerateZeroPoint(AvaPlot plotter, Price zeroPrice) + { + ZeroPoint = GainLossModel.Price(zeroPrice); + (DateTime[] dates, double[] values) = ZeroPoint.ToXYData(); + + Scatter scatter = plotter.Plot.Add.Scatter(dates, values, ScottPlot.Color.FromSKColor(SKColors.Blue)); + // Marker marker = plotter.Plot.Add.Marker(dates[0].ToOADate(), values[0] / 1.025); + // marker.MarkerFillColor = ScottPlot.Color.FromSKColor(SKColors.Blue); + // marker.MarkerStyle.Shape = MarkerShape.TriUp; + // marker.MarkerStyle.Size = 15; + + IImage image = TextMarkerImageGenerator.GenerateImage("Even $52.14 (+.25%"); + Coordinates coordinates = new Coordinates(dates[0].ToOADate(), values[0] / 1.025); + Marker marker = plotter.Plot.Add.ImageMarker(coordinates, image); + Image image = default; + + + + +// Marker marker=plotter.Plot.Add.Marker(K.DataAdapter.ItemCount-1,values[0]); + // Marker marker=plotter.Plot.Add.Marker(0,values[0]); + // marker.MarkerFillColor = ScottPlot.Color.FromSKColor(SKColors.Blue); + // marker.MarkerStyle.Shape = MarkerShape.TriUp; + // marker.MarkerStyle.Size = 15; + } + + private void GenerateCompositeDataSources(AvaPlot plotter, BollingerBands bollingerBands) { K = BollingerBandModel.K(bollingerBands); KL1 = BollingerBandModel.KL1(bollingerBands); @@ -36,74 +85,66 @@ namespace PortfolioManager.ViewModels (DateTime[] dates, double[] values) = K.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green)); scatter.LegendText = "K"; - scatter.LineWidth = 2; + scatter.LineWidth = 3; } { (DateTime[] dates, double[] values) = KL1.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green)); scatter.LegendText = "KL1"; - scatter.LineWidth = 1; + scatter.LineWidth = 2; } { (DateTime[] dates, double[] values) = L.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green)); scatter.LegendText = "L"; - scatter.LineWidth = 2; + scatter.LineWidth = 3; } { (DateTime[] dates, double[] values) = LP1.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green)); scatter.LegendText = "LP1"; - scatter.LineWidth = 1; + scatter.LineWidth = 2; } { (DateTime[] dates, double[] values) = High.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Blue)); scatter.LegendText = "High"; - scatter.LineWidth = 1; + scatter.LineWidth = 2; } { (DateTime[] dates, double[] values) = Low.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Red)); scatter.LegendText = "Low"; - scatter.LineWidth = 1; + scatter.LineWidth = 2; } { (DateTime[] dates, double[] values) = Close.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Black)); scatter.LegendText = "Close"; - scatter.LineWidth = 1; + scatter.LineWidth = 2; } { (DateTime[] dates, double[] values) = LeastSquares.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Orange)); scatter.LegendText = "LeastSquares"; - scatter.LineWidth = 1; - } + scatter.LineWidth = 2; + } { (DateTime[] dates, double[] values) = SMAN.ToXYData(); scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Purple)); scatter.LegendText = "SMAN"; - scatter.LineWidth = 1; - } - - - - - - + scatter.LineWidth = 2; + } } - - public CompositeDataSource K { get; private set; } = Empty(); public CompositeDataSource KL1 { get; private set; } = Empty(); public CompositeDataSource L { get; private set; } = Empty(); @@ -114,20 +155,17 @@ namespace PortfolioManager.ViewModels public CompositeDataSource SMAN { get; private set; } = Empty(); public CompositeDataSource Volume { get; private set; } = Empty(); public CompositeDataSource LeastSquares { get; private set; } = Empty(); + public CompositeDataSource ZeroPoint { get; private set; } = Empty(); private static CompositeDataSource Empty() - { - return new CompositeDataSource() { - DataAdapter = new SortedDateTimeDataAdapter() - }; - } + return new CompositeDataSource() + { + DataAdapter = new SortedDateTimeDataAdapter() + }; + } } - - - - - + public partial class ScottPlotViewModel : PlotterWorkspaceViewModel { private AvaPlot plotter = default; @@ -138,37 +176,21 @@ namespace PortfolioManager.ViewModels public void PlotterLoadedEvent(object sender, PlotterLoadedEventArgs e) { + String selectedSymbol = "SPY"; + int selectedDayCount = 180; + plotter = e.AvaPlot; // we should store this somewhere - Prices prices = PricingDA.GetPrices("SPY", 180); - BollingerBands bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices); + // Prices prices = PricingDA.GetPrices("SPY", 180); + // BollingerBands bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices); BollingerBandCompositeDataSourceGenerater bollingerBandCompositeDataSourceGenerater = new BollingerBandCompositeDataSourceGenerater(); - bollingerBandCompositeDataSourceGenerater.GenerateCompositeDataSources(plotter, bollingerBands); - plotter.Plot.Axes.AutoScale(); - plotter.Refresh(); + bollingerBandCompositeDataSourceGenerater.SetData(selectedSymbol, selectedDayCount, plotter); +//public void SetData(String selectedSymbol, int selectedDayCount, AvaPlot plotter) - - - // DateTime[] dates = new DateTime[prices.Count]; - // double[] closes = new double[prices.Count]; - - // for (int index = 0; index < prices.Count; index++) - // { - // dates[index] = prices[index].Date; - // closes[index] = prices[index].Close; - // } - - - - // plotter = e.AvaPlot; - // double[] dataX = { 1, 2, 3, 4, 5 }; - // double[] dataY = { 1, 4, 9, 16, 25 }; - // plotter.Plot.Add.Scatter(dataX, dataY); - // Scatter closeScatter = plotter.Plot.Add.ScatterLine(dates, closes, ScottPlot.Color.FromSKColor(SKColors.Red)); - // closeScatter.LegendText = "Close"; - // closeScatter.LineWidth = 2; +// bollingerBandCompositeDataSourceGenerater.GenerateCompositeDataSources(plotter, bollingerBands); + bollingerBandCompositeDataSourceGenerater.Render(plotter); // plotter.Plot.Axes.AutoScale(); - // plotter.Refresh(); + // plotter.Refresh(); } // ********************************************** P E R S I S T E N C E ************************* public override bool CanPersist() diff --git a/PortfolioManager/portfolio_manager.log b/PortfolioManager/portfolio_manager.log index d413dd1..af320db 100644 --- a/PortfolioManager/portfolio_manager.log +++ b/PortfolioManager/portfolio_manager.log @@ -156,3 +156,275 @@ [Thread=1][TRACE.DEBUG][6/18/2025 7:01:50 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE [Thread=1][TRACE.VERBOSE][6/18/2025 7:01:50 PM] [PortfolioManager.Program::Main(args)]There were 65 threads still running at application shutdown. [Thread=1][TRACE.VERBOSE][6/18/2025 7:01:50 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:18 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:18 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:18 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:18 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=6][TRACE.VERBOSE][6/19/2025 07:15:24 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=8][TRACE.VERBOSE][6/19/2025 07:15:24 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=9][TRACE.VERBOSE][6/19/2025 07:15:24 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=16][TRACE.VERBOSE][6/19/2025 07:15:25 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('NRG','Valuations','360') +[Thread=16][TRACE.VERBOSE][6/19/2025 07:15:25 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=18][TRACE.VERBOSE][6/19/2025 07:15:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('DBX','Valuations','180') +[Thread=18][TRACE.VERBOSE][6/19/2025 07:15:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'DBX' +[Thread=19][TRACE.VERBOSE][6/19/2025 07:15:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('CRS','Valuations','90') +[Thread=19][TRACE.VERBOSE][6/19/2025 07:15:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'CRS' +[Thread=15][TRACE.VERBOSE][6/19/2025 07:15:30 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4976(ms) +[Thread=15][TRACE.VERBOSE][6/19/2025 07:15:30 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 94(ms) +[Thread=12][TRACE.VERBOSE][6/19/2025 07:15:32 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 7131(ms) +[Thread=12][TRACE.VERBOSE][6/19/2025 07:15:32 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 15(ms) +[Thread=14][TRACE.VERBOSE][6/19/2025 07:15:32 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 7490(ms) +[Thread=14][TRACE.VERBOSE][6/19/2025 07:15:32 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 103(ms) +[Thread=10][TRACE.VERBOSE][6/19/2025 07:15:33 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 8318(ms) +[Thread=10][TRACE.VERBOSE][6/19/2025 07:15:33 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 136(ms) +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:50 PM] [PortfolioManager.ViewModels.MomentumViewModel::OnDispose()]Dispose MomentumViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:51 PM] [PortfolioManager.ViewModels.CMMomentumViewModel::OnDispose()]Dispose CMMomentumViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:52 PM] [PortfolioManager.ViewModels.CMTrendViewModel::OnDispose()]Dispose CMTrendViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:15:54 PM] [PortfolioManager.ViewModels.MGSHMomentumViewModel::OnDispose()]Dispose MGSHMomentumViewModel +[Thread=1][TRACE.DEBUG][6/19/2025 07:15:54 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=22][TRACE.VERBOSE][6/19/2025 07:15:55 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=21][TRACE.VERBOSE][6/19/2025 07:15:55 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'CRS' +[Thread=20][TRACE.VERBOSE][6/19/2025 07:15:55 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedDayCount). Selected symbol 'CRS' +[Thread=19][TRACE.VERBOSE][6/19/2025 07:15:55 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedDayCount). Selected symbol 'CRS' +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:54 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=16][TRACE.VERBOSE][6/19/2025 07:16:54 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=3][TRACE.VERBOSE][6/19/2025 07:16:54 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=8][TRACE.VERBOSE][6/19/2025 07:16:54 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedDayCount). Selected symbol 'NRG' +[Thread=6][TRACE.VERBOSE][6/19/2025 07:16:54 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedDayCount). Selected symbol 'NRG' +[Thread=1][TRACE.DEBUG][6/19/2025 07:16:57 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 07:16:57 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=23][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=18][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 07:16:57 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [PortfolioManager.Program::Main(args)]There were 33 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 07:16:57 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:42 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:42 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:42 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:42 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=8][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=6][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=1][TRACE.DEBUG][6/19/2025 07:17:43 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=9][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('NRG','Valuations','360') +[Thread=13][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('DBX','Valuations','180') +[Thread=9][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=13][TRACE.VERBOSE][6/19/2025 07:17:43 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'DBX' +[Thread=1][TRACE.DEBUG][6/19/2025 07:17:57 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 07:17:57 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=19][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=20][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 07:17:57 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [PortfolioManager.Program::Main(args)]There were 38 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 07:17:57 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:15 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:15 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:15 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:15 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=8][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=6][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=1][TRACE.DEBUG][6/19/2025 09:10:16 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=9][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('NRG','Valuations','360') +[Thread=10][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('DBX','Valuations','180') +[Thread=10][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'DBX' +[Thread=11][TRACE.VERBOSE][6/19/2025 09:10:16 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=1][TRACE.DEBUG][6/19/2025 09:10:32 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:10:32 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=21][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=22][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:10:32 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [PortfolioManager.Program::Main(args)]There were 36 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:10:32 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:12:39 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:12:39 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:12:39 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:12:39 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=8][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=6][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=1][TRACE.DEBUG][6/19/2025 09:12:40 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=11][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('DBX','Valuations','180') +[Thread=9][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('NRG','Valuations','360') +[Thread=11][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'DBX' +[Thread=9][TRACE.VERBOSE][6/19/2025 09:12:40 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:00 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:00 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=19][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=20][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:00 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [PortfolioManager.Program::Main(args)]There were 35 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:00 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:24 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:24 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:24 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:24 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=8][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=6][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass43_0::b__0()]BollingerBandViewModel::Initialize() +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:26 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=11][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('DBX','Valuations','180') +[Thread=9][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass84_0::b__0()]BollingerBandViewModel::SetSaveParameters('NRG','Valuations','360') +[Thread=11][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'DBX' +[Thread=9][TRACE.VERBOSE][6/19/2025 09:13:26 PM] [PortfolioManager.ViewModels.BollingerBandViewModel+<>c__DisplayClass86_0::b__0()]OnViewModelPropertyChanged(SelectedSymbol). Selected symbol 'NRG' +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:29 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:31 PM] [PortfolioManager.ViewModels.BollingerBandViewModel::OnDispose()]Dispose BollingerBandViewModel +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:47 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:47 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=20][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=21][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:13:47 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [PortfolioManager.Program::Main(args)]There were 27 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:13:47 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:16:52 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:16:52 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:16:52 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:16:52 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:17:11 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:17:11 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:11 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=12][TRACE.VERBOSE][6/19/2025 09:17:11 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:11 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:11 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:17:12 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:12 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:17:12 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:17:12 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:12 PM] [PortfolioManager.Program::Main(args)]There were 29 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:17:12 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:42 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:42 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:42 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:42 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:19:50 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:19:50 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=14][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:19:50 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:19:50 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [PortfolioManager.Program::Main(args)]There were 36 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:19:50 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:20:46 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:20:46 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:20:46 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:20:46 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:21:02 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:21:02 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:02 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=12][TRACE.VERBOSE][6/19/2025 09:21:02 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:02 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=13][TRACE.VERBOSE][6/19/2025 09:21:02 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:02 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:03 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:21:03 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:21:03 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:03 PM] [PortfolioManager.Program::Main(args)]There were 36 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:21:03 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:13 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:13 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:13 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:13 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:26:36 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:26:36 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:36 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=12][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:26:37 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:26:37 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [PortfolioManager.Program::Main(args)]There were 29 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:26:37 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:01 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:02 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:02 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:02 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:28:40 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:28:40 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=16][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:28:40 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:28:40 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [PortfolioManager.Program::Main(args)]There were 28 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:28:40 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:17 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:17 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:17 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:17 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:29:37 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:29:37 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=14][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:29:37 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:29:37 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [PortfolioManager.Program::Main(args)]There were 29 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:29:37 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:39 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:39 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:39 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:39 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:30:50 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:30:50 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=14][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:50 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:30:50 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:30:50 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:51 PM] [PortfolioManager.Program::Main(args)]There were 36 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:30:51 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:08 PM] [PortfolioManager.Program::Main(args)][MAIN:STARTING] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:08 PM] [PortfolioManager.Program::Main(args)]Using portfolio_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:08 PM] [PortfolioManager.Program::Main(args)]Using market_data at Adrastea +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:08 PM] [PortfolioManager.Program::Main(args)]Using user_data at Adrastea +[Thread=1][TRACE.DEBUG][6/19/2025 09:31:19 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]App: Received ClosingHandler event +[Thread=1][TRACE.DEBUG][6/19/2025 09:31:19 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=13][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=14][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.DEBUG][6/19/2025 09:31:19 PM] [PortfolioManager.Cache.ImageCache::.ctor()]Reading assets from C:\Avalonia\PortfolioManager/Assets +[Thread=1][TRACE.DEBUG][6/19/2025 09:31:19 PM] [PortfolioManager.ViewModels.MainWindowViewModel::OnDispose()][MainWindowViewModel:OnDispose] LEAVE +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [PortfolioManager.Program::Main(args)]There were 36 threads still running at application shutdown. +[Thread=1][TRACE.VERBOSE][6/19/2025 09:31:19 PM] [PortfolioManager.Program::Main(args)][MAIN:EXIT] diff --git a/PortfolioManager/saveparams.config b/PortfolioManager/saveparams.config index 523cdbd..e69de29 100644 --- a/PortfolioManager/saveparams.config +++ b/PortfolioManager/saveparams.config @@ -1,7 +0,0 @@ -Type,PortfolioManager.ViewModels.MomentumViewModel,PathFileName,C:\boneyard\marketdata\Sessions\MG20180131.TXT -Type,PortfolioManager.ViewModels.CMMomentumViewModel,PathFileName,C:\boneyard\marketdata\Sessions\CM20191031.TXT -Type,PortfolioManager.ViewModels.CMTrendViewModel,PathFileName,C:\boneyard\marketdata\Sessions\CMT20200817.TXT -Type,PortfolioManager.ViewModels.MGSHMomentumViewModel,PathFileName,C:\boneyard\marketdata\Sessions\MGSH20250331.TXT -Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol,NRG,SelectedWatchList,Valuations,SelectedDayCount,360,SyncTradeToBand,True,ShowTradeLabels,True,UseLeastSquaresFit,True,ShowInsiderTransactions,True -Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol,DBX,SelectedWatchList,Valuations,SelectedDayCount,180,SyncTradeToBand,False,ShowTradeLabels,True,UseLeastSquaresFit,True,ShowInsiderTransactions,True -Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol,CRS,SelectedWatchList,Valuations,SelectedDayCount,90,SyncTradeToBand,True,ShowTradeLabels,True,UseLeastSquaresFit,True,ShowInsiderTransactions,True