Implement new bollinger band for model position.

This commit is contained in:
2025-02-20 10:36:27 -05:00
parent 1aadf9a7c1
commit 3f73fcb7a0

View File

@@ -82,6 +82,7 @@ namespace TradeBlotter.ViewModels
private RelayCommand relativeStrengthCommandPosition;
private RelayCommand macdCommandPosition;
private RelayCommand bollingerBandCommandPosition;
private RelayCommand bollingerBandCommandPositionAll;
private RelayCommand priceHistoryCommandPosition;
private RelayCommand stickerValuationCommandPosition;
private RelayCommand dcfValuationCommandPosition;
@@ -202,7 +203,8 @@ namespace TradeBlotter.ViewModels
get
{
ObservableCollection<MenuItem> collection=new ObservableCollection<MenuItem>();
collection.Add(new MenuItem() { Text="Display Bollinger Band",MenuItemClickedCommand=DisplayBollingerBandPosition,StaysOpenOnClick=false });
collection.Add(new MenuItem() { Text="Display Bollinger Band Model Position",MenuItemClickedCommand=DisplayBollingerBandPosition,StaysOpenOnClick=false });
collection.Add(new MenuItem() { Text="Display Bollinger Band All",MenuItemClickedCommand=DisplayBollingerBandPositionAll,StaysOpenOnClick=false });
collection.Add(new MenuItem() { Text="Display Headlines",MenuItemClickedCommand=DisplayHeadlinesPosition,StaysOpenOnClick=false });
collection.Add(new MenuItem() { Text="Display Dividend History",MenuItemClickedCommand=DisplayDividendHistoryPosition,StaysOpenOnClick=false });
collection.Add(new MenuItem() { Text="Display Sticker Valuation",MenuItemClickedCommand=DisplayStickerValuationPosition,StaysOpenOnClick=false });
@@ -802,6 +804,17 @@ namespace TradeBlotter.ViewModels
return bollingerBandCommandPosition;
}
}
public ICommand DisplayBollingerBandPositionAll
{
get
{
if(bollingerBandCommandPositionAll==null)
{
bollingerBandCommandPositionAll=new RelayCommand(param => this.DisplayBollingerBandCommandPositionAll(),param => { return null!=selectedPosition&&null!=selectedPosition.Symbol; });
}
return bollingerBandCommandPositionAll;
}
}
public ICommand AddToWatchListPosition
{
get
@@ -952,43 +965,9 @@ namespace TradeBlotter.ViewModels
// *************************************************************************************************************************************************************
// ********************************************************************** C O M M A N D W O R K E R S P O S I T I O N ****************************************
// *************************************************************************************************************************************************************
//public void DisplayBollingerBandCommandPosition()
//{
// String strStopLimits=null;
// MarketData.MarketDataModel.StopLimits stopLimits=GetHistoricalStopLimitsMarketDataModel();
// StringBuilder sb=new StringBuilder();
// if(null!=stopLimits && 0!=stopLimits.Count)
// {
// sb.Append(",");
// NVPCollections nvpCollections=stopLimits.ToNVPCollections();
// sb.Append("StopHistoryCount").Append(",").Append(String.Format("{0}",nvpCollections.Count)).Append(",");
// for(int index=0;index<nvpCollections.Count;index++)
// {
// sb.Append(String.Format("StopHistory_{0}",index)).Append(",").Append(nvpCollections[index].ToString());
// if(index<nvpCollections.Count-1)sb.Append(",");
// }
// }
// strStopLimits=sb.ToString();
// SaveParameters saveParams=null;
// if(null!=strStopLimits)
// {
// sb=new StringBuilder();
// sb.Append("Type,TradeBlotter.ViewModels.BollingerBandViewModel,SelectedSymbol,");
// sb.Append(selectedPosition.Symbol).Append(",");
// sb.Append("SelectedWatchList,{All},SelectedDayCount,");
// sb.Append(GetDayCountSelectionForBollingerBands(selectedPosition));
// sb.Append(String.IsNullOrEmpty(strStopLimits)?"":strStopLimits);
// saveParams=SaveParameters.Parse(sb.ToString());
// }
// else
// {
// saveParams=SaveParameters.Parse("Type,TradeBlotter.ViewModels.BollingerBandViewModel,SelectedSymbol,"+selectedPosition.Symbol+",SelectedWatchList,{All},SelectedDayCount,90");
// }
// saveParams.Referer=this;
// WorkspaceInstantiator.Invoke(saveParams);
//}
public void DisplayBollingerBandCommandPosition()
// Legacy bollinger band
public void DisplayBollingerBandCommandPositionAll()
{
MarketData.MarketDataModel.StopLimits stopLimits = GetHistoricalStopLimitsMarketDataModel();
@@ -1002,10 +981,32 @@ namespace TradeBlotter.ViewModels
saveParams = SaveParameters.Parse(sb.ToString());
SaveParameters stopLimitParams = StopLimitsExtensions.FromStopLimits(stopLimits);
saveParams.AddRange(stopLimitParams);
saveParams.Referer = this;
WorkspaceInstantiator.Invoke(saveParams);
}
// Bollinger band for this position
public void DisplayBollingerBandCommandPosition()
{
MarketData.MarketDataModel.StopLimits stopLimits = GetHistoricalStopLimitsMarketDataModel();
StringBuilder sb = new StringBuilder();
SaveParameters saveParams = null;
sb = new StringBuilder();
sb.Append("Type,TradeBlotter.ViewModels.BollingerBandPositionViewModel,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);
SaveParameters portfolioTradesParams = PortfolioTradesExtensions.FromPosition(selectedPosition);
saveParams.AddRange(portfolioTradesParams);
saveParams.Referer=this;
WorkspaceInstantiator.Invoke(saveParams);
}
private int GetDayCountSelectionForBollingerBands(CMTPositionModel selectedPosition)
{
DateGenerator dateGenerator=new DateGenerator();
@@ -1561,18 +1562,31 @@ namespace TradeBlotter.ViewModels
if(null==sessionParams||null==selectedPosition) return null;
DateGenerator dateGenerator=new DateGenerator();
MarketData.MarketDataModel.StopLimits marketDataModelStopLimits=new MarketData.MarketDataModel.StopLimits();
MarketData.Generator.Model.StopLimits stopLimits=new MarketData.Generator.Model.StopLimits(
(from MarketData.Generator.Model.StopLimit stopLimit in sessionParams.StopLimits where stopLimit.Symbol.Equals(selectedPosition.Symbol)
select stopLimit).OrderByDescending(x => x.AnalysisDate).ToList());
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=dateGenerator.FindNextBusinessDay(selectedPosition.PurchaseDate);
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();