diff --git a/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs b/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs index 8aa107c..f52ca58 100644 --- a/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs +++ b/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs @@ -389,14 +389,20 @@ namespace PortfolioManager.ViewModels base.OnPropertyChanged("HedgeCash"); base.OnPropertyChanged("ModelExpectation"); base.OnPropertyChanged("ExpectationColor"); - base.OnPropertyChanged("ExpectationDescription"); base.OnPropertyChanged("ReloadEnabled"); base.OnPropertyChanged("LastTradeDate"); base.OnPropertyChanged("NextTradeDate"); + UpdateTooltipProperties(); }); return true; } + public void UpdateTooltipProperties() + { + base.OnPropertyChanged("ExpectationDescription"); + base.OnPropertyChanged("CompanyDescriptionSelectedPosition"); + } + private void UpdatePositionPrices(bool change = true) { try @@ -683,17 +689,17 @@ namespace PortfolioManager.ViewModels { get { - if(null==modelStatistics) return ""; - StringBuilder sb=new StringBuilder(); + if (null == modelStatistics) return ""; + StringBuilder sb = new StringBuilder(); sb.Append("Expectancy is (percentage of winning trades * average gain) / (percentage of losing trades * average loss).").Append("\n"); sb.Append("Total Trades : ").Append(modelStatistics.TotalTrades).Append("\n"); sb.Append("Winning Trades : ").Append(modelStatistics.WinningTrades).Append("\n"); sb.Append("Losing Trades : ").Append(modelStatistics.LosingTrades).Append("\n"); - sb.Append("Winning Trades : ").Append(Utility.FormatNumber(modelStatistics.WinningTradesPercent,2)).Append("%").Append("\n"); - sb.Append("Losing Trades : ").Append(Utility.FormatNumber(modelStatistics.LosingTradesPercent,2)).Append("%").Append("\n"); - sb.Append("Average Winning Trade Gain : ").Append(Utility.FormatNumber(modelStatistics.AverageWinningTradePercentGain,2)).Append("%").Append("\n"); - sb.Append("Average Losing Trade Loss : ").Append(Utility.FormatNumber(modelStatistics.AverageLosingTradePercentLoss,2)).Append("%").Append("\n"); - sb.Append("Expectancy : ").Append(Utility.FormatNumber(modelStatistics.Expectancy,2)).Append("\n"); + sb.Append("Winning Trades : ").Append(Utility.FormatNumber(modelStatistics.WinningTradesPercent, 2)).Append("%").Append("\n"); + sb.Append("Losing Trades : ").Append(Utility.FormatNumber(modelStatistics.LosingTradesPercent, 2)).Append("%").Append("\n"); + sb.Append("Average Winning Trade Gain : ").Append(Utility.FormatNumber(modelStatistics.AverageWinningTradePercentGain, 2)).Append("%").Append("\n"); + sb.Append("Average Losing Trade Loss : ").Append(Utility.FormatNumber(modelStatistics.AverageLosingTradePercentLoss, 2)).Append("%").Append("\n"); + sb.Append("Expectancy : ").Append(Utility.FormatNumber(modelStatistics.Expectancy, 2)).Append("\n"); sb.Append("\n"); sb.Append("Maintain a positive Expectancy and you're a winner."); sb.Append("\n"); @@ -701,5 +707,19 @@ namespace PortfolioManager.ViewModels 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."; + 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(); + } + } } } diff --git a/PortfolioManager/Views/CMMomentumView.axaml b/PortfolioManager/Views/CMMomentumView.axaml index 1452585..31b0808 100644 --- a/PortfolioManager/Views/CMMomentumView.axaml +++ b/PortfolioManager/Views/CMMomentumView.axaml @@ -62,10 +62,14 @@ - - + + + + + + + diff --git a/PortfolioManager/Views/CMTrendView.axaml b/PortfolioManager/Views/CMTrendView.axaml index 5a3f2ac..e233772 100644 --- a/PortfolioManager/Views/CMTrendView.axaml +++ b/PortfolioManager/Views/CMTrendView.axaml @@ -61,10 +61,14 @@ - - + + + + + + + diff --git a/PortfolioManager/Views/MGSHMomentumView.axaml b/PortfolioManager/Views/MGSHMomentumView.axaml index e68444c..99ce9b2 100644 --- a/PortfolioManager/Views/MGSHMomentumView.axaml +++ b/PortfolioManager/Views/MGSHMomentumView.axaml @@ -79,9 +79,15 @@ + + Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"> + + + + + + @@ -132,7 +138,22 @@ - + + + + + + + + + + + 125 + + + + + diff --git a/PortfolioManager/Views/MomentumView.axaml b/PortfolioManager/Views/MomentumView.axaml index 3257ca0..bd0b930 100644 --- a/PortfolioManager/Views/MomentumView.axaml +++ b/PortfolioManager/Views/MomentumView.axaml @@ -61,10 +61,15 @@ - + Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"> + + + + + + + diff --git a/PortfolioManager/portfolio_manager.log b/PortfolioManager/portfolio_manager.log index 8023db4..2b553c3 100644 --- a/PortfolioManager/portfolio_manager.log +++ b/PortfolioManager/portfolio_manager.log @@ -40032,3 +40032,107 @@ PortfolioManager Error: 0 : Unable to connect to any of the specified MySQL host [Thread=1][TRACE.VERBOSE][6/10/2025 6:08:29 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... [Thread=18][TRACE.VERBOSE][6/10/2025 6:08:30 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. [Thread=1][TRACE.VERBOSE][6/10/2025 6:08:30 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 10:58:37 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 10:58:44 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 753(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 10:58:44 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 105(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 10:58:47 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 3313(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 10:58:47 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 27(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 10:58:47 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3626(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 10:58:47 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 76(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 10:58:48 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4499(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 10:58:48 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 126(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:00:16 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=16][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:00:16 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:10:55 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 11:10:56 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 519(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 11:10:57 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 213(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:10:59 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 3311(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:10:59 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 21(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:11:00 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3614(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:11:00 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 90(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:11:00 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4577(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:11:01 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 121(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:11:33 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:11:33 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:11:34 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:11:34 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=16][TRACE.VERBOSE][6/10/2025 11:11:34 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:11:34 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:11:34 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:12:03 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 11:12:05 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 480(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 11:12:05 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 127(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:12:07 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 3118(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:12:07 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 20(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:12:08 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3468(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:12:08 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 70(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:12:09 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4403(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:12:09 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 125(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:12:27 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=17][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:12:28 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:13:21 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 11:13:23 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 544(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 11:13:23 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 133(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:13:25 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 3156(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:13:25 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 29(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:13:26 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3554(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:13:26 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 97(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:13:26 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4457(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:13:27 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 121(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:13:42 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=17][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:13:42 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:16:21 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 11:16:23 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 494(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 11:16:23 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 114(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:16:25 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 2926(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:16:25 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 19(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:16:25 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3242(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:16:26 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 85(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:16:26 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4046(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:16:27 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 134(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:17:29 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:17:29 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:17:30 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:0 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:17:30 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=16][TRACE.VERBOSE][6/10/2025 11:17:30 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:17:30 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:17:30 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:19:12 PM] [PortfolioManager.Program::Main(args)][STARTING] +[Thread=6][TRACE.VERBOSE][6/10/2025 11:19:14 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 544(ms) +[Thread=6][TRACE.VERBOSE][6/10/2025 11:19:14 PM] [MarketData.Generator.MGSHMomentum.MGSHMomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 108(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:19:16 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 2873(ms) +[Thread=8][TRACE.VERBOSE][6/10/2025 11:19:16 PM] [MarketData.Generator.CMTrend.CMTTrendModel::GetModelPerformance(sessionParams)]Done, total took 24(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:19:16 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 3185(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:19:17 PM] [MarketData.Generator.CMMomentum.CMMomentumBacktest::GetModelPerformance(sessionParams)]Done, took 107(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:19:17 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 4066(ms) +[Thread=9][TRACE.VERBOSE][6/10/2025 11:19:18 PM] [MarketData.Generator.Momentum.MomentumBacktest::GetModelPerformance(sessionParams)]Done, total took 127(ms) +[Thread=15][TRACE.VERBOSE][6/10/2025 11:24:17 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Symbols: 436. Items in cache: 46,574. +[Thread=11][TRACE.VERBOSE][6/10/2025 11:25:31 PM] [PortfolioManager.ViewModels.GainLossViewModel::HandleSelectedSymbol()]HandleSelectedSymbol:{ALL} +[Thread=11][TRACE.VERBOSE][6/10/2025 11:25:31 PM] [PortfolioManager.ViewModels.GainLossViewModel::HandleSelectedSymbol()][GainLossViewModel::OnGainLossViewModelPropertyChanged]SelectedSymbol '{ALL}' +[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:38 PM] [PortfolioManager.ViewModels.GainLossViewModel::b__41_0()]GeneratingActiveGainLoss +[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:39 PM] [PortfolioManager.ViewModels.GainLossViewModel::b__41_0()]GeneratingTotalGainLoss) +[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:40 PM] [PortfolioManager.ViewModels.GainLossViewModel::b__41_0()]Date:6/10/2025 TotalGainLoss:$92,294.41 +[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:40 PM] [MarketData.MarketDataModel.GainLoss.GainLossSummaryItemCollection::.ctor(portfolioTrades,gainLossGenerator,activeGainLossGenerator,maxDateRef)][GainLossSummaryItemCollection] Done, took 721(ms) +[Thread=10][TRACE.VERBOSE][6/10/2025 11:26:04 PM] [MarketData.MarketDataModel.GainLoss.GainLossSummaryItemCollection::.ctor(portfolioTrades,gainLossGenerator,activeGainLossGenerator,maxDateRef)][GainLossSummaryItemCollection] Done, took 654(ms) +[Thread=1][TRACE.DEBUG][6/10/2025 11:27:09 PM] [PortfolioManager.App+<>c__DisplayClass1_1::b__1(,)]ClosingHandler +[Thread=1][TRACE.VERBOSE][6/10/2025 11:27:09 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread... +[Thread=15][TRACE.VERBOSE][6/10/2025 11:27:10 PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc] Thread ended. Items in cache:46,574 +[Thread=1][TRACE.VERBOSE][6/10/2025 11:27:10 PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End +[Thread=6][TRACE.VERBOSE][6/10/2025 11:27:10 PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended. +[Thread=1][TRACE.VERBOSE][6/10/2025 11:27:10 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'Running'. Joining main thread... +[Thread=1][TRACE.VERBOSE][6/10/2025 11:27:10 PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End.