Add methods to support intraday

This commit is contained in:
2025-03-26 17:56:50 -04:00
parent 43f2bb43ae
commit 85307d5b39
6 changed files with 154 additions and 16 deletions

1
.gitignore vendored
View File

@@ -152,3 +152,4 @@ MarketData/MarketDataLib/obj/MarketDataLib.csproj.nuget.g.targets
MarketData/MarketDataLib/obj/project.assets.json
MarketData/MarketDataLib/obj/project.nuget.cache
MarketData/MarketData/*.log
MarketData/MarketData/marketdata.log

View File

@@ -63,6 +63,38 @@ namespace MarketData.Services
if(!commandArgs.Has("DATE")){Console.WriteLine("UPDATEDAILY2 MISSING DATE");return;}
UpdateDaily2(commandArgs.Coalesce<DateTime>("DATE"));
}
else if (arg.Equals("UPDATELATESTPRICEOPENPOSITIONS"))
{
UpdateLatestPriceOpenPositions();
}
else if (arg.Equals("UPDATELATESTPRICEWATCHLIST"))
{
CommandArgs commandArgs=new CommandArgs(args);
if(!commandArgs.Has("WATCHLIST")){Console.WriteLine("UPDATELATESTPRICEWATCHLIST MISSING WATCHLIST");return;}
UpdateLatestPriceWatchList(commandArgs.Coalesce<String>("WATCHLIST"));
}
else if (arg.Equals("UPDATELATESTANALYSTRATINGS"))
{
CommandArgs commandArgs = new CommandArgs(args);
if (commandArgs.Has("UPDATESECURITYMASTER")) UpdateLatestAnalystRatings(commandArgs.Coalesce<Boolean>("UPDATESECURITYMASTER"));
else UpdateLatestAnalystRatings();
}
else if (arg.Equals("UPDATEANALYSTRATINGS"))
{
CommandArgs commandArgs = new CommandArgs(args);
if (commandArgs.Has("SYMBOL") && commandArgs.Has("MINDATE")) UpdateAnalystRatings(commandArgs.Coalesce<String>("SYMBOL"), commandArgs.Coalesce<DateTime>("MINDATE"));
else if (commandArgs.Has("SYMBOL") ) UpdateAnalystRatings(commandArgs.Coalesce<String>("SYMBOL"));
else if (commandArgs.Has("MINDATE")) UpdateAnalystRatings(null,commandArgs.Coalesce<DateTime>("MINDATE"));
else UpdateAnalystRatings();
}
else if(arg.Equals("ECHO"))
{
MDTrace.WriteLine(LogLevel.DEBUG,$"ECHO");
for(int index =0; index<args.Length;index++)
{
MDTrace.WriteLine(LogLevel.DEBUG,$"ARG[{index}]:{args[index]}");
}
}
else
{
DisplayUsage();
@@ -91,6 +123,10 @@ namespace MarketData.Services
MDTrace.WriteLine(LogLevel.DEBUG,$"LOADHEADLINESWATCHLIST");
MDTrace.WriteLine(LogLevel.DEBUG,$"LOADPREMARKETDATA");
MDTrace.WriteLine(LogLevel.DEBUG,"UPDATEDAILY2 /DATE: - updates prices, yields, and ratings");
MDTrace.WriteLine(LogLevel.DEBUG,"UPDATEANALYSTRATINGS");
MDTrace.WriteLine(LogLevel.DEBUG,"UPDATELATESTPRICEWATCHLIST /WATCHLIST:");
MDTrace.WriteLine(LogLevel.DEBUG,"UPDATELATESTPRICEOPENPOSITIONS");
MDTrace.WriteLine(LogLevel.DEBUG,"UPDATELATESTPRICEOPENPOSITIONS");
}
// **********************************************************************************************************************************************
@@ -129,6 +165,7 @@ namespace MarketData.Services
String result=Console.ReadLine();
if(null==result||!(result.ToUpper().Equals("Y")||result.ToUpper().Equals("YES")))return;
}
MDTrace.WriteLine(LogLevel.DEBUG,$"UPDATEDAILY2 DATE:{startDate.ToShortDateString()}");
Utility.RemoveLogFilesExcept("marketdata.log"); // don't remove the current log file
int STAGE_1=0,STAGE_2=1,STAGE_3=2,STAGE_4=3,STAGE_5=4,STAGE_6=5,STAGE_7=6,STAGE_8=7,STAGE_9=8,STAGE_10=9,STAGE_11=10,STAGE_12=11,STAGE_FINAL=12;
DeletePriceWatchList("valuations",startDate.ToShortDateString());
@@ -543,13 +580,95 @@ namespace MarketData.Services
// **********************************************************************************************************************************************
// ******************************************* E N D U P D A T E D A I L Y 2 M E T H O D S ***************************************************
// **********************************************************************************************************************************************
public static void UpdateAnalystRatings(String paramSymbol = null,DateTime? minDate=null)
{
try
{
MDTrace.WriteLine(LogLevel.DEBUG, "[UPDATEANALYSTRATINGS]");
List<String> symbols = new List<String>();
if (paramSymbol == null) symbols = PricingDA.GetSymbols();
else symbols.Add(paramSymbol);
foreach (String symbol in symbols)
{
AnalystRatings analystRatings = MarketDataHelper.GetAnalystRatingsMarketBeat(symbol);
if (null == analystRatings || 0 == analystRatings.Count)
{
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("No analyst ratings for {0}", symbol));
continue;
}
AnalystRatings duplicateList = new AnalystRatings();
if (null != minDate)
{
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Minimum Rating Date of {0} is specified.", minDate.Value.ToShortDateString()));
analystRatings = new AnalystRatings((from AnalystRating analystRating in analystRatings where analystRating.Date >= minDate.Value select analystRating).ToList());
}
foreach (AnalystRating analystRating in analystRatings)
{
if (AnalystRatingsDA.ContainsAnalystRating(analystRating))
{
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Already have analyst rating for {0} on {1} from brokerage firm {2}", analystRating.Symbol, analystRating.Date.ToShortDateString(), analystRating.BrokerageFirm));
duplicateList.Add(analystRating);
continue;
}
}
analystRatings = new AnalystRatings(analystRatings.Except(duplicateList).ToList());
foreach (AnalystRating analystRating in analystRatings)
{
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Inserting Analyst Rating for {0} on {1} from brokerage firm {2}", analystRating.Symbol, analystRating.Date.ToShortDateString(), analystRating.BrokerageFirm));
}
AnalystRatingsDA.InsertAnalystRatings(analystRatings);
}
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG, exception);
}
finally
{
MDTrace.WriteLine(LogLevel.DEBUG, "[UPDATEANALYSTRATINGS]");
}
}
public static void UpdateLatestPriceWatchList(String watchListName)
{
try
{
if(!CheckRunCriteria())return;
MDTrace.WriteLine(LogLevel.DEBUG,$"UPDATELATESTPRICEWATCHLIST WATCHLIST:{watchListName}");
List<String> symbols = WatchListDA.GetWatchList(watchListName);
PricingMarketDataHelper pricingMarketDataHelper=new PricingMarketDataHelper();
pricingMarketDataHelper.UpdateLatestPrices(symbols);
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
}
}
public static void UpdateLatestPriceOpenPositions()
{
try
{
if(!CheckRunCriteria())return;
MDTrace.WriteLine(LogLevel.DEBUG,$"UPDATELATESTPRICEOPENPOSITIONS");
PortfolioTrades portfolioTrades=PortfolioDA.GetOpenTrades();
List<String> symbols=(from PortfolioTrade portfolioTrade in portfolioTrades select portfolioTrade.Symbol).Distinct().ToList();
if(symbols.Any(x=>x.Equals("SPY")))symbols.Add("SH");
PricingMarketDataHelper pricingMarketDataHelper=new PricingMarketDataHelper();
pricingMarketDataHelper.UpdateLatestPrices(symbols);
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
}
}
// **********************************************************************************************************************************************
public static void LoadHeadlinesWatchList(String watchList)
{
if(!CheckRunCriteria())return;
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("LoadHeadlinesWatchList {0}",watchList));
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("LOADHEADLINESWATCHLIST {0}",watchList));
List<String> symbols = WatchListDA.GetWatchList(watchList);
HeadlinesMarketDataHelper headlinesMarketDataHelper= new HeadlinesMarketDataHelper();
headlinesMarketDataHelper.LoadHeadlines(symbols);
@@ -562,6 +681,7 @@ namespace MarketData.Services
PremarketElements premarketElements=null;
if(!CheckRunCriteria())return;
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("LOADPREMARKETDATA"));
for(int retry=0;retry<retries && (null==premarketElements || 0==premarketElements.Count);retry++,Thread.Sleep(sleepTime))
{
premarketElements=MarketDataHelper.GetPremarketData();

View File

@@ -1,5 +1,12 @@
[LOCAL][Thread=1][TRACE.DEBUG][3/25/2025 10:24:56PM] [MarketData.Services.MainService::RunService(args,configuration)][RunService] Started @ 2025-03-25 10:24:56 PM
[LOCAL][Thread=1][TRACE.DEBUG][3/25/2025 10:24:56PM] [MarketData.Services.MainService::DisplayUsage()]USAGE
[LOCAL][Thread=1][TRACE.DEBUG][3/25/2025 10:24:56PM] [MarketData.Services.MainService::DisplayUsage()]LOADHEADLINESWATCHLIST
[LOCAL][Thread=1][TRACE.DEBUG][3/25/2025 10:24:56PM] [MarketData.Services.MainService::DisplayUsage()]LOADPREMARKETDATA
[LOCAL][Thread=1][TRACE.DEBUG][3/25/2025 10:24:56PM] [MarketData.Services.MainService::DisplayUsage()]UPDATEDAILY2 /DATE: - updates prices, yields, and ratings
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:18PM] [MarketData.Services.MainService::RunService(args,configuration)][RunService] Started @ 2025-03-26 12:43:18 PM
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Services.MainService::RunService(args,configuration)][RunService] Argument ECHO
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Services.MainService::RunService(args,configuration)]ECHO
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Services.MainService::RunService(args,configuration)]ARG[0]:ECHO
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Services.MainService::RunService(args,configuration)]ARG[1]:/DATE:03-25-2025
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose]Thread state is 'Running'. Joining main thread...
[LOCAL][Thread=11][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Cache.LocalPriceCache::ThreadProc()][LocalPriceCache:ThreadProc]Thread ended. Items in cache:0
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Cache.LocalPriceCache::Dispose()][LocalPriceCache:Dispose] End
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:19PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose]Thread state is 'WaitSleepJoin'. Joining main thread...
[LOCAL][Thread=12][TRACE.DEBUG][3/26/2025 12:43:20PM] [MarketData.Cache.GBPriceCache::ThreadProc()][GBPriceCache:ThreadProc]Thread ended.
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:20PM] [MarketData.Cache.GBPriceCache::Dispose()][GBPriceCache:Dispose] End.
[LOCAL][Thread=1][TRACE.DEBUG][3/26/2025 12:43:20PM] [MarketData.Services.MainService::RunService(args,configuration)][RunService] Done, total took 1961(ms)

View File

@@ -1,9 +1,4 @@
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;

View File

@@ -99,12 +99,12 @@ namespace MarketData.Utils
public static void RemoveLogFilesExcept(String exceptFile,String strFolder=null)
{
if(null==strFolder)strFolder=Directory.GetCurrentDirectory();
String[] logFiles=Directory.GetFiles(strFolder);
String[] logFiles=Directory.GetFiles(strFolder,"*.log");
if(null==logFiles || 0==logFiles.Length)return;
logFiles=logFiles
.Where(x => x.EndsWith(".log",StringComparison.InvariantCultureIgnoreCase) &&
!x.Equals(exceptFile,StringComparison.InvariantCultureIgnoreCase)).ToArray<String>();
!x.EndsWith(exceptFile,StringComparison.InvariantCultureIgnoreCase)).ToArray<String>();
if(null==logFiles || 0==logFiles.Length)return;
foreach(String logFile in logFiles)
{

View File

@@ -1,3 +1,18 @@
# ARM64
ARM version of marketdata libraries.
ARM version of marketdata libraries.
sudo truncate syslog -- size 0
CRON SCHEDULE
# sudo service cron reload , sudo service cron restart
# cron helper app here -> https://cron.help/#*/5_9-17_*_*_1-5
DOTNET_ROOT=/opt/dotnet
*/15 6-16 * * 1-5 /opt/MarketData/MarketData/mk LOADHEADLINESWATCHLIST /WATCHLIST:Valuations 2>&1 | logger -t headlines
*/5 5-16 * * 1-5 /opt/MarketData/MarketData/mk LOADPREMARKETDATA 2>&1 | logger -t premarket
*/5 9-16 * * 1-5 /opt/MarketData/MarketData/mk UPDATELATESTPRICEOPENPOSITIONS 2>&1 | logger -t priceopenpositions
*/5 9-16 * * 1-5 /opt/MarketData/MarketData/mk UPDATELATESTPRICEWATCHLIST /WATCHLIST:Valuations 2>&1 | logger -t pricewatchlist
*/30 9-16 * * 1-5 /opt/MarketData/MarketData/mk UPDATELATESTANALYSTRATINGS 2>&1 | logger -t analystratings
0 19 * * 1-5 /opt/MarketData/MarketData/mk UPDATEDAILY2 /DATE:$(date -d"-0 days" +\%m-\%d-\%Y) 2>&1 | logger -t updatedaily2