From d0a416e853df6a322992fd826bec3cde1387b793 Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 6 Feb 2025 16:41:16 -0500 Subject: [PATCH] New --- Model/MGSHPositionModel.cs | 437 +++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 Model/MGSHPositionModel.cs diff --git a/Model/MGSHPositionModel.cs b/Model/MGSHPositionModel.cs new file mode 100644 index 0000000..5072ff1 --- /dev/null +++ b/Model/MGSHPositionModel.cs @@ -0,0 +1,437 @@ +using MarketData.Generator; +using MarketData.MarketDataModel; +using MarketData.Utils; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media; +using TradeBlotter.ViewModels; +using TradeBlotter.UIUtils; +using System.Collections.Specialized; +using MarketData; +using MarketData.Generator.Momentum; +using MarketData.DataAccess; +using System.CodeDom; +using MarketData.Generator.MGSHMomentum; + +namespace TradeBlotter.Model +{ + public class MGSHPositionModelCollection : ObservableCollection + { + public void Add(MGSHActivePositions activePositions) + { + List slotKeys=new List(activePositions.Keys); + for(int keyIndex=0;keyIndexposition.CurrentPrice)priceChangeDirection=-1; + else if(prevPrice==position.CurrentPrice)priceChangeDirection=0; + else priceChangeDirection=1; + prevPrice=position.CurrentPrice; + UpdateProperties(); + } + } + public double RSI3 + { + get{return rsi3;} + set + { + if(rsi3==value)return; + rsi3=value; + base.OnPropertyChanged("RSI3"); + base.OnPropertyChanged("RSI3Color"); + } + } + public DateTime LastUpdated + { + get{return lastUpdated;} + set{lastUpdated=value;base.OnPropertyChanged("LastUpdated");} + } + public Brush CurrentPriceColor + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if(priceChangeDirection>0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Green); + else if(priceChangeDirection<0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + else return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public Brush RSI3Color + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if(RSI3<10||RSI3>80)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public double Exposure + { + get{return Shares*PurchasePrice;} + } + public double ActiveExposure + { + get{return IsActivePosition?Exposure:0.00;} + } + public Brush ActiveExposureColor + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + else return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public double MarketValue + { + get{return Shares*CurrentPrice;} + } + public double ActiveMarketValue + { + get{return IsActivePosition?MarketValue:0.00;} + } + public Brush ActiveMarketValueColor + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if (ActiveMarketValue > Exposure) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Green); + else if (ActiveMarketValue < Exposure) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + else return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public long Volume + { + get{return position.Volume;} + set{position.Volume=value;base.OnPropertyChanged("Volume");} + } + public double Return1D + { + get{return position.Return1D;} + set{position.Return1D=value;base.OnPropertyChanged("Return1D");} + } + public double GainLoss + { + get{return MarketValue-Exposure;} + } + public Brush GainLossColor + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if(GainLoss>0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Green); + else if(GainLoss<0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + else return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public double GainLossPcnt + { + get{return (MarketValue-Exposure)/Exposure;} + } + public Brush GainLossPcntColor + { + get + { + if(!IsActivePosition)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if(GainLoss>0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Green); + else if(GainLoss<0)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + else return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public double CumReturn252 + { + get{return position.CumReturn252;} + set{position.CumReturn252=value;base.OnPropertyChanged("CumReturn252");} + } + public double IDIndicator + { + get{return position.IDIndicator;} + set{position.IDIndicator=value;base.OnPropertyChanged("IDIndicator");} + } + public double Score + { + get { return position.Score; } + set { position.Score=value; base.OnPropertyChanged("Score"); } + } + public double MaxDrawdown + { + get{return position.MaxDrawdown;} + set{position.MaxDrawdown=value;base.OnPropertyChanged("MaxDrawdown");} + } + public double MaxUpside + { + get{return position.MaxUpside;} + set{position.MaxUpside=value;base.OnPropertyChanged("MaxUpside");} + } + public double Velocity + { + get{return position.Velocity;} + set{position.Velocity=value;base.OnPropertyChanged("Velocity");} + } + public double PE + { + get{return position.PE;} + set{position.PE=value;base.OnPropertyChanged("PE");} + } + public String ZacksRank + { + get {return position.ZacksRank;} + set{position.ZacksRank=value;base.OnPropertyChanged("ZacksRank");} + } + public double Beta + { + get{return position.Beta;} + set{position.Beta=value;base.OnPropertyChanged("Beta");} + } + public bool IsActivePosition + { + get{return Utility.IsEpoch(SellDate)?true:false;} + } + + public double InitialStopLimit + { + get { return position.InitialStopLimit; } + set + { + position.InitialStopLimit=value; + base.OnPropertyChanged("InitialStopLimit"); + base.OnPropertyChanged("InitialStopLimitColor"); + } + } + + public Brush InitialStopLimitColor + { + get + { + if(!IsActivePosition) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + if(!Utility.IsEpoch(position.LastStopAdjustment)) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); // if we have a trailing stop then we are no longer using the initial stop + StopLimit stopLimit=PortfolioDA.GetStopLimit(position.Symbol); + if(null==stopLimit||!stopLimit.StopPrice.Equals(Math.Round(position.InitialStopLimit,2))) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Purple); + if(currentPriceLow<=position.InitialStopLimit) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + public double TrailingStopLimit + { + get { return position.TrailingStopLimit; } + set + { + position.TrailingStopLimit=value; + base.OnPropertyChanged("TrailingStopLimit"); + base.OnPropertyChanged("TrailingStopLimitColor"); + } + } + public Brush TrailingStopLimitColor + { + get + { + if(!IsActivePosition) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + StopLimit stopLimit=PortfolioDA.GetStopLimit(position.Symbol); + if(null==stopLimit||!stopLimit.StopPrice.Equals(Math.Round(position.TrailingStopLimit,2))) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Purple); + if(currentPriceLow<=position.TrailingStopLimit)return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Red); + return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } +// *** + public DateTime LastStopAdjustment + { + get { return position.LastStopAdjustment; } + set { position.LastStopAdjustment=value; base.OnPropertyChanged("LastStopAdjustment"); } + } + public Brush LastStopAdjustmentColor + { + get + { + if(!IsActivePosition) return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Blue); + return BrushCollection.GetContextBrush(BrushCollection.BrushColor.Black); + } + } + } +}