From 30c90cb56c0de237804761871318ca4b8fb7fc75 Mon Sep 17 00:00:00 2001 From: Sean Date: Mon, 31 Mar 2025 15:40:02 -0400 Subject: [PATCH] Optimizations --- MarketDataLib/DataAccess/PortfolioDA.cs | 43 +++++++ MarketDataLib/DataAccess/PricingDA.cs | 49 ++++++++ .../Generator/CMMomentum/CMBacktest.cs | 26 +--- .../Generator/CMTrend/CMTTrendModel..cs | 26 +--- MarketDataLib/Generator/MACDGenerator.cs | 2 +- .../Generator/MGSHMomentum/MGSHBacktest.cs | 26 +--- MarketDataLib/Generator/Momentum/Backtest.cs | 25 +--- MarketDataLib/Generator/SignalGenerator.cs | 2 +- .../Helper/PricingMarketDataHelper.cs | 12 +- .../MarketDataModel/EconomicIndicators.cs | 8 ++ .../GainLoss/GainLossSummaryItemCollection.cs | 116 +++++++++++------- MarketDataLib/Utility/SQLUtils.cs | 4 +- Program.cs | 45 ++++--- 13 files changed, 213 insertions(+), 171 deletions(-) diff --git a/MarketDataLib/DataAccess/PortfolioDA.cs b/MarketDataLib/DataAccess/PortfolioDA.cs index eba6f63..2db109a 100644 --- a/MarketDataLib/DataAccess/PortfolioDA.cs +++ b/MarketDataLib/DataAccess/PortfolioDA.cs @@ -139,6 +139,48 @@ namespace MarketData.DataAccess if(null!=sqlTransaction) sqlTransaction.Dispose(); } } + + public static Dictionary HasStopLimit(List symbols) + { + MySqlConnection sqlConnection=null; + MySqlDataReader sqlDataReader=null; + MySqlCommand sqlCommand=null; + Dictionary hasStopLimit = new Dictionary(); + + try + { + StringBuilder sb=new StringBuilder(); + if(null==symbols) return null; + sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("portfolio_data")); + sb.Append("select symbol, count(*) from stoplimits "); + sb.Append("where symbol in "); + sb.Append(SqlUtils.CreateInClause(symbols)); + sb.Append(" and active=1 group by 1"); + String strQuery=sb.ToString(); + sqlCommand=new MySqlCommand(strQuery,sqlConnection); + sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT; + sqlDataReader=sqlCommand.ExecuteReader(); + while(sqlDataReader.Read()) + { + String symbol = sqlDataReader.GetString(0); + symbol = symbol.ToUpper(); + hasStopLimit.Add(symbol, true); + } + return hasStopLimit; + } + catch(Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception); + return null; + } + finally + { + if(null!=sqlCommand) sqlCommand.Dispose(); + if(null!=sqlDataReader) sqlDataReader.Close(); + if(null!=sqlConnection) sqlConnection.Close(); + } + } + public static bool HasStopLimit(String symbol) { MySqlConnection sqlConnection=null; @@ -153,6 +195,7 @@ namespace MarketData.DataAccess sqlConnection=SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("portfolio_data")); sb.Append("select count(*) from stoplimits "); sb.Append("where symbol='").Append(symbol).Append("'"); + sb.Append(" and active=1"); strQuery=sb.ToString(); sqlCommand=new MySqlCommand(strQuery,sqlConnection); sqlCommand.CommandTimeout=SqlUtils.COMMAND_TIMEOUT; diff --git a/MarketDataLib/DataAccess/PricingDA.cs b/MarketDataLib/DataAccess/PricingDA.cs index d92afb1..121ae26 100644 --- a/MarketDataLib/DataAccess/PricingDA.cs +++ b/MarketDataLib/DataAccess/PricingDA.cs @@ -10,6 +10,7 @@ namespace MarketData.DataAccess { public class PricingDA { + public static readonly int ForwardLookingDays = 90; private PricingDA() { } @@ -628,6 +629,52 @@ namespace MarketData.DataAccess if (null != sqlConnection) sqlConnection.Close(); } } + + public static Dictionary GetNamesForSymbols(List symbols) + { + MySqlConnection sqlConnection = null; + MySqlDataReader sqlDataReader = null; + MySqlCommand sqlCommand=null; + String strQuery = null; + Dictionary dictionary = new Dictionary(); + + try + { + StringBuilder sb = new StringBuilder(); + sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); + sb.Append("select symbol, company from securitymaster where symbol in "); + sb.Append(SqlUtils.CreateInClause(symbols)); + sb.Append(";"); + strQuery = sb.ToString(); ; + sqlCommand = new MySqlCommand(strQuery, sqlConnection); + sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT; + sqlDataReader = sqlCommand.ExecuteReader(); + while (sqlDataReader.Read()) + { + String symbol = sqlDataReader.GetString(0); + String companyName = sqlDataReader.GetString(1); + if(null==companyName || null==symbol)continue; + companyName=companyName.ToUpper(); + symbol = symbol.ToUpper(); + if(dictionary.ContainsKey(symbol))continue; + dictionary.Add(symbol,companyName); + } + return dictionary; + } + catch (Exception exception) + { + MDTrace.WriteLine(LogLevel.DEBUG,exception); + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Query was {0}",strQuery)); + return null; + } + finally + { + if(null!=sqlCommand)sqlCommand.Dispose(); + if (null != sqlDataReader) sqlDataReader.Close(); + if (null != sqlConnection) sqlConnection.Close(); + } + } + public static String GetNameForSymbol(String symbol) { MySqlConnection sqlConnection = null; @@ -1117,6 +1164,7 @@ namespace MarketData.DataAccess // Get prices starting at "startDate" and "days" number of days going into future public static Prices GetPricesForward(String symbol,DateTime startDate,int days) { + Profiler profiler = new Profiler(); MySqlConnection sqlConnection=null; MySqlDataReader sqlDataReader=null; MySqlCommand sqlCommand=null; @@ -1166,6 +1214,7 @@ namespace MarketData.DataAccess if(null!=sqlCommand) sqlCommand.Dispose(); if(null!=sqlDataReader) sqlDataReader.Close(); if(null!=sqlConnection) sqlConnection.Close(); + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[GetPricesForward] Done, took {0}(ms)",profiler.End())); } } public static Prices GetPricesOnOrBefore(String symbol,DateTime startDate) diff --git a/MarketDataLib/Generator/CMMomentum/CMBacktest.cs b/MarketDataLib/Generator/CMMomentum/CMBacktest.cs index fe0c339..42afdea 100644 --- a/MarketDataLib/Generator/CMMomentum/CMBacktest.cs +++ b/MarketDataLib/Generator/CMMomentum/CMBacktest.cs @@ -116,28 +116,6 @@ namespace MarketData.Generator.CMMomentum { if(null==sessionParams)return null; MarketData.Generator.CMMomentum.Positions combinedPositions=sessionParams.GetCombinedPositions(); - - // Fix purchase date/sell date fall on weekend - //foreach(MarketData.Generator.CMMomentum.Position position in combinedPositions) - //{ - // if(dateGenerator.IsWeekend(position.PurchaseDate)) - // { - // while(true) - // { - // position.PurchaseDate=dateGenerator.GetPrevBusinessDay(position.PurchaseDate); - // if(!HolidayDA.IsMarketHoliday(position.PurchaseDate)) break; - // } - // } - // if(dateGenerator.IsWeekend(position.SellDate)) - // { - // while(true) - // { - // position.SellDate=dateGenerator.GetNextBusinessDay(position.SellDate); - // if(!HolidayDA.IsMarketHoliday(position.SellDate)) break; - // } - // } - //} -// ******************************************************** DateTime minDate=combinedPositions.Min(x => x.PurchaseDate); DateTime maxDate=PricingDA.GetLatestDate(); double prevGainLoss=double.NaN; @@ -153,14 +131,14 @@ namespace MarketData.Generator.CMMomentum double gainLossClosedPositions=0.00; double exposure=0.00; double marketValue=0.00; - if(HolidayDA.IsMarketHoliday(currentDate)) continue; +// if(HolidayDA.IsMarketHoliday(currentDate)) continue; ModelPerformanceItem performanceItem=new ModelPerformanceItem(); foreach(MarketData.Generator.CMMomentum.Position openPosition in openPositions) { exposure+=openPosition.Shares*openPosition.PurchasePrice; if(!LocalPriceCache.GetInstance().ContainsPrice(openPosition.Symbol,currentDate)) { - Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,90); + Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,PricingDA.ForwardLookingDays); LocalPriceCache.GetInstance().Add(prices); } Price price=LocalPriceCache.GetInstance().GetPrice(openPosition.Symbol,currentDate); diff --git a/MarketDataLib/Generator/CMTrend/CMTTrendModel..cs b/MarketDataLib/Generator/CMTrend/CMTTrendModel..cs index 2787315..36e9e2d 100644 --- a/MarketDataLib/Generator/CMTrend/CMTTrendModel..cs +++ b/MarketDataLib/Generator/CMTrend/CMTTrendModel..cs @@ -122,28 +122,6 @@ namespace MarketData.Generator.CMTrend { if(null==sessionParams) return null; MarketData.Generator.CMTrend.Positions combinedPositions=sessionParams.GetCombinedPositions(); - - // Fix purchase date/sell date fall on weekend - //foreach(MarketData.Generator.CMTrend.Position position in combinedPositions) - //{ - // if(dateGenerator.IsWeekend(position.PurchaseDate)) - // { - // while(true) - // { - // position.PurchaseDate=dateGenerator.GetPrevBusinessDay(position.PurchaseDate); - // if(!HolidayDA.IsMarketHoliday(position.PurchaseDate)) break; - // } - // } - // if(dateGenerator.IsWeekend(position.SellDate)) - // { - // while(true) - // { - // position.SellDate=dateGenerator.GetNextBusinessDay(position.SellDate); - // if(!HolidayDA.IsMarketHoliday(position.SellDate)) break; - // } - // } - //} - // ******************************************************** DateTime minDate=combinedPositions.Min(x => x.PurchaseDate); DateTime maxDate=PricingDA.GetLatestDate(); double prevGainLoss=double.NaN; @@ -159,14 +137,14 @@ namespace MarketData.Generator.CMTrend double gainLossClosedPositions=0.00; double exposure=0.00; double marketValue=0.00; - if(HolidayDA.IsMarketHoliday(currentDate)) continue; +// if(HolidayDA.IsMarketHoliday(currentDate)) continue; ModelPerformanceItem performanceItem=new ModelPerformanceItem(); foreach(MarketData.Generator.CMTrend.Position openPosition in openPositions) { exposure+=openPosition.Shares*openPosition.PurchasePrice; if(!LocalPriceCache.GetInstance().ContainsPrice(openPosition.Symbol,currentDate)) { - Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,90); + Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,PricingDA.ForwardLookingDays); LocalPriceCache.GetInstance().Add(prices); } Price price=LocalPriceCache.GetInstance().GetPrice(openPosition.Symbol,currentDate); diff --git a/MarketDataLib/Generator/MACDGenerator.cs b/MarketDataLib/Generator/MACDGenerator.cs index a4d2b87..70b72d3 100644 --- a/MarketDataLib/Generator/MACDGenerator.cs +++ b/MarketDataLib/Generator/MACDGenerator.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; using System.Reflection; -using System.Runtime.Remoting.Messaging; +//using System.Runtime.Remoting.Messaging; using System.Text; using MarketData.MarketDataModel; using MarketData.DataAccess; diff --git a/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs b/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs index 1c8eb36..1acff08 100644 --- a/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs +++ b/MarketDataLib/Generator/MGSHMomentum/MGSHBacktest.cs @@ -229,28 +229,6 @@ namespace MarketData.Generator.MGSHMomentum { if(null==sessionParams)return null; MGSHPositions combinedPositions=sessionParams.GetCombinedPositions(); - - // Fix purchase date/sell date fall on weekend - //foreach(MGSHPosition position in combinedPositions) - //{ - // if(dateGenerator.IsWeekend(position.PurchaseDate)) - // { - // while(true) - // { - // position.PurchaseDate=dateGenerator.GetPrevBusinessDay(position.PurchaseDate); - // if(!HolidayDA.IsMarketHoliday(position.PurchaseDate)) break; - // } - // } - // if(dateGenerator.IsWeekend(position.SellDate)) - // { - // while(true) - // { - // position.SellDate=dateGenerator.GetNextBusinessDay(position.SellDate); - // if(!HolidayDA.IsMarketHoliday(position.SellDate)) break; - // } - // } - //} - // ******************************************************** DateTime minDate=combinedPositions.Min(x => x.PurchaseDate); DateTime maxDate=PricingDA.GetLatestDate(); double prevGainLoss=double.NaN; @@ -266,14 +244,14 @@ namespace MarketData.Generator.MGSHMomentum double gainLossClosedPositions=0.00; double exposure=0.00; double marketValue=0.00; - if(HolidayDA.IsMarketHoliday(currentDate)) continue; +// if(HolidayDA.IsMarketHoliday(currentDate)) continue; ModelPerformanceItem performanceItem=new ModelPerformanceItem(); foreach(MGSHPosition openPosition in openPositions) { exposure+=openPosition.Shares*openPosition.PurchasePrice; if(!LocalPriceCache.GetInstance().ContainsPrice(openPosition.Symbol,currentDate)) { - Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,90); + Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,PricingDA.ForwardLookingDays); LocalPriceCache.GetInstance().Add(prices); } Price price=LocalPriceCache.GetInstance().GetPrice(openPosition.Symbol,currentDate); diff --git a/MarketDataLib/Generator/Momentum/Backtest.cs b/MarketDataLib/Generator/Momentum/Backtest.cs index 922d755..4943544 100644 --- a/MarketDataLib/Generator/Momentum/Backtest.cs +++ b/MarketDataLib/Generator/Momentum/Backtest.cs @@ -107,27 +107,6 @@ namespace MarketData.Generator.Momentum if(null==sessionParams)return null; MarketData.Generator.Momentum.Positions combinedPositions=sessionParams.GetCombinedPositions(); - // Fix purchase date/sell date fall on weekend - //foreach(MarketData.Generator.Momentum.Position position in combinedPositions) - //{ - // if(dateGenerator.IsWeekend(position.PurchaseDate)) - // { - // while(true) - // { - // position.PurchaseDate=dateGenerator.GetPrevBusinessDay(position.PurchaseDate); - // if(!HolidayDA.IsMarketHoliday(position.PurchaseDate)) break; - // } - // } - // if(dateGenerator.IsWeekend(position.SellDate)) - // { - // while(true) - // { - // position.SellDate=dateGenerator.GetNextBusinessDay(position.SellDate); - // if(!HolidayDA.IsMarketHoliday(position.SellDate)) break; - // } - // } - //} - // ******************************************************** DateTime minDate=combinedPositions.Min(x => x.PurchaseDate); DateTime maxDate=PricingDA.GetLatestDate(); double prevGainLoss=double.NaN; @@ -142,14 +121,14 @@ namespace MarketData.Generator.Momentum double gainLossClosedPositions=0.00; double exposure=0.00; double marketValue=0.00; - if(HolidayDA.IsMarketHoliday(currentDate)) continue; +// if(HolidayDA.IsMarketHoliday(currentDate)) continue; ModelPerformanceItem performanceItem=new ModelPerformanceItem(); foreach(MarketData.Generator.Momentum.Position openPosition in openPositions) { exposure+=openPosition.Shares*openPosition.PurchasePrice; if(!LocalPriceCache.GetInstance().ContainsPrice(openPosition.Symbol,currentDate)) { - Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,90); + Prices prices=PricingDA.GetPricesForward(openPosition.Symbol,currentDate,PricingDA.ForwardLookingDays); LocalPriceCache.GetInstance().Add(prices); } Price price=LocalPriceCache.GetInstance().GetPrice(openPosition.Symbol,currentDate); diff --git a/MarketDataLib/Generator/SignalGenerator.cs b/MarketDataLib/Generator/SignalGenerator.cs index 846f3f9..2f39a2f 100644 --- a/MarketDataLib/Generator/SignalGenerator.cs +++ b/MarketDataLib/Generator/SignalGenerator.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; using System.Reflection; -using System.Runtime.Remoting.Messaging; +//using System.Runtime.Remoting.Messaging; using System.Text; using MarketData.MarketDataModel; diff --git a/MarketDataLib/Helper/PricingMarketDataHelper.cs b/MarketDataLib/Helper/PricingMarketDataHelper.cs index e504dd1..2dc99bf 100644 --- a/MarketDataLib/Helper/PricingMarketDataHelper.cs +++ b/MarketDataLib/Helper/PricingMarketDataHelper.cs @@ -1,12 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using MarketData.MarketDataModel; +using MarketData.MarketDataModel; using MarketData.DataAccess; using MarketData.Utils; -using System.Net; +using System; +using System.Linq; +using System.Threading; +using System.Collections.Generic; namespace MarketData.Helper { diff --git a/MarketDataLib/MarketDataModel/EconomicIndicators.cs b/MarketDataLib/MarketDataModel/EconomicIndicators.cs index 6e058d7..e8ee20d 100644 --- a/MarketDataLib/MarketDataModel/EconomicIndicators.cs +++ b/MarketDataLib/MarketDataModel/EconomicIndicators.cs @@ -98,6 +98,14 @@ namespace MarketData.MarketDataModel MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Error extracting economic indicators from zip file {0}, error was {1}",strPathZipFile,exception.ToString())); return null; } + finally + { + if(File.Exists(strPathZipFile)) + { + try{File.Delete(strPathZipFile);} + finally{;} + } + } } public static EconomicIndicators FromDataTable(DataTable dataTable) { diff --git a/MarketDataLib/MarketDataModel/GainLoss/GainLossSummaryItemCollection.cs b/MarketDataLib/MarketDataModel/GainLoss/GainLossSummaryItemCollection.cs index a676e5b..d530842 100644 --- a/MarketDataLib/MarketDataModel/GainLoss/GainLossSummaryItemCollection.cs +++ b/MarketDataLib/MarketDataModel/GainLoss/GainLossSummaryItemCollection.cs @@ -19,66 +19,89 @@ namespace MarketData.MarketDataModel.GainLoss } public GainLossSummaryItemCollection(PortfolioTrades portfolioTrades,ITotalGainLossGenerator gainLossGenerator,IActiveGainLossGenerator activeGainLossGenerator,DateTime? maxDateRef=null) { - List symbols=portfolioTrades.Symbols; + Profiler profiler = new Profiler(); - if(null==gainLossGenerator || null==activeGainLossGenerator)return; - - foreach(String symbol in symbols) + try { - PortfolioTrades portfolioTradesSymbol=portfolioTrades.FilterSymbol(symbol); - GainLossCollection gainLossCollection=activeGainLossGenerator.GenerateGainLoss(portfolioTradesSymbol,maxDateRef); + List symbols=portfolioTrades.Symbols; + if(null==gainLossGenerator || null==activeGainLossGenerator)return; - TotalGainLossCollection totalGainLossCollection=gainLossGenerator.GenerateTotalGainLoss(portfolioTradesSymbol,maxDateRef); - GainLossCompoundModelCollection gainLossCompoundModelCollection=new GainLossCompoundModelCollection(gainLossCollection,totalGainLossCollection); + Dictionary companyNames = PricingDA.GetNamesForSymbols(symbols); + Dictionary stopLimits = PortfolioDA.HasStopLimit(symbols); - if(1>gainLossCompoundModelCollection.Count) continue; - GainLossSummaryItem gainLossSummaryItem=new GainLossSummaryItem(); - gainLossSummaryItem.Date=gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-1].Date; - gainLossSummaryItem.Symbol=symbol; - gainLossSummaryItem.CompanyName=PricingDA.GetNameForSymbol(symbol); - gainLossSummaryItem.CurrentGainLoss=gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-1].ActiveGainLoss; - double previousGainLoss=1==gainLossCompoundModelCollection.Count?0.00:gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-2].ActiveGainLoss; - gainLossSummaryItem.PreviousGainLoss=previousGainLoss; - gainLossSummaryItem.Change=gainLossSummaryItem.CurrentGainLoss-gainLossSummaryItem.PreviousGainLoss; - if(1==gainLossCollection.Count) gainLossSummaryItem.ChangePercent=0.00; - else + foreach(String symbol in symbols) { - double currentMarketValue=gainLossCollection[gainLossCollection.Count-1].Exposure+gainLossCollection[gainLossCollection.Count-1].GainLoss; - double previousMarketValue=gainLossCollection[gainLossCollection.Count-2].Exposure+gainLossCollection[gainLossCollection.Count-2].GainLoss; - if(0.00==previousMarketValue) gainLossSummaryItem.ChangePercent=0.00; - else gainLossSummaryItem.ChangePercent=((currentMarketValue-previousMarketValue)/previousMarketValue)*100; - if(gainLossSummaryItem.CurrentGainLoss<0&&gainLossSummaryItem.PreviousGainLoss<0) - { // if current gainloss is negative and previous gainloss is negative then show change percent as a further dip into negative (i.e.) make sure sign is negative - if(Math.Abs(gainLossSummaryItem.CurrentGainLoss)>Math.Abs(gainLossSummaryItem.PreviousGainLoss)) gainLossSummaryItem.ChangePercent=Math.Abs(gainLossSummaryItem.ChangePercent)*-1.00; - } - else if(gainLossSummaryItem.CurrentGainLoss<0&&gainLossSummaryItem.PreviousGainLoss>0) + PortfolioTrades portfolioTradesSymbol=portfolioTrades.FilterSymbol(symbol); + GainLossCollection gainLossCollection=activeGainLossGenerator.GenerateGainLoss(portfolioTradesSymbol,maxDateRef); + + TotalGainLossCollection totalGainLossCollection=gainLossGenerator.GenerateTotalGainLoss(portfolioTradesSymbol,maxDateRef); + GainLossCompoundModelCollection gainLossCompoundModelCollection=new GainLossCompoundModelCollection(gainLossCollection,totalGainLossCollection); + + if(1>gainLossCompoundModelCollection.Count) continue; + GainLossSummaryItem gainLossSummaryItem=new GainLossSummaryItem(); + gainLossSummaryItem.Date=gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-1].Date; + gainLossSummaryItem.Symbol=symbol; + if(companyNames.ContainsKey(symbol)) { - gainLossSummaryItem.ChangePercent=Math.Abs(gainLossSummaryItem.ChangePercent)*-1.00; + gainLossSummaryItem.CompanyName=companyNames[symbol]; } - else if(gainLossSummaryItem.CurrentGainLoss>0&&gainLossSummaryItem.PreviousGainLoss>0) +// gainLossSummaryItem.CompanyName=PricingDA.GetNameForSymbol(symbol); + gainLossSummaryItem.CurrentGainLoss=gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-1].ActiveGainLoss; + double previousGainLoss=1==gainLossCompoundModelCollection.Count?0.00:gainLossCompoundModelCollection[gainLossCompoundModelCollection.Count-2].ActiveGainLoss; + gainLossSummaryItem.PreviousGainLoss=previousGainLoss; + gainLossSummaryItem.Change=gainLossSummaryItem.CurrentGainLoss-gainLossSummaryItem.PreviousGainLoss; + if(1==gainLossCollection.Count) gainLossSummaryItem.ChangePercent=0.00; + else { - if(gainLossSummaryItem.CurrentGainLossMath.Abs(gainLossSummaryItem.PreviousGainLoss)) gainLossSummaryItem.ChangePercent=Math.Abs(gainLossSummaryItem.ChangePercent)*-1.00; + } + else if(gainLossSummaryItem.CurrentGainLoss<0&&gainLossSummaryItem.PreviousGainLoss>0) + { + gainLossSummaryItem.ChangePercent=Math.Abs(gainLossSummaryItem.ChangePercent)*-1.00; + } + else if(gainLossSummaryItem.CurrentGainLoss>0&&gainLossSummaryItem.PreviousGainLoss>0) + { + if(gainLossSummaryItem.CurrentGainLoss symbols=portfolioTrades.Symbols; + + Dictionary stopLimits = PortfolioDA.HasStopLimit(symbols); + foreach(String symbol in symbols) { PortfolioTrades portfolioTradesSymbol=portfolioTrades.FilterSymbol(symbol); @@ -125,7 +148,8 @@ namespace MarketData.MarketDataModel.GainLoss { if(!portfolioTrades.HasOpenPositions(symbol)) continue; } - gainLossSummaryItem.HasStopLimit=PortfolioDA.HasStopLimit(symbol); + gainLossSummaryItem.HasStopLimit = stopLimits.ContainsKey(symbol); +// gainLossSummaryItem.HasStopLimit=PortfolioDA.HasStopLimit(symbol); Add(gainLossSummaryItem); } GainLossSummaryItemCollection gainLossSummaryCollection=new GainLossSummaryItemCollection((from GainLossSummaryItem gainLossSummaryItem in this orderby gainLossSummaryItem.Date descending,gainLossSummaryItem.Change descending,gainLossSummaryItem.Symbol descending select gainLossSummaryItem).ToList()); diff --git a/MarketDataLib/Utility/SQLUtils.cs b/MarketDataLib/Utility/SQLUtils.cs index ec97694..3bd0b0c 100644 --- a/MarketDataLib/Utility/SQLUtils.cs +++ b/MarketDataLib/Utility/SQLUtils.cs @@ -49,7 +49,7 @@ namespace MarketData.Utils //SetConnectionCollation(connection); return connection; } - catch(SqlException exception) + catch(Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString()); return null; @@ -84,7 +84,7 @@ namespace MarketData.Utils connection.Open(); return connection; } - catch(SqlException exception) + catch(Exception exception) { MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString()); return null; diff --git a/Program.cs b/Program.cs index ba0c75f..c118376 100644 --- a/Program.cs +++ b/Program.cs @@ -24,6 +24,7 @@ using Axiom.Interpreter; using System.Data; using MarketData.Generator.MovingAverage; using MarketData.Generator.MGSHMomentum; +using System.Net; namespace MarketData { @@ -995,26 +996,30 @@ namespace MarketData //UserDA.AddUser(user); -// Put this in Daily Cron + + + public static void CheckPricesForHoldings() + { +// Put this in Daily Cron // Check that we have pricing for all trades and dates held - //DateTime selectedDate = DateTime.Parse("03-27-2025"); - //DateTime historicalDate = DateTime.Parse("01-02-2024"); - //PortfolioTrades portfolioTrades = PortfolioDA.GetTrades(); - //foreach(PortfolioTrade portfolioTrade in portfolioTrades) - //{ - // DateTime tradeDate = portfolioTrade.TradeDate; - // DateTime sellDate = portfolioTrade.SellDate; - // if(Utility.IsEpoch(sellDate))sellDate = selectedDate; - // DateGenerator dateGenerator = new DateGenerator(); - // List historicalDates = dateGenerator.GenerateHistoricalDates(sellDate, tradeDate); - // foreach(DateTime date in historicalDates) - // { - // if(null == GBPriceCache.GetInstance().GetPrice(portfolioTrade.Symbol, date)) - // { - // MDTrace.WriteLine(LogLevel.DEBUG,String.Format("No price for {0} on {1}",portfolioTrade.Symbol,date.ToShortDateString())); - // } - // } - //} + DateTime selectedDate = PricingDA.GetLatestDate(); + PortfolioTrades portfolioTrades = PortfolioDA.GetTrades(); + foreach (PortfolioTrade portfolioTrade in portfolioTrades) + { + DateTime tradeDate = portfolioTrade.TradeDate; + DateTime sellDate = portfolioTrade.SellDate; + if (Utility.IsEpoch(sellDate)) sellDate = selectedDate; + DateGenerator dateGenerator = new DateGenerator(); + List historicalDates = dateGenerator.GenerateHistoricalDates(sellDate, tradeDate); + foreach (DateTime date in historicalDates) + { + if (null == GBPriceCache.GetInstance().GetPrice(portfolioTrade.Symbol, date)) + { + MDTrace.WriteLine(LogLevel.DEBUG, String.Format("No price for {0} on {1}", portfolioTrade.Symbol, date.ToShortDateString())); + } + } + } + } static int Main(string[] args) { @@ -1026,6 +1031,8 @@ namespace MarketData Trace.Listeners.Add(new TextWriterTraceListener(strLogFile)); DateTime currentDate=DateTime.Now; +// CheckPricesForHoldings(); + // Price price = MarketDataHelper.GetLatestPriceBigCharts("NVDA"); //List cashflowStatements = MarketDataHelper.GetCashflowStatement("AAPL",CashflowStatement.PeriodType.Annual);