From 6ce410ee28109aa78a2a8586d298bedc3987c1c4 Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 6 Jul 2025 11:20:47 -0400 Subject: [PATCH] Commit Latest --- .../ViewModels/CMTrendViewModel.cs | 84 ++++++++++++++++++- .../ViewModels/MGSHMomentumViewModel.cs | 8 -- 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/PortfolioManager/ViewModels/CMTrendViewModel.cs b/PortfolioManager/ViewModels/CMTrendViewModel.cs index e6b32a7..9edd370 100644 --- a/PortfolioManager/ViewModels/CMTrendViewModel.cs +++ b/PortfolioManager/ViewModels/CMTrendViewModel.cs @@ -21,6 +21,7 @@ using MarketData.MarketDataModel; using MarketData.Utils; using PortfolioManager.DataSeriesViewModels; using PortfolioManager.Dialogs; +using PortfolioManager.Extensions; using PortfolioManager.Models; using PortfolioManager.UIUtils; using Position=MarketData.Generator.CMTrend.Position; @@ -347,14 +348,91 @@ namespace PortfolioManager.ViewModels } // ********************************************************************************************************************************* + // public async Task ExecuteBollingerBands() + // { + // SaveParameters saveParams = SaveParameters.Parse("Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol," + selectedPosition.Symbol + ",SelectedWatchList,{All},SelectedDayCount,90"); + // saveParams.Referer=this; + // WorkspaceInstantiator.Invoke(saveParams); + // await Task.FromResult(true); + // } + public async Task ExecuteBollingerBands() { - SaveParameters saveParams = SaveParameters.Parse("Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol," + selectedPosition.Symbol + ",SelectedWatchList,{All},SelectedDayCount,90"); - saveParams.Referer=this; - WorkspaceInstantiator.Invoke(saveParams); + MarketData.MarketDataModel.StopLimits stopLimits = GetHistoricalStopLimitsMarketDataModel(); + + StringBuilder sb = new StringBuilder(); + SaveParameters saveParams = null; + sb = new StringBuilder(); + sb.Append("Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol,"); + sb.Append(selectedPosition.Symbol).Append(","); + sb.Append("SelectedWatchList,{All},SelectedDayCount,"); + sb.Append(GetDayCountSelectionForBollingerBands(selectedPosition)); + saveParams = SaveParameters.Parse(sb.ToString()); + SaveParameters stopLimitParams = StopLimitsExtensions.FromStopLimits(stopLimits); + saveParams.AddRange(stopLimitParams); + saveParams.Referer = this; + WorkspaceInstantiator.Invoke(saveParams); await Task.FromResult(true); } + private int GetDayCountSelectionForBollingerBands(CMTPositionModel selectedPosition) + { + DateGenerator dateGenerator=new DateGenerator(); + + int daysBetween=dateGenerator.DaysBetween(selectedPosition.PurchaseDate,DateTime.Today); + if(daysBetween<90)return 90; + if(daysBetween<180)return 180; + if(daysBetween<360)return 360; + if(daysBetween<720)return 720; + if(daysBetween<1440)return 1440; + return 3600; + } + +// This getter returns non-model (MarketData.MarketDataModel) specific stop limits to pass along to the bollinger bands + public MarketData.MarketDataModel.StopLimits GetHistoricalStopLimitsMarketDataModel() + { + if(null==sessionParams||null==selectedPosition) return null; + DateGenerator dateGenerator=new DateGenerator(); + MarketData.MarketDataModel.StopLimits marketDataModelStopLimits=new MarketData.MarketDataModel.StopLimits(); + + MarketData.Generator.Model.StopLimits stopLimits = default; + if(selectedPosition.IsActivePosition) + { + stopLimits = new MarketData.Generator.Model.StopLimits( + (from MarketData.Generator.Model.StopLimit stopLimit in sessionParams.StopLimits where stopLimit.Symbol.Equals(selectedPosition.Symbol) && + stopLimit.AnalysisDate > selectedPosition.PurchaseDate select stopLimit).OrderByDescending(x => x.AnalysisDate).ToList()); + } + else + { + stopLimits = new MarketData.Generator.Model.StopLimits( + (from MarketData.Generator.Model.StopLimit stopLimit in sessionParams.StopLimits where stopLimit.Symbol.Equals(selectedPosition.Symbol) && + stopLimit.AnalysisDate > selectedPosition.PurchaseDate && stopLimit.AnalysisDate <= selectedPosition.SellDate select stopLimit). + OrderByDescending(x => x.AnalysisDate).ToList()); + } + + MarketData.MarketDataModel.StopLimit initialStopLimit=new MarketData.MarketDataModel.StopLimit(); + initialStopLimit.Symbol=selectedPosition.Symbol; + initialStopLimit.Shares=0; + initialStopLimit.StopPrice=selectedPosition.InitialStopLimit; + initialStopLimit.StopType=StopLimitConstants.STOP_QUOTE; + initialStopLimit.EffectiveDate=selectedPosition.PurchaseDate; + initialStopLimit.Active=1; + marketDataModelStopLimits.Add(initialStopLimit); + + foreach(MarketData.Generator.Model.StopLimit stopLimit in stopLimits) + { + MarketData.MarketDataModel.StopLimit marketDataModelStopLimit=new MarketData.MarketDataModel.StopLimit(); + marketDataModelStopLimit.Symbol=stopLimit.Symbol; + marketDataModelStopLimit.Shares=0; + marketDataModelStopLimit.StopPrice=stopLimit.NewStop; + marketDataModelStopLimit.StopType=StopLimitConstants.STOP_QUOTE; + marketDataModelStopLimit.EffectiveDate=stopLimit.AnalysisDate; + marketDataModelStopLimit.Active=1; + marketDataModelStopLimits.Add(marketDataModelStopLimit); + } + return marketDataModelStopLimits; + } + private void HandleToggleReturnOrPercent() { showAsGainLoss = !showAsGainLoss; diff --git a/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs b/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs index edbddd5..55250b4 100644 --- a/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs +++ b/PortfolioManager/ViewModels/MGSHMomentumViewModel.cs @@ -178,14 +178,6 @@ namespace PortfolioManager.ViewModels await ReloadTradeFile(); } - // public async Task ExecuteBollingerBands() - // { - // SaveParameters saveParams = SaveParameters.Parse("Type,PortfolioManager.ViewModels.BollingerBandViewModel,SelectedSymbol," + selectedPosition.Symbol + ",SelectedWatchList,{All},SelectedDayCount,90"); - // saveParams.Referer=this; - // WorkspaceInstantiator.Invoke(saveParams); - // await Task.FromResult(true); - // } - public async Task ExecuteBollingerBands() { MarketData.MarketDataModel.StopLimits stopLimits = GetHistoricalStopLimitsMarketDataModel();