Update comments
This commit is contained in:
@@ -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 ******************************************************************************
|
||||
// ******************************************************************************************************************************************************************************
|
||||
|
||||
Reference in New Issue
Block a user