Model Expectation Tooltip, Company Description Tooltip in MGSHMomentum

This commit is contained in:
2025-06-10 23:29:42 -04:00
parent 758ed01e06
commit b8e1746914
6 changed files with 180 additions and 22 deletions

View File

@@ -396,14 +396,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
@@ -690,17 +696,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");
@@ -708,5 +714,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();
}
}
}
}

View File

@@ -62,10 +62,14 @@
<Button Content="{Binding Path=PercentButtonText}" HorizontalAlignment="Stretch" Command="{Binding Path=ToggleReturnOrPercentCommand}"></Button>
<Label Content="Expectancy" HorizontalAlignment="Center" ></Label>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch"
IsReadOnly="true" Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"
ToolTip.Tip="{Binding $parent[vw:CMMomentumView].((vm:CMMomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay"/>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch" IsReadOnly="true"
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}">
<ToolTip.Tip>
<Border Margin="2,1,2,1" Background="AntiqueWhite" BorderBrush="Black" BorderThickness="1" CornerRadius="15" Padding="5">
<TextBlock FontWeight="Normal" FontSize="12" Text="{Binding $parent[vw:CMMomentumView].((vm:CMMomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay" />
</Border>
</ToolTip.Tip>
</TextBox>
</StackPanel>

View File

@@ -61,10 +61,14 @@
<Button Content="{Binding Path=PercentButtonText}" HorizontalAlignment="Stretch" Command="{Binding Path=ToggleReturnOrPercentCommand}"></Button>
<Label Content="Expectancy" HorizontalAlignment="Center" ></Label>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch"
IsReadOnly="true" Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"
ToolTip.Tip="{Binding $parent[vw:CMTrendView].((vm:CMTrendViewModel)DataContext).ExpectationDescription}, Mode=OneWay"/>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch" IsReadOnly="true"
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}">
<ToolTip.Tip>
<Border Margin="2,1,2,1" Background="AntiqueWhite" BorderBrush="Black" BorderThickness="1" CornerRadius="15" Padding="5">
<TextBlock FontWeight="Normal" FontSize="12" Text="{Binding $parent[vw:CMTrendView].((vm:CMTrendViewModel)DataContext).ExpectationDescription}, Mode=OneWay" />
</Border>
</ToolTip.Tip>
</TextBox>
</StackPanel>

View File

@@ -79,9 +79,15 @@
<Button Content="{Binding Path=PercentButtonText}" HorizontalAlignment="Stretch" Command="{Binding Path=ToggleReturnOrPercentCommand}"></Button>
<Label Content="Expectancy" HorizontalAlignment="Center" ></Label>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch" IsReadOnly="true"
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"
ToolTip.Tip="{Binding $parent[vw:MGSHMomentumView].((vm:MGSHMomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay"/>
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}">
<ToolTip.Tip>
<Border Margin="2,1,2,1" Background="AntiqueWhite" BorderBrush="Black" BorderThickness="1" CornerRadius="15" Padding="5">
<TextBlock FontWeight="Normal" FontSize="12" Text="{Binding $parent[vw:MGSHMomentumView].((vm:MGSHMomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay" />
</Border>
</ToolTip.Tip>
</TextBox>
</StackPanel>
@@ -132,7 +138,22 @@
</DataGrid.Styles>
<DataGrid.Columns>
<DataGridTextColumn Header="Symbol" Binding="{Binding Symbol, DataType={x:Type md:MGSHPositionModel}}"/>
<DataGridTemplateColumn Header="Symbol">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding Symbol, DataType={x:Type md:MGSHPositionModel}}">
<ToolTip.Tip>
<Border Margin="2,1,2,1" Background="AntiqueWhite" BorderBrush="Black" BorderThickness="1" CornerRadius="15" Padding="5">
<TextBlock FontWeight="Normal" FontSize="12" Text="{Binding $parent[vw:MGSHMomentumView].((vm:MGSHMomentumViewModel)DataContext).CompanyDescriptionSelectedPosition}, Mode=OneWay"/>
</Border>
</ToolTip.Tip>
<ToolTip.ShowDelay>125</ToolTip.ShowDelay>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate/>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Slot" Binding="{Binding SlotAsString, DataType={x:Type md:MGSHPositionModel}}" />

View File

@@ -61,10 +61,15 @@
<Button Content="{Binding Path=PercentButtonText}" HorizontalAlignment="Stretch" Command="{Binding Path=ToggleReturnOrPercentCommand}"></Button>
<Label Content="Expectancy" HorizontalAlignment="Center" ></Label>
<TextBox Background="WhiteSmoke" Focusable="false" Height="24" MinWidth="80" HorizontalAlignment="Stretch" IsReadOnly="true"
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}"
ToolTip.Tip="{Binding $parent[vw:MomentumView].((vm:MomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay"/>
Text="{Binding Path=ModelExpectation, Mode=OneWay}" Foreground="{Binding Path=ExpectationColor}">
<ToolTip.Tip>
<Border Margin="2,1,2,1" Background="AntiqueWhite" BorderBrush="Black" BorderThickness="1" CornerRadius="15" Padding="5">
<TextBlock FontWeight="Normal" FontSize="12" Text="{Binding $parent[vw:MomentumView].((vm:MomentumViewModel)DataContext).ExpectationDescription}, Mode=OneWay" />
</Border>
</ToolTip.Tip>
</TextBox>
</StackPanel>

View File

@@ -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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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::<HandleSelectedSymbol>b__41_0()]GeneratingActiveGainLoss
[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:39 PM] [PortfolioManager.ViewModels.GainLossViewModel::<HandleSelectedSymbol>b__41_0()]GeneratingTotalGainLoss)
[Thread=3][TRACE.VERBOSE][6/10/2025 11:25:40 PM] [PortfolioManager.ViewModels.GainLossViewModel::<HandleSelectedSymbol>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::<OnFrameworkInitializationCompleted>b__1(<p0>,<p1>)]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.