Automatically fetch news for the new day after midnight

This commit is contained in:
moshferatu 2024-05-16 19:06:48 -07:00
parent 899bcc0bf7
commit 8eb8f40541

View File

@ -40,10 +40,8 @@ namespace NinjaTrader.NinjaScript.Indicators
public class News : Indicator public class News : Indicator
{ {
// TODO: Date should be determined programatically.
private string newsUrl = "https://www.forexfactory.com/calendar?day=" + DateTime.Now.ToString("MMMdd.yyyy").ToLower();
private List<NewsEvent> newsEvents = new List<NewsEvent>(); private List<NewsEvent> newsEvents = new List<NewsEvent>();
private DateTime currentDate = DateTime.Now.Date;
protected override void OnStateChange() protected override void OnStateChange()
{ {
@ -79,9 +77,12 @@ namespace NinjaTrader.NinjaScript.Indicators
{ {
try try
{ {
newsEvents.Clear();
HttpClient client = new HttpClient(); HttpClient client = new HttpClient();
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
string newsUrl = "https://www.forexfactory.com/calendar?day=" + DateTime.Now.ToString("MMMdd.yyyy").ToLower();
HttpResponseMessage response = await client.GetAsync(newsUrl); HttpResponseMessage response = await client.GetAsync(newsUrl);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync(); string responseBody = await response.Content.ReadAsStringAsync();
@ -152,14 +153,22 @@ namespace NinjaTrader.NinjaScript.Indicators
// Format the time as "hh:mmtt" (e.g., "06:30am") // Format the time as "hh:mmtt" (e.g., "06:30am")
return userTime.ToString("hh:mmtt").ToLower(); return userTime.ToString("hh:mmtt").ToLower();
} }
catch (Exception ex) catch (Exception)
{ {
Print("Error converting time: " + ex.Message);
return time; // Return original time if conversion fails return time; // Return original time if conversion fails
} }
} }
protected override void OnBarUpdate() { } protected override void OnBarUpdate() {
if (State == State.Realtime)
{
if (DateTime.Now.Date != currentDate)
{
RequestNewsEvents();
currentDate = DateTime.Now.Date;
}
}
}
protected override void OnRender(ChartControl chartControl, ChartScale chartScale) protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{ {
@ -183,7 +192,7 @@ namespace NinjaTrader.NinjaScript.Indicators
headerSize = MeasureString("Event", headerTextFormat); headerSize = MeasureString("Event", headerTextFormat);
maxColWidth = Math.Max(maxColWidth, headerSize.Width); maxColWidth = Math.Max(maxColWidth, headerSize.Width);
foreach (var newsEvent in newsEvents) foreach (var newsEvent in new List<NewsEvent>(newsEvents)) // New list in order to avoid concurrent modification
{ {
var timeSize = MeasureString(newsEvent.Time, eventTextFormat); var timeSize = MeasureString(newsEvent.Time, eventTextFormat);
var currencySize = MeasureString(newsEvent.Currency, eventTextFormat); var currencySize = MeasureString(newsEvent.Currency, eventTextFormat);