diff --git a/MarketData/MarketData/Models/MGSH20250331.TXT b/MarketData/MarketData/Models/MGSH20250331.TXT index 1a670ba..9788805 100644 --- a/MarketData/MarketData/Models/MGSH20250331.TXT +++ b/MarketData/MarketData/Models/MGSH20250331.TXT @@ -4,9 +4,9 @@ TradeDate=8/5/2025 StartDate=3/31/2025 AnalysisDate=8/4/2025 Cycle=5 -CashBalance=6880.57 +CashBalance=3933.48 NonTradeableCash=0 -HedgeCashBalance=9.75 +HedgeCashBalance=2956.84 Verbose=True|KeepSlotPositions=True|BenchmarkMode=False|BenchmarkModeSymbol=SPY|HoldingPeriod=3|MaxPositions=3|NoTradeSymbols=OSB,IBDRY,GBTC,YOKU,PNY,RFMD,ASAZY|NoTradeFinancialSymbols=U.S. Private Equity,U.S. Financials,U.S. Financial Services,U.S. Banking and Investment Services,Trading-Miscellaneous,Trading--Miscellaneous,Trading--Leveraged Equity,Trading--Leveraged Debt,Trading--Leveraged Commodities,Trading--Inverse Equity,Trading--Inverse Commodities,Tactical Allocation,Specialty Finance,Japan Financials,Savings & Cooperative Banks,Option Writing,Insurance Brokers,Insurance - Specialty,Insurance - Reinsurance,Insurance - Property & Casualty,Insurance - Life,Insurance - Diversified,Global Private Equity,Global Financials,Financial Services,Financial Exchanges,Financial,China Financials,Banks - Regional - US,Banks - Regional - Latin America,Banks - Global,Asset Management,Credit Services|Benchmark=SPY|MarketCapLowerLimit=1000000000|UsePEScreen=False|UseEBITDAScreen=True|UseRevenuePerShareScreen=True|UseLowSlopeBetaCheck=True|LowSlopeBetaDays=15|LowSlopeBetaThreshhold=1|UseMACD=True|MACDSetup=(12,26,9)|MACDSignalDays=12|MACDRejectStrongSellSignals=False|MACDRejectWeakSellSignals=True|UseStochastics=True|StochasticsSignalDays=3|StochasticsRejectStrongSells=True|StochasticsRejectWeakSells=True|UseFallbackCandidate=True|FallbackCandidate=SHV|FallbackCandidateBestOf=SHV,NEAR,BIL,GSY,AGG,ACWX,GSY,SCHF,IXUS,DBEF,IEFA,TLT|UseMaxPEScreen=True|MaxPE=40|StrictMaxPE=False|QualityIndicatorType=IDINDICATOR|IncludeTradeMasterForSymbolsHeld=True|UseStopLimits=True|StopLimitRiskPercentDecimal=0.2|StopLimitScalingVolatilityDays=30|MinDaysBetweenInitialStopAdjustment=30|MinDaysBetweenStopAdjustments=30|StopLimitPriceTrendDays=20|StopLimitATRMultiplier=3|UseHedging=True|HedgeBenchmarkSymbol=SPY|HedgeShortSymbol=SH|HedgeRiskPercentDecimal=0.12|HedgeMinDaysBetweenStopAdjustments=1|HedgeInitialCash=3000|HedgeCloseAboveSMANDays=10|HedgeBandBreakCheckDays=3|HedgeATRMultiplier=1|MaxPricingExceptions=3|UseBetaGenerator=True|UseBetaGeneratorMonths=24 TotalActivePositions=7 Slot=0|Symbol=SXT|PurchaseDate=3/31/2025 12:00:00 AM|SellDate=1/1/0001 12:00:00 AM|Shares=14|PurchasePrice=73.98|CurrentPrice=113.4|Volume=362866|Return1D=0|CumReturn252=0|IDIndicator=-7.17131474103586|Score=0.447832358242973|Velocity=0.447678018575852|PE=24.93|Beta=0.640557790575348|InitialStopLimit=59.18|TrailingStopLimit=100.19928508281708|LastStopAdjustment=7/7/2025 12:00:00 AM|PositionRiskPercentDecimal=0.2|R=14.886|Comment=Price changed on 4/1/2025 from $74.43 to $73.98 diff --git a/MarketData/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs b/MarketData/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs index fd7394a..44222e0 100755 --- a/MarketData/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs +++ b/MarketData/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs @@ -103,10 +103,12 @@ namespace MarketData.Generator.MGSHMomentum if(!BackupSession())return false; MGSHPositions activePositions = ActivePositions.GetPositions(); MGSHPosition position = activePositions.Where(x => x.Symbol.Equals(symbol) && x.PurchaseDate.Equals(purchaseDate)).FirstOrDefault(); + bool isHedgePosition=false; if (null == position) // if it's not in the active positions then look in the hedge positions { MGSHPositions hedgePositions = HedgePositions; position = hedgePositions.Where(x => x.Symbol.Equals(symbol) && x.PurchaseDate.Equals(purchaseDate)).FirstOrDefault(); + isHedgePosition=true; if (null == position) { MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Cannot locate position for symbol '{0}' purchased on {1}.", symbol, purchaseDate.ToShortDateString())); @@ -120,7 +122,8 @@ namespace MarketData.Generator.MGSHMomentum { MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Adjusting Cash for Position for symbol '{0}' purchased on {1}. Original Price: {2} New Price: {3} Change in Cash: {4}", symbol, purchaseDate.ToShortDateString(), Utility.FormatCurrency(position.PurchasePrice), Utility.FormatCurrency(purchasePrice), Utility.FormatCurrency((position.PurchasePrice - purchasePrice) * position.Shares))); MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Adjusting R for Position for symbol '{0}' purchased on {1}. Original R: {2} New R: {3} ", symbol, purchaseDate.ToShortDateString(), Utility.FormatNumber(position.R, 2), Utility.FormatNumber(position.PositionRiskPercentDecimal * purchasePrice))); - CashBalance += (position.PurchasePrice - purchasePrice) * position.Shares; + if(isHedgePosition)HedgeCashBalance += (position.PurchasePrice - purchasePrice) * position.Shares; + else CashBalance += (position.PurchasePrice - purchasePrice) * position.Shares; position.Comment = (String.IsNullOrEmpty(position.Comment) ? "" : position.Comment + ".") + String.Format("Price changed on {0} from {1} to {2}", DateTime.Now.ToShortDateString(), Utility.FormatCurrency(position.PurchasePrice), Utility.FormatCurrency(purchasePrice)); position.PurchasePrice = purchasePrice; } @@ -185,9 +188,16 @@ namespace MarketData.Generator.MGSHMomentum position.SellDate=sellDate; position.CurrentPrice=price; position.Comment="Manual close."; - CashBalance+=position.MarketValue; - if(!isHedgePosition)ActivePositions.Remove(position); - else HedgePositions.Remove(position); + if(isHedgePosition) + { + HedgeCashBalance+=position.MarketValue; + HedgePositions.Remove(position); + } + else + { + CashBalance+=position.MarketValue; + ActivePositions.Remove(position); + } AllPositions.Add(position); MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Position for symbol '{0}' purchased on {1} is now closed.",symbol,purchaseDate.ToShortDateString())); SaveSession();