diff --git a/indicators/News.cs b/indicators/News.cs index 3d3d486..397a475 100644 --- a/indicators/News.cs +++ b/indicators/News.cs @@ -1,31 +1,17 @@ #region Using declarations +using NinjaTrader.Gui; +using NinjaTrader.Gui.Chart; +using NinjaTrader.Gui.Tools; +using SharpDX; +using SharpDX.DirectWrite; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Input; +using System.Net.Http; +using System.Text.RegularExpressions; using System.Windows.Media; using System.Xml.Serialization; -using NinjaTrader.Cbi; -using NinjaTrader.Gui; -using NinjaTrader.Gui.Chart; -using NinjaTrader.Gui.SuperDom; -using NinjaTrader.Gui.Tools; -using NinjaTrader.Data; -using NinjaTrader.NinjaScript; -using NinjaTrader.Core.FloatingPoint; -using NinjaTrader.NinjaScript.DrawingTools; -using System.Net.Http; -using SharpDX.DirectWrite; -using SharpDX; -using System.Xml.Linq; -using System.Xml; -using System.Text.RegularExpressions; -using System.Windows.Markup; #endregion //This namespace holds Indicators in this folder and is required. Do not change it. @@ -82,11 +68,11 @@ namespace NinjaTrader.NinjaScript.Indicators HttpClient client = new HttpClient(); 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(); + string newsUrl = "https://nfs.faireconomy.media/ff_calendar_thisweek.json"; HttpResponseMessage response = await client.GetAsync(newsUrl); response.EnsureSuccessStatusCode(); - string responseBody = await response.Content.ReadAsStringAsync(); + string responseBody = await response.Content.ReadAsStringAsync(); ParseNewsEvents(responseBody); ForceRefresh(); @@ -97,41 +83,27 @@ namespace NinjaTrader.NinjaScript.Indicators } } - private void ParseNewsEvents(string html) + private void ParseNewsEvents(string json) { try - { - // Regex to match the rows with class "calendar__row" - var rowRegex = new Regex(@"]*class=""[^""]*calendar__row[^""]*""[^>]*>(.*?)", RegexOptions.Singleline); + { + var events = Regex.Matches(json, @"\{[^}]*\}"); - // Regex to extract time and title from the row - var timeRegex = new Regex(@"]*class=""[^""]*calendar__time[^""]*""[^>]*>(.*?)", RegexOptions.Singleline); - var currencyRegex = new Regex(@"]*class=""[^""]*calendar__currency[^""]*""[^>]*>(.*?)", RegexOptions.Singleline); - var titleRegex = new Regex(@"]*class=""[^""]*calendar__event-title[^""]*""[^>]*>(.*?)", RegexOptions.Singleline); - - var rowMatches = rowRegex.Matches(html); - foreach (Match rowMatch in rowMatches) + foreach (Match eventMatch in events) { - string rowContent = rowMatch.Groups[1].Value; + string eventString = eventMatch.Value; - var timeMatch = timeRegex.Match(rowContent); - var currencyMatch = currencyRegex.Match(rowContent); - var titleMatch = titleRegex.Match(rowContent); + string date = ExtractJsonValue(eventString, "date"); + string currency = ExtractJsonValue(eventString, "country"); + string title = ExtractJsonValue(eventString, "title"); - if (timeMatch.Success && titleMatch.Success) - { - string time = timeMatch.Groups[1].Value.Trim(); - string currency = currencyMatch.Groups[1].Value.Trim(); - string title = titleMatch.Groups[1].Value.Trim(); + DateTime eventTime = DateTime.Parse(date); + if (eventTime.Date != currentDate) + continue; - // Remove any extraneous HTML tags from the time string - time = Regex.Replace(time, "<.*?>", string.Empty); + string time = eventTime.ToString("hh:mmtt").ToLower(); - // Convert the time to the user's time zone - time = ConvertToUserTimeZone(time); - - newsEvents.Add(new NewsEvent { Time = time, Currency = currency, Title = title }); - } + newsEvents.Add(new NewsEvent { Time = time, Currency = currency, Title = title }); } } catch (Exception ex) @@ -140,23 +112,11 @@ namespace NinjaTrader.NinjaScript.Indicators } } - private string ConvertToUserTimeZone(string time) + private string ExtractJsonValue(string json, string key) { - try - { - // Assumed to be in US Eastern Time - DateTime easternTime = DateTime.ParseExact(time, "h:mmtt", System.Globalization.CultureInfo.InvariantCulture); - TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); - - DateTime userTime = TimeZoneInfo.ConvertTime(easternTime, easternTimeZone, Core.Globals.GeneralOptions.TimeZoneInfo); - - // Format the time as "hh:mmtt" (e.g., "06:30am") - return userTime.ToString("hh:mmtt").ToLower(); - } - catch (Exception) - { - return time; // Return original time if conversion fails - } + string pattern = $"\"{key}\":\"(.*?)\""; + Match match = Regex.Match(json, pattern); + return match.Success ? match.Groups[1].Value : string.Empty; } protected override void OnBarUpdate() {