Update comments

This commit is contained in:
2025-11-06 08:14:53 -05:00
parent 93b6c62d0a
commit 95d60aa9d1

View File

@@ -173,115 +173,120 @@ namespace MarketData.Helper
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("MarketData.GetPremarketData: Done, took {0}(ms)", profiler.End()));
}
}
// ******************************************************************************************************************************************************************************
// ************************************************************************** Z A C K S E A R N I N G S A N N O U N C E M E N T S *******************************************
// ******************************************************************************************************************************************************************************
public static EarningsAnnouncements GetEarningsAnnouncements(String symbol)
{
Profiler profiler = new Profiler();
HttpNetResponse httpNetResponse=null;
EarningsAnnouncements earningsAnnouncements=new EarningsAnnouncements();
MemoryStream memoryStream=null;
try
// ******************************************************************************************************************************************************************************
// ************************************************************************** Z A C K S E A R N I N G S A N N O U N C E M E N T S *******************************************
// ******************************************************************************************************************************************************************************
/// <summary>
/// This retrieves earnings announcements from Zacks Research and is used during the nighyly process.
/// </summary>
/// <param name="symbol"></param>
/// <returns></returns>
public static EarningsAnnouncements GetEarningsAnnouncements(String symbol)
{
StringBuilder sb=new StringBuilder();
sb.Append("https://www.zacks.com/stock/research/").Append(symbol).Append("/earnings-announcements");
String strRequest=sb.ToString();
httpNetResponse=HttpNetRequest.GetRequestNoEncodingV4(strRequest);
if(!httpNetResponse.Success)
Profiler profiler = new Profiler();
HttpNetResponse httpNetResponse = null;
EarningsAnnouncements earningsAnnouncements = new EarningsAnnouncements();
MemoryStream memoryStream = null;
try
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Request:{0} failed with status {1}",httpNetResponse.Request,httpNetResponse.StatusCode));
return null;
}
String responseString=httpNetResponse.ResponseString;
// get next earnings date
byte[] streamBytes = Encoding.ASCII.GetBytes(httpNetResponse.ResponseString);
memoryStream = new MemoryStream(streamBytes);
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.Load(memoryStream);
HtmlNodeCollection table = htmlDocument.DocumentNode.SelectNodes("//*[@class=\"key-expected-earnings-data-module\"]");
if (null != table && 0 != table.Count)
{
HtmlNodeCollection rows = table[0].SelectNodes(".//tr");
String[] requiredElements={"Report Date","Period Ending","Zacks Consensus Estimate","Earnings ESP"};
if(2==rows.Count)
StringBuilder sb = new StringBuilder();
sb.Append("https://www.zacks.com/stock/research/").Append(symbol).Append("/earnings-announcements");
String strRequest = sb.ToString();
httpNetResponse = HttpNetRequest.GetRequestNoEncodingV4(strRequest);
if (!httpNetResponse.Success)
{
HtmlNodeCollection headerColumns = rows[0].SelectNodes(".//th");
if (null!=headerColumns && 0!=headerColumns.Count && HeaderContains(headerColumns,requiredElements))
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("Request:{0} failed with status {1}", httpNetResponse.Request, httpNetResponse.StatusCode));
return null;
}
String responseString = httpNetResponse.ResponseString;
// get next earnings date
byte[] streamBytes = Encoding.ASCII.GetBytes(httpNetResponse.ResponseString);
memoryStream = new MemoryStream(streamBytes);
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.Load(memoryStream);
HtmlNodeCollection table = htmlDocument.DocumentNode.SelectNodes("//*[@class=\"key-expected-earnings-data-module\"]");
if (null != table && 0 != table.Count)
{
HtmlNodeCollection rows = table[0].SelectNodes(".//tr");
String[] requiredElements = { "Report Date", "Period Ending", "Zacks Consensus Estimate", "Earnings ESP" };
if (2 == rows.Count)
{
HtmlNodeCollection dataColumns = rows[1].ChildNodes;
String[] reportElements=dataColumns[1].InnerText.Split(' ');
String reportDate=reportElements[0];
if(!"NA".Equals(reportDate))
HtmlNodeCollection headerColumns = rows[0].SelectNodes(".//th");
if (null != headerColumns && 0 != headerColumns.Count && HeaderContains(headerColumns, requiredElements))
{
String[] formats=new[] {"MM/yyyy","M/yyyy"};
String periodEnding=dataColumns[3].InnerText;
EarningsAnnouncement earningsAnnouncement=new EarningsAnnouncement();
earningsAnnouncement.Symbol=symbol;
earningsAnnouncement.Date=Utility.ParseDate(reportDate);
earningsAnnouncement.PeriodEnding=DateTime.ParseExact(periodEnding, formats, new System.Globalization.CultureInfo("en-US"),DateTimeStyles.AssumeLocal);
if(reportElements[1].Equals("(AMC)"))earningsAnnouncement.Time="After Close";
else if(reportElements[1].Equals("(NONE)"))earningsAnnouncement.Time="Before Open";
else earningsAnnouncement.Time=reportElements[1];
earningsAnnouncements.Add(earningsAnnouncement);
HtmlNodeCollection dataColumns = rows[1].ChildNodes;
String[] reportElements = dataColumns[1].InnerText.Split(' ');
String reportDate = reportElements[0];
if (!"NA".Equals(reportDate))
{
String[] formats = new[] { "MM/yyyy", "M/yyyy" };
String periodEnding = dataColumns[3].InnerText;
EarningsAnnouncement earningsAnnouncement = new EarningsAnnouncement();
earningsAnnouncement.Symbol = symbol;
earningsAnnouncement.Date = Utility.ParseDate(reportDate);
earningsAnnouncement.PeriodEnding = DateTime.ParseExact(periodEnding, formats, new System.Globalization.CultureInfo("en-US"), DateTimeStyles.AssumeLocal);
if (reportElements[1].Equals("(AMC)")) earningsAnnouncement.Time = "After Close";
else if (reportElements[1].Equals("(NONE)")) earningsAnnouncement.Time = "Before Open";
else earningsAnnouncement.Time = reportElements[1];
earningsAnnouncements.Add(earningsAnnouncement);
}
}
}
}
}
// get historical
responseString=Utility.KeepAfter(responseString,"earnings_announcements_earnings_table");
if(null==responseString)return null;
responseString=Utility.KeepBefore(responseString,"] ]");
if(null==responseString)return null;
responseString=responseString+"]";
responseString=Utility.KeepAfter(responseString,"[ [");
if(null==responseString)return null;
responseString="["+responseString;
responseString=Utility.RemoveDivs(responseString);
if(null==responseString)return null;
String[] items=responseString.Split(']');
for(int index=0;index<items.Length;index++)
{
EarningsAnnouncement earningsAnnouncement=new EarningsAnnouncement();
String itemText=items[index];
if(null==itemText||0==itemText.Length)continue;
itemText=Utility.BetweenString(itemText,"[",null);
itemText=itemText.Replace("\"",null);
String[] columnData=itemText.Split(',');
for(int columnIndex=0;columnIndex<columnData.Length;columnIndex++)columnData[columnIndex]=columnData[columnIndex].Trim();
if(null==columnData||7!=columnData.Length)continue;
earningsAnnouncement.Symbol=symbol;
earningsAnnouncement.Date=Utility.ParseDate(columnData[0]);
String[] periodEndingItems=columnData[1].Split('/');
if(null!=periodEndingItems&&2==periodEndingItems.Length)
// get historical
responseString = Utility.KeepAfter(responseString, "earnings_announcements_earnings_table");
if (null == responseString) return null;
responseString = Utility.KeepBefore(responseString, "] ]");
if (null == responseString) return null;
responseString = responseString + "]";
responseString = Utility.KeepAfter(responseString, "[ [");
if (null == responseString) return null;
responseString = "[" + responseString;
responseString = Utility.RemoveDivs(responseString);
if (null == responseString) return null;
String[] items = responseString.Split(']');
for (int index = 0; index < items.Length; index++)
{
int month=(int)FeedParser.ParseValueLong(periodEndingItems[0]);
int year=(int)FeedParser.ParseValueLong(periodEndingItems[1]);
earningsAnnouncement.PeriodEnding=new DateTime(year,month,DateTime.DaysInMonth(year,month));
EarningsAnnouncement earningsAnnouncement = new EarningsAnnouncement();
String itemText = items[index];
if (null == itemText || 0 == itemText.Length) continue;
itemText = Utility.BetweenString(itemText, "[", null);
itemText = itemText.Replace("\"", null);
String[] columnData = itemText.Split(',');
for (int columnIndex = 0; columnIndex < columnData.Length; columnIndex++) columnData[columnIndex] = columnData[columnIndex].Trim();
if (null == columnData || 7 != columnData.Length) continue;
earningsAnnouncement.Symbol = symbol;
earningsAnnouncement.Date = Utility.ParseDate(columnData[0]);
String[] periodEndingItems = columnData[1].Split('/');
if (null != periodEndingItems && 2 == periodEndingItems.Length)
{
int month = (int)FeedParser.ParseValueLong(periodEndingItems[0]);
int year = (int)FeedParser.ParseValueLong(periodEndingItems[1]);
earningsAnnouncement.PeriodEnding = new DateTime(year, month, DateTime.DaysInMonth(year, month));
}
earningsAnnouncement.Estimate = FeedParser.ParseValue(columnData[2]);
earningsAnnouncement.Reported = FeedParser.ParseValue(columnData[3]);
earningsAnnouncement.Surprise = FeedParser.ParseValue(columnData[4]);
earningsAnnouncement.SurprisePct = FeedParser.ParseValue(columnData[5]);
earningsAnnouncement.Time = columnData[6];
earningsAnnouncements.Add(earningsAnnouncement);
}
earningsAnnouncement.Estimate=FeedParser.ParseValue(columnData[2]);
earningsAnnouncement.Reported=FeedParser.ParseValue(columnData[3]);
earningsAnnouncement.Surprise=FeedParser.ParseValue(columnData[4]);
earningsAnnouncement.SurprisePct=FeedParser.ParseValue(columnData[5]);
earningsAnnouncement.Time=columnData[6];
earningsAnnouncements.Add(earningsAnnouncement);
return earningsAnnouncements;
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG, exception);
return null;
}
finally
{
if (null != httpNetResponse) httpNetResponse.Dispose();
if (null != memoryStream) memoryStream.Dispose();
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("MarketData.GetEarningsAnnouncements: Done, took {0}(ms)", profiler.End()));
}
return earningsAnnouncements;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if(null!=httpNetResponse)httpNetResponse.Dispose();
if(null!=memoryStream)memoryStream.Dispose();
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("MarketData.GetEarningsAnnouncements: Done, took {0}(ms)", profiler.End()));
}
}
// ******************************************************************************************************************************************************************************
// ************************************************************************** Z A C K S R A N K ******************************************************************************
// ******************************************************************************************************************************************************************************