//+------------------------------------------------------------------+
//|                                                     newsread.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
string news[][9];
int dates[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   int file_handle=FileOpen("news.csv",FILE_CSV|FILE_READ|FILE_COMMON|FILE_ANSI);
   ushort comma = StringGetCharacter(",",0);
   if(file_handle!=INVALID_HANDLE)
     {

      while(!FileIsEnding(file_handle))
        {
         string line = FileReadString(file_handle);
         StringReplace(line, "\"","");
         //Print(line);
         string res[];
         StringSplit(line, comma, res);
         if(res[2] != "USD" && res[2] != "EUR")
            continue;
            
         int sz = ArrayRange(news,0);
         ArrayResize(news,sz+1);
         ArrayResize(dates,sz+1);
         news[sz][0] = res[0]+ " " + res[1];
         dates[sz] = (int)(datetime)news[sz][0];
         for(int i=1; i<9; i++)
            news[sz][i]=res[i+1];
         //Print(news[sz][0]);
         //Print(dates[sz]);
        }
      Print(ArrayRange(news,1));
      //--- close the file
      FileClose(file_handle);
     }
   else
      PrintFormat("Failed to open file " + (string)GetLastError());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int date_id = ArrayBsearch(dates,(int)TimeCurrent());
   if(dates[date_id]>(int)TimeCurrent())
      date_id--;

   int seconds_after_H_news = 0;
   int seconds_after_M_news = 0;
   int seconds_after_L_news = 0;
   int seconds_before_H_news = 0;
   int seconds_before_M_news = 0;
   int seconds_before_L_news = 0;

   string latest_H_news ="";
   string latest_M_news ="";
   string latest_L_news ="";
   string next_H_news ="";
   string next_M_news ="";
   string next_L_news ="";

   for(int i=0; i<date_id; i++)
     {
      string prio = news[date_id-i][2];
      int newsdate = dates[date_id-i];
      if(prio=="H" && seconds_after_H_news==0)
        {
         seconds_after_H_news = (int)(TimeCurrent()-newsdate);
         latest_H_news = news[date_id-i][3];
        }
      if(prio=="M" && seconds_after_M_news==0)
        {
         seconds_after_M_news = (int)(TimeCurrent()-newsdate);
         latest_M_news = news[date_id-i][3];
        }
      if(prio=="L" && seconds_after_L_news==0)
        {
         seconds_after_L_news = (int)(TimeCurrent()-newsdate);
         latest_L_news = news[date_id-i][3];
        }
        
        if(seconds_after_H_news!=0&&seconds_after_M_news!=0&&seconds_after_L_news!=0)
         break;
     }
   for(int i=0; i<ArraySize(dates)-date_id; i++)
     {
      string prio = news[date_id+i][2];
      int newsdate = dates[date_id+i];
      if(newsdate<(int)TimeCurrent())
         continue;
      if(prio=="H" && seconds_before_H_news==0)
        {
         seconds_before_H_news = (int)(newsdate-TimeCurrent());
         next_H_news = news[date_id+i][3];
        }
      if(prio=="M" && seconds_before_M_news==0)
        {
         seconds_before_M_news = (int)(newsdate-TimeCurrent());
         next_M_news = news[date_id+i][3];
        }
      if(prio=="L" && seconds_before_L_news==0)
        {
         seconds_before_L_news = (int)(newsdate-TimeCurrent());
         next_L_news = news[date_id+i][3];
        }
        
        if(seconds_before_H_news!=0&&seconds_before_M_news!=0&&seconds_before_L_news!=0)
         break;
     }


   string txt ="";
   txt += "\n" + "Latest high news was " + (string)seconds_after_H_news + " seconds ago " + "(" + latest_H_news + ")";
   txt += "\n" + "Latest medium news was " + (string)seconds_after_M_news + " seconds ago " + "(" + latest_M_news + ")";
   txt += "\n" + "Latest low news was " + (string)seconds_after_L_news + " seconds ago " + "(" + latest_L_news + ")";
   txt += "\n";
   txt += "\n" + "Next high news coming in " + (string)seconds_before_H_news + " seconds " + "(" + next_H_news + ")";
   txt += "\n" + "Next medium news coming in " + (string)seconds_before_M_news + " seconds " + "(" + next_M_news + ")";
   txt += "\n" + "Next low news coming in " + (string)seconds_before_L_news + " seconds " + "(" + next_L_news + ")";
   Comment(txt);
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
