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.