From 97569dca2a626b077e4ea05f393e399fbe4d5027 Mon Sep 17 00:00:00 2001 From: Sean Date: Tue, 9 Apr 2024 18:07:51 -0400 Subject: [PATCH] General updates --- .vs/MarketData/v16/.suo | Bin 673280 -> 668672 bytes MarketDataLib/Helper/MarketDataHelper.cs | 10 ++--- .../Helper/PricingMarketDataHelper.cs | 17 +++++++-- MarketDataUnitTests/MarketDataFeedTests.cs | 35 ++++++++++++++++-- Program.cs | 4 +- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/.vs/MarketData/v16/.suo b/.vs/MarketData/v16/.suo index b7b2b42ab6d9e942938bedd0da28b36e3b2ee6e6..3ca1b8abbe17a31e0239209fb1acf1f3ca01d29e 100644 GIT binary patch delta 12805 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 bq@DNcqsZT38%2(X^c+f!vsF@UwjTc<%xE{} delta 12052 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 ToK?I0`We$T97A1_g<1X&1MVq5 diff --git a/MarketDataLib/Helper/MarketDataHelper.cs b/MarketDataLib/Helper/MarketDataHelper.cs index ecbf79b..f2861b9 100644 --- a/MarketDataLib/Helper/MarketDataHelper.cs +++ b/MarketDataLib/Helper/MarketDataHelper.cs @@ -5227,6 +5227,7 @@ namespace MarketData.Helper } return prices; } + public static Price GetPriceAsOf(String symbol, DateTime asOf) { HttpNetResponse httpNetResponse=null; @@ -5293,12 +5294,6 @@ namespace MarketData.Helper //******************************************************************************************************************************************************************************************************** // ******************************************************************************** H I S T O R I C A L P R I C I N G Y A H O O ********************************************************************* //******************************************************************************************************************************************************************************************************** -// ********************************************************************************************************************************************************* -// ********************************************************************************************************************************************************* - -// ******************************************************************************************************************************************************************************************************************** -// ******************************************************************************************************** N E W V E R S I O N ************************************************************************************* -// ******************************************************************************************************************************************************************************************************************** // Implemented 06/10/2022 public static Price GetDailyPrice(String symbol,DateTime pricingDate) @@ -5319,12 +5314,15 @@ namespace MarketData.Helper HttpNetResponse httpNetResponse=null; try { + startDate=startDate.Date; + endDate=endDate.Date; if(startDate>endDate) { DateTime tempDate=startDate; startDate=endDate; endDate=tempDate; } + MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[MarketDataHelper:GetDailyPrices]{0} start:{1} end:{2}",symbol,Utility.DateTimeToStringMMHDDHYYYY(startDate),Utility.DateTimeToStringMMHDDHYYYY(endDate))); StringBuilder sb = new StringBuilder(); String strRequest; diff --git a/MarketDataLib/Helper/PricingMarketDataHelper.cs b/MarketDataLib/Helper/PricingMarketDataHelper.cs index cf12caf..7f79189 100644 --- a/MarketDataLib/Helper/PricingMarketDataHelper.cs +++ b/MarketDataLib/Helper/PricingMarketDataHelper.cs @@ -6,6 +6,7 @@ using System.Threading; using MarketData.MarketDataModel; using MarketData.DataAccess; using MarketData.Utils; +using System.Net; namespace MarketData.Helper { @@ -49,7 +50,8 @@ namespace MarketData.Helper } public class PricingMarketDataHelper { - private static int MaxThreads = (int)ThreadHelperEnum.MaxThreads; + private static int MaxThreads = 20; // (int)ThreadHelperEnum.MaxThreads; + private static int WaitBetweenRequests=300; private List symbols; private int currentIndex = 0; @@ -97,7 +99,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index],resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdateLatestPriceAll, pricingThreadHelper); - try{Thread.Sleep(250);}catch(Exception){;} + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdateLatestPriceAll, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -131,6 +133,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index],startDate.Value,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesBigCharts, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesBigCharts, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -164,6 +167,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper=new PricingThreadHelper(queueSymbols[index],startDate.Value,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesYahoo,pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesYahoo, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -197,6 +201,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper=new PricingThreadHelper(queueSymbols[index],startDate.Value,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesYahooSweep,pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesYahooSweep, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -229,6 +234,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], resetEvents[index],asOf); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesAsOf, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesAsOfSymbol, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -261,6 +267,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper=new PricingThreadHelper(queueSymbols[index],asOf,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesYahoo,pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesAsOfSymbol, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -292,6 +299,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], resetEvents[index],asOf); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdatePricesAsOf, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"UpdatePricesAsOf, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -325,6 +333,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], resetEvents[index],startDate); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackGetMissingPrice, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"Get missing prices, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -356,6 +365,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], resetEvents[index],startDate); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackGetMissingPrice, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"Get missing prices, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -394,7 +404,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], pricingDate,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackUpdateLatestPrice, pricingThreadHelper); - try{Thread.Sleep(250);}catch(Exception){;} + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"Load prices, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); @@ -427,6 +437,7 @@ namespace MarketData.Helper { PricingThreadHelper pricingThreadHelper = new PricingThreadHelper(queueSymbols[index], pricingDate,resetEvents[index]); ThreadPool.QueueUserWorkItem(ThreadPoolCallbackLoadPrices, pricingThreadHelper); + try{Thread.Sleep(WaitBetweenRequests);}catch(Exception){;} } MDTrace.WriteLine(LogLevel.DEBUG,"Load prices, waiting for queued items to complete."); WaitHandle.WaitAll(resetEvents); diff --git a/MarketDataUnitTests/MarketDataFeedTests.cs b/MarketDataUnitTests/MarketDataFeedTests.cs index e9931a5..506222e 100644 --- a/MarketDataUnitTests/MarketDataFeedTests.cs +++ b/MarketDataUnitTests/MarketDataFeedTests.cs @@ -43,9 +43,17 @@ namespace MarketDataUnitTests } [TestMethod] - public void LatestPriceXXXRetrieval() + public void LatestPriceRetrieval() { - String symbol="ACWX"; + String symbol="AAPL"; + Price price=MarketDataHelper.GetLatestPrice(symbol); + Assert.IsTrue(null!=price && price.IsValid); + } + + [TestMethod] + public void LatestPriceGoogleRetrieval() + { + String symbol="AAPL"; Price price=MarketDataHelper.GetLatestPriceGoogle(symbol); Assert.IsTrue(null!=price && price.IsValid); } @@ -55,7 +63,7 @@ namespace MarketDataUnitTests { String symbol="AAPL"; Price price=MarketDataHelper.GetLatestPriceYahoo(symbol); - Assert.IsTrue(null!=price,"No Price"); + Assert.IsTrue(null!=price,"No Price from Yahoo"); Assert.IsTrue(price.IsValid,"Invalid Price"); } @@ -68,6 +76,27 @@ namespace MarketDataUnitTests Assert.IsTrue(price.IsValid,"Invalid Price"); } + [TestMethod] + public void DailyPricesYahoo() + { + String symbol="AAPL"; + DateTime startDate=DateTime.Parse("04-08-2024"); + DateTime endDate=DateTime.Parse("04-01-2024"); + + Prices prices = MarketDataHelper.GetDailyPrices(symbol, startDate, endDate); + Assert.IsTrue(null!=prices,"No Price from BigCharts"); + } + //public static Prices GetDailyPrices(String symbol, DateTime startDate, DateTime endDate) + + [TestMethod] + public void HistoricalPriceBigChartsRetrieval() + { + String symbol="AAPL"; + DateTime asOf=DateTime.Now; + Price price = MarketDataHelper.GetPriceAsOf(symbol, asOf); + Assert.IsTrue(null!=price,"No Price from BigCharts"); + } + [TestMethod] public void ConsumerPriceIndexBureauOfLaborStatisticsRetrieval() { diff --git a/Program.cs b/Program.cs index f8f7106..19f8a81 100644 --- a/Program.cs +++ b/Program.cs @@ -1664,8 +1664,8 @@ namespace MarketData Utility.RemoveLogFiles(); int STAGE_1=0,STAGE_FINAL=2; - DeletePriceWatchList("valuations",startDate.ToShortDateString()); - DeletePriceWatchList("Momentum",startDate.ToShortDateString()); + DeletePriceWatchList("valuations", startDate.ToShortDateString()); + DeletePriceWatchList("Momentum", startDate.ToShortDateString()); ManualResetEvent[] resetEvents = new ManualResetEvent[STAGE_FINAL+1]; for(int index=0;index