Commit Latest

This commit is contained in:
2025-07-06 11:20:47 -04:00
parent c644cf12dd
commit 6ce410ee28
2 changed files with 81 additions and 11 deletions

View File

@@ -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;

View File

@@ -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();