Fixing News Filter EA

 

Hello, Currently i am coding a news filter EA and having some errors.


#import "urlmon.dll"
int URLDownloadToFileW(int pCaller,string szURL,string szFileName,int dwReserved,int Callback);
#import

#define INAME     "FFCPing"+_Symbol
#define TITLE  0
#define COUNTRY 1
#define DATE  2
#define TIME  3
#define IMPACT  4
#define FORECAST 5
#define PREVIOUS 6

input string           NewsFilter="***NEWS FILTER***";              //******** NEWS FILTER ******
input   int  ReCheckMinutes           = 120;                        //. Minutes to re-check calendar
input bool news_High                  =true;                        //. Use High News Filter
input bool News_High_Line             =true;                        //. Use High news line (Red Line)
input int minBefore                    =720;                         //. Minutes Before High impact News
input int minAfter                     =360;                         //. Minutes After High impact News
input bool news_Medium                =false;                        //. Use Medium News Filter
input bool News_Medium_Line           =false;                        //. Use Medium news line (Orange Line)
input int minBefore1                    =60;                          //. Minutes Before Medium impact News
input int minAfter1                     =60;                          //. Minutes After Medium impact News
input bool news_Low                   =false;                        //. Use Low News Filter
input bool News_Low_Line              =false;                        //. Use Low news line (Yellow Line)
input int minBefore2                    =30;                          //. Minutes Before Low impact News
input int minAfter2                     =30;                          //. Minutes After Low impact News

string News_Trade_Status = "Undefined";
string NewsURLChecking = "Undefined";
string XMLUpdateTime;
string XMLReadTime;
string XMLDownloadTime;

int OnInit()
  {

//--- get today time
   TimeOfDay=(int)TimeLocal()%86400;
   Midnight=TimeLocal()-TimeOfDay;
//--- set xml file name ffcal_week_this (fixed name)
   xmlFileName=INAME+"-ffcal_week_this.xml";
//--- checks the existence of the file.
   if(!FileIsExist(xmlFileName))
     {
      xmlDownload();
      xmlRead();
      Print("XML File downloaded and Reading");
     }
//--- else just read it
   else
     {
      xmlRead();
      Print("XML File Reading");
     }
//--- get last modification time
   xmlModifed=(datetime)FileGetInteger(xmlFileName,FILE_MODIFY_DATE,false);
//--- check for updates     
     if(FileIsExist(xmlFileName))
     {
      if(xmlModifed<TimeLocal()-(ReCheckMinutes * 60))
        {
         Print(INAME+": xml file is out of date - Updating New");
         xmlUpdate();
        }
      //--- set timer to update old xml file every x hours

      EventSetTimer(ReCheckMinutes * 60);
     }

   assignVal=true;
  return(INIT_SUCCEEDED);
}

int deinit()
  {
   ObjectsDeleteAll(0,"h_",-1,-1);
   ObjectsDeleteAll(0,"Tr_",-1,-1);
   return (0);
  }

Void OnTick()
  {
icomment();
if(!isNewsPause(_Symbol,0))
     {
      News_Trade_Status = "Active";
     }
   else
     {
      News_Trade_Status = "Paused";
     }
}


void OnTimer()
  {

   assignVal=true;
   Print(INAME+": xml file is out of date");
   xmlUpdate();

  }

//+------------------------------------------------------------------+
//| Create the Verticle line                                         |
//+------------------------------------------------------------------+
bool VLineCreate(const long            chart_ID=0,        // chart's ID
                 const string          name="VLine",      // line name
                 const int             sub_window=0,      // subwindow index
                 datetime              time=0,            // line time
                 const color           clr=clrBlue,        // line color
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // line style
                 const int             width=1,           // line width
                 const bool            back=false,        // in the background
                 const bool            selection=false,   // highlight to move
                 const bool            hidden=true,       // hidden in the object list
                 const long            z_order=0)         // priority for mouse click
  {
//--- create a vertical line
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
     {

      return(false);
     }
//--- set line color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set line display style
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set line width
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of moving the line by mouse
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }

void xmlDownload()
  {
   Sleep(3000);
//---
   ResetLastError();
   
   string cookie=NULL, headers;
   string reqheaders="User-Agent: Mozilla/4.0\r\n";
   char post[],result[];
   int res;
   string url="http://nfs.faireconomy.media/ff_calendar_thisweek.xml";
   ResetLastError();
   int timeout=5000;
   res=WebRequest("GET",url,reqheaders,timeout,post,result,headers);
   if(res==-1)
     {
      Print("Error in WebRequest. Error code  =",GetLastError());
      //--- Perhaps the URL is not listed, display a message about the necessity to add the address
      MessageBox("Add the address '"+url+"' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
      NewsURLChecking = "Not Added";
     }
   else
     {
      //--- Load successfully
      NewsURLChecking = "Added";
      XMLDownloadTime = TimeToString(TimeLocal());
      PrintFormat("The file has been successfully loaded, File size =%d bytes.",ArraySize(result));
      //--- Save the data to a file
      int filehandle=FileOpen(xmlFileName,FILE_WRITE|FILE_BIN);
      //--- Checking errors
      if(filehandle!=INVALID_HANDLE)
        {
         //--- Save the contents of the result[] array to a file
         FileWriteArray(filehandle,result,0,ArraySize(result));
         //--- Close the file
         FileClose(filehandle);
        }
      else
         Print("Error in FileOpen. Error code=",GetLastError());
     }
//---
  }
//+------------------------------------------------------------------+
//| Read the XML file                                                |
//+------------------------------------------------------------------+
void xmlRead()
  {
//---
   ResetLastError();
   sData="";
   ulong pos[];
   int   size_;
   Print("Reading file");
   int FileHandle=FileOpen(xmlFileName,FILE_READ|FILE_BIN|FILE_ANSI);
   if(FileHandle!=INVALID_HANDLE)
     {
      //--- receive the file size
      ulong size=FileSize(FileHandle);
      //--- read data from the file
      while(!FileIsEnding(FileHandle))
         sData=FileReadString(FileHandle,(int)size);
      //--- close
      FileClose(FileHandle);
     }
//--- check for errors
   else
      PrintFormat(INAME+": failed to open %s file, Error code = %d",xmlFileName,GetLastError());
   Print("Done.");
   XMLReadTime = TimeToString(TimeLocal());
//---
  }

//+------------------------------------------------------------------+
//| Check for update XML                                             |
//+------------------------------------------------------------------+
void xmlUpdate()
  {
   Sleep(3000);
//--- do not download on saturday
   if(TimeDayOfWeek(Midnight)==6)
      return;
   else
     {
      Print(INAME+": check for updates...");
      Print(INAME+": delete old file");
      FileDelete(xmlFileName);
      xmlDownload();
      xmlRead();
      xmlModifed=(datetime)FileGetInteger(xmlFileName,FILE_MODIFY_DATE,false);
      PrintFormat(INAME+": updated successfully! last modified: %s",(string)xmlModifed);
      XMLUpdateTime = TimeToString(TimeLocal());
     }
//---
  }

//+------------------------------------------------------------------+
//| Converts ff time & date into yyyy.mm.dd hh:mm - by deVries       |
//+------------------------------------------------------------------+
string MakeDateTime(string strDate,string strTime)
  {
//---
   int n1stDash=StringFind(strDate, "-");
   int n2ndDash=StringFind(strDate, "-", n1stDash+1);

   string strMonth=StringSubstr(strDate,0,2);
   string strDay=StringSubstr(strDate,3,2);
   string strYear=StringSubstr(strDate,6,4);

   string tempStr[];
   StringSplit(strTime,StringGetCharacter(":",0),tempStr);
   int nTimeColonPos=StringFind(strTime,":");
   string strHour=tempStr[0];
   string strMinute=StringSubstr(tempStr[1],0,2);
   string strAM_PM=StringSubstr(tempStr[1],2,2);

   int nHour24=StringToInteger(strHour);
   if((strAM_PM=="pm" || strAM_PM=="PM") && nHour24!=12)
      nHour24+=12;
   if((strAM_PM=="am" || strAM_PM=="AM") && nHour24==12)
      nHour24=0;
   string strHourPad="";
   if(nHour24<10)
      strHourPad="0";
   return((strYear+"."+strMonth+"."+strDay+" "+strHourPad+nHour24+":"+strMinute));
//---
  }

//+------------------------------------------------------------------+
//| Convert day of the week to text                                  |
//+------------------------------------------------------------------+
string DayToStr(datetime time)
  {
   int ThisDay=TimeDayOfWeek(time);
   string day="";
   switch(ThisDay)
     {
      case 0:
         day="Sun";
         break;
      case 1:
         day="Mon";
         break;
      case 2:
         day="Tue";
         break;
      case 3:
         day="Wed";
         break;
      case 4:
         day="Thu";
         break;
      case 5:
         day="Fri";
         break;
      case 6:
         day="Sat";
         break;
     }
   return(day);
  }
//+------------------------------------------------------------------+
//| Convert months to text                                           |
//+------------------------------------------------------------------+
string MonthToStr()
  {
   int ThisMonth=Month();
   string month="";
   switch(ThisMonth)
     {
      case 1:
         month="Jan";
         break;
      case 2:
         month="Feb";
         break;
      case 3:
         month="Mar";
         break;
      case 4:
         month="Apr";
         break;
      case 5:
         month="May";
         break;
      case 6:
         month="Jun";
         break;
      case 7:
         month="Jul";
         break;
      case 8:
         month="Aug";
         break;
      case 9:
         month="Sep";
         break;
      case 10:
         month="Oct";
         break;
      case 11:
         month="Nov";
         break;
      case 12:
         month="Dec";
         break;
     }
   return(month);
  }

string nextNews="...";
int total=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int UpcomingNewsImpact(string symb,int n)
  {
   nextNews="...";
   string MainSymbol=StringSubstr(symb,0,3);
   string SecondSymbol=StringSubstr(symb,3,3);
//---
   if(assignVal)
     {
      //--- BY AUTHORS WITH SOME MODIFICATIONS
      //--- define the XML Tags, Vars
      string sTags[7]= {"<title>","<country>","<date><![CDATA[","<time><![CDATA[","<impact><![CDATA[","<forecast><![CDATA[","<previous><![CDATA["};
      string eTags[7]= {"</title>","</country>","]]></date>","]]></time>","]]></impact>","]]></forecast>","]]></previous>"};
      int index=0;
      int next=-1;
      int BoEvent=0,begin=0,end=0;
      string myEvent="";
      //--- Minutes calculation
      datetime EventTime=0;
      int EventMinute=0;
      //--- split the currencies into the two parts

      //--- loop to get the data from xml tags
      while(true)
        {
         BoEvent=StringFind(sData,"<event>",BoEvent);
         if(BoEvent==-1)
            break;
         BoEvent+=7;
         next=StringFind(sData,"</event>",BoEvent);
         if(next == -1)
            break;
         myEvent = StringSubstr(sData,BoEvent,next-BoEvent);
         BoEvent = next;
         begin=0;
         for(int i=0; i<7; i++)
           {
            Event[index][i]="";
            next=StringFind(myEvent,sTags[i],begin);
            //--- Within this event, if tag not found, then it must be missing; skip it
            if(next==-1)
               continue;
            else
              {
               //--- We must have found the sTag okay...
               //--- Advance past the start tag
               begin=next+StringLen(sTags[i]);
               end=StringFind(myEvent,eTags[i],begin);
               //---Find start of end tag and Get data between start and end tag
               if(end>begin && end!=-1)
                  Event[index][i]=StringSubstr(myEvent,begin,end-begin);
              }
           }
         //--- filters that define whether we want to skip this particular currencies or events

         //if(!IsCurrency(Event[index][COUNTRY]))
         //continue;
         /*if(importance!=0 && Event[index][IMPACT]=="High")
            continue;
         if(importance!=1 && Event[index][IMPACT]=="Medium")
            continue;
         if(importance!=2 && Event[index][IMPACT]=="Low")
            continue;
         if(!IncludeSpeaks && StringFind(Event[index][TITLE],"Speaks")!=-1)
            continue;
         if(!IncludeHolidays && Event[index][IMPACT]=="Holiday")
            continue;*/
         if(Event[index][TIME]=="Tentative" ||
            Event[index][TIME]=="")
            continue;

         //--- sometimes they forget to remove the tags :)
         if(StringFind(Event[index][TITLE],"<![CDATA[")!=-1)
            StringReplace(Event[index][TITLE],"<![CDATA[","");
         if(StringFind(Event[index][TITLE],"]]>")!=-1)
            StringReplace(Event[index][TITLE],"]]>","");
         if(StringFind(Event[index][TITLE],"]]>")!=-1)
            StringReplace(Event[index][TITLE],"]]>","");
         //---
         if(StringFind(Event[index][FORECAST],"&lt;")!=-1)
            StringReplace(Event[index][FORECAST],"&lt;","");
         if(StringFind(Event[index][PREVIOUS],"&lt;")!=-1)
            StringReplace(Event[index][PREVIOUS],"&lt;","");

         //--- set some values (dashes) if empty
         if(Event[index][FORECAST]=="")
            Event[index][FORECAST]="---";
         if(Event[index][PREVIOUS]=="")
            Event[index][PREVIOUS]="---";
         //--- Convert Event time to MT4 time
         string evD=MakeDateTime(Event[index][DATE],Event[index][TIME]);
         EventTime=datetime(evD);
         index++;
        }
      //--- loop to set arrays/buffers that uses to draw objects and alert
      for(int ii=0; ii<index; ii++)
        {
         if(Event[index][TIME]=="All Day" && Event[ii][IMPACT]=="Holiday" && (MainSymbol==Event[ii][COUNTRY] || SecondSymbol==Event[ii][COUNTRY]))
            return 1;
         eTitle[i][n]    = Event[ii][TITLE];
         eCountry[ii][n]  = Event[ii][COUNTRY];
         eImpact[ii][n]   = Event[ii][IMPACT];
         eTime[ii][n]     = datetime(MakeDateTime(Event[ii][DATE],Event[ii][TIME]))-TimeGMTOffset();
         //Print(eTitle[i]);
        }
      total=index;
     }


   datetime tn=TimeCurrent();
   for(int qi=0; qi<total; qi++)
     {
      if(MainSymbol!=eCountry[qi][n] && SecondSymbol!=eCountry[qi][n])
         continue;
      if(news_High && (eImpact[qi][n]=="High"))
        {
         if(News_High_Line) {
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrRed,STYLE_SOLID);
            TextCreate(0,"Text"+eTitle[i][n],0,eTime[qi][n],0,eTitle[i][n],clrRed);
            }
        }
      if(news_Medium && (eImpact[qi][n]=="Medium"))
        {
         if(News_Medium_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrOrange,STYLE_SOLID);
        }
      if(news_Low && (eImpact[qi][n]=="Low"))
        {
         if(News_Low_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrYellow,STYLE_SOLID);
        }

      if(news_High && (eImpact[qi][n]=="High") && eTime[qi][n]<(tn+minAfter*60) && eTime[qi][n]>(tn-minBefore*60))
        {
         return 1;
         if(News_High_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrRed,STYLE_SOLID);
        }
      if(news_Medium && (eImpact[qi][n]=="Medium") && eTime[qi][n]<(tn+minAfter1*60) && eTime[qi][n]>(tn-minBefore1*60))
        {
         return 1;
         if(News_Medium_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrOrange,STYLE_SOLID);
        }
      if(news_Low && (eImpact[i][n]=="Low") && eTime[i][n]<(tn+minAfter2*60) && eTime[qi][n]>(tn-minBefore2*60))
        {
         return 1;
         if(News_Low_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrYellow,STYLE_SOLID);
        }
     }
   return(-1);
  }
//+------------------------------------------------------------------+
//|                     NEWS Values                                          |
//+------------------------------------------------------------------+
bool isNewsPause(string Symb,int n)
  {
   bool res=false;
   res=(UpcomingNewsImpact(Symb,n)==1);
   return res;
  }
void icomment() {
string CommentPartOne = " ---------------------------------------------"
                 
                 "\n ------------------------------------------------"
                 "\n :: News Status            : " + News_Trade_Status +
                 "\n :: nfs.faireconomy.media  : " + NewsURLChecking +
                 "\n :: Last News Downloaded   : " + XMLDownloadTime + 
                 "\n :: Last News Checked      : " + XMLReadTime + 
                 "\n :: Last News Updated      : " + XMLUpdateTime + 
                 "\n ------------------------------------------------",
Comment(CommentPartOne); }


Errors :


  1. The function !isNewsPause(_Symbol, 0) is not functioning properly. It should work like this: X minutes before news and X minutes after news = paused. Sometimes it works, and sometimes it does not.

  2. If I provide values greater than 800 minutes (13 hours) for Min_before or Min_after, all the news lines are automatically disabled, and the news filter does not function.

  3. These vertical lines indicate news and display the time label of the news below. I am trying to create a new similar label above, which shows the news title (e.g., FOMC, NFP, etc.). Refer to the example screenshot.



 

Forum on trading, automated trading systems and testing trading strategies

"News Filter EA not working"

anuj71, 2024.01.22 14:42

Hello,

I have created a news filter EA which fetch the news from Forex Factory (http://nfs.faireconomy.media/ff_calendar_thisweek.xml).

The Logic is really simple :

1. X min before the news => News_Trade_Status = "Paused"

2. X min after the news => News_Trade_Status = " Paused"

3. If above both condition failed => News_Trade_Status = " Active"

But unfortunately, even trying to fix this for a week, it not working. It not correctly setting the values to News_Trade_Status and i need a help to understand what mistake i am making in my code. 


#import "urlmon.dll"
int URLDownloadToFileW(int pCaller,string szURL,string szFileName,int dwReserved,int Callback);
#import
 
#define INAME     "FFCPing"+_Symbol
#define TITLE  0
#define COUNTRY 1
#define DATE  2
#define TIME  3
#define IMPACT  4
#define FORECAST 5
#define PREVIOUS 6
 
input string           NewsFilter="***NEWS FILTER***";              //******** NEWS FILTER ******
input   int  ReCheckMinutes           = 120;                          //. Minutes to re-check calendar
input bool news_High                  =true;                        //. Use High News Filter
input bool News_High_Line             =true;                        //. Use High news line (Red Line)
input int minBefore                    =720;                         //. Minutes Before High impact News - Here if i add values like 22 hours (1100 min) or 900min the future events getting disappeared
input int minAfter                     =360;                         //. Minutes After High impact News
input bool news_Medium                =true;                        //. Use Medium News Filter
input bool News_Medium_Line           =true;                        //. Use Medium news line (Orange Line)
input int minBefore1                    =60;                          //. Minutes Before Medium impact News
input int minAfter1                     =60;                          //. Minutes After Medium impact News
input bool news_Low                   =true;                        //. Use Low News Filter
input bool News_Low_Line              =true;                        //. Use Low news line (Yellow Line)
input int minBefore2                    =30;                          //. Minutes Before Low impact News
input int minAfter2                     =30;                          //. Minutes After Low impact News

string xmlFileName;
string sData;
string Event[200][7];
string eTitle[200][200],eCountry[200][200],eImpact[200][200],eForecast[200][200],ePrevious[200][200];
bool assignVal=true;
int eMinutes[10];
datetime eTime[200][200];

datetime xmlModifed;
int TimeOfDay;
datetime Midnight;
bool IsEvent;
 
string News_Trade_Status = "Undefined";
string NewsURLChecking = "Undefined";
string XMLUpdateTime;
string XMLReadTime;
string XMLDownloadTime;
string XMLUpcomingImpact; 
 
int OnInit()
  {
 
//--- get today time
   TimeOfDay=(int)TimeLocal()%86400;
   Midnight=TimeLocal()-TimeOfDay;
//--- set xml file name ffcal_week_this (fixed name)
   xmlFileName=INAME+"-ffcal_week_this.xml";
//--- checks the existence of the file.
   if(!FileIsExist(xmlFileName))
     {
      xmlDownload();
      xmlRead();
      Print("XML File downloaded and Ordered to Read");
     }
//--- else just read it
   else
     {
      xmlRead();
      Print("XML File Ordered to Read");
     }
//--- get last modification time
   xmlModifed=(datetime)FileGetInteger(xmlFileName,FILE_MODIFY_DATE,false);
//--- check for updates     
     if(FileIsExist(xmlFileName))
     {
      if(xmlModifed<TimeLocal()-(ReCheckMinutes * 60))
        {
         Print(INAME+": xml file is out of date - Ordered to Update");
         xmlUpdate();
        }
      //--- set timer to update old xml file every x hours
 
      EventSetTimer(ReCheckMinutes * 60);
     }
 
   assignVal=true;
  return(INIT_SUCCEEDED);
}
 
int deinit()
  {
   ObjectsDeleteAll(0,"h_",-1,-1);
   ObjectsDeleteAll(0,"Tr_",-1,-1);
   return (0);
  }
 
void OnTick()
  {

icomment();

// Setting values to News_Trade_Status 
if(!isNewsPause(_Symbol,0))
     {
      News_Trade_Status = "Active";
      Print("There is No news currently");
     }
   else
     {
      News_Trade_Status = "Paused";
      Print("It News times");
     }
}
 
 
void OnTimer()
  {
 
   assignVal=true;
   Print(INAME+": xml file is out of date");
   xmlUpdate();
 
  }
 
//+------------------------------------------------------------------+
//| Create the Verticle line                                         |
//+------------------------------------------------------------------+
bool VLineCreate(const long            chart_ID=0,        // chart's ID
                 const string          name="VLine",      // line name
                 const int             sub_window=0,      // subwindow index
                 datetime              time=0,            // line time
                 const color           clr=clrBlue,        // line color
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // line style
                 const int             width=1,           // line width
                 const bool            back=false,        // in the background
                 const bool            selection=false,   // highlight to move
                 const bool            hidden=true,       // hidden in the object list
                 const long            z_order=0)         // priority for mouse click
  {
//--- create a vertical line
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
     {
 
      return(false);
     }
//--- set line color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set line display style
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set line width
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of moving the line by mouse
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }
 
void xmlDownload()
  {
   Sleep(3000);
//---
   ResetLastError();
 
   string cookie=NULL, headers;
   string reqheaders="User-Agent: Mozilla/4.0\r\n";
   char post[],result[];
   int res;
   string url="http://nfs.faireconomy.media/ff_calendar_thisweek.xml";
   ResetLastError();
   int timeout=5000;
   res=WebRequest("GET",url,reqheaders,timeout,post,result,headers);
   if(res==-1)
     {
      Print("Error in WebRequest. Error code  =",GetLastError());
      //--- Perhaps the URL is not listed, display a message about the necessity to add the address
      MessageBox("Add the address '"+url+"' in the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
      NewsURLChecking = "Not Added";
     }
   else
     {
      //--- Load successfully
      NewsURLChecking = "Added";
      XMLDownloadTime = TimeToString(TimeLocal());
      PrintFormat("The file has been successfully loaded, File size =%d bytes.",ArraySize(result));
      //--- Save the data to a file
      int filehandle=FileOpen(xmlFileName,FILE_WRITE|FILE_BIN);
      //--- Checking errors
      if(filehandle!=INVALID_HANDLE)
        {
         //--- Save the contents of the result[] array to a file
         FileWriteArray(filehandle,result,0,ArraySize(result));
         //--- Close the file
         FileClose(filehandle);
        }
      else
         Print("Error in FileOpen. Error code=",GetLastError());
     }
//---
  }
//+------------------------------------------------------------------+
//| Read the XML file                                                |
//+------------------------------------------------------------------+
void xmlRead()
  {
//---
   ResetLastError();
   sData="";
   ulong pos[];
   Print("Reading XML file");
   int FileHandle=FileOpen(xmlFileName,FILE_READ|FILE_BIN|FILE_ANSI);
   if(FileHandle!=INVALID_HANDLE)
     {
      //--- receive the file size
      ulong size=FileSize(FileHandle);
      //--- read data from the file
      while(!FileIsEnding(FileHandle))
         sData=FileReadString(FileHandle,(int)size);
      //--- close
      FileClose(FileHandle);
     }
//--- check for errors
   else
      PrintFormat(INAME+": failed to open %s file, Error code = %d",xmlFileName,GetLastError());
   Print("XML File Reading Completed.");
   XMLReadTime = TimeToString(TimeLocal());
//---
  }
 
//+------------------------------------------------------------------+
//| Check for update XML                                             |
//+------------------------------------------------------------------+
void xmlUpdate()
  {
   Sleep(3000);
//--- do not download on saturday
   if(TimeDayOfWeek(Midnight)==6)
      return;
   else
     {
      Print(INAME+": check for updates...");
      Print(INAME+": delete old file");
      FileDelete(xmlFileName);
      xmlDownload();
      xmlRead();
      xmlModifed=(datetime)FileGetInteger(xmlFileName,FILE_MODIFY_DATE,false);
      PrintFormat(INAME+": updated successfully! last modified: %s",(string)xmlModifed);
      XMLUpdateTime = TimeToString(TimeLocal());
     }
//---
  }
 
//+------------------------------------------------------------------+
//| Converts ff time & date into yyyy.mm.dd hh:mm - by deVries       |
//+------------------------------------------------------------------+
string MakeDateTime(string strDate,string strTime)
  {
//---
   int n1stDash=StringFind(strDate, "-");
   int n2ndDash=StringFind(strDate, "-", n1stDash+1);
 
   string strMonth=StringSubstr(strDate,0,2);
   string strDay=StringSubstr(strDate,3,2);
   string strYear=StringSubstr(strDate,6,4);
 
   string tempStr[];
   StringSplit(strTime,StringGetCharacter(":",0),tempStr);
   int nTimeColonPos=StringFind(strTime,":");
   string strHour=tempStr[0];
   string strMinute=StringSubstr(tempStr[1],0,2);
   string strAM_PM=StringSubstr(tempStr[1],2,2);
 
   int nHour24=StringToInteger(strHour);
   if((strAM_PM=="pm" || strAM_PM=="PM") && nHour24!=12)
      nHour24+=12;
   if((strAM_PM=="am" || strAM_PM=="AM") && nHour24==12)
      nHour24=0;
   string strHourPad="";
   if(nHour24<10)
      strHourPad="0";
   return((strYear+"."+strMonth+"."+strDay+" "+strHourPad+nHour24+":"+strMinute));
//---
  }
 
//+------------------------------------------------------------------+
//| Convert day of the week to text                                  |
//+------------------------------------------------------------------+
string DayToStr(datetime time)
  {
   int ThisDay=TimeDayOfWeek(time);
   string day="";
   switch(ThisDay)
     {
      case 0:
         day="Sun";
         break;
      case 1:
         day="Mon";
         break;
      case 2:
         day="Tue";
         break;
      case 3:
         day="Wed";
         break;
      case 4:
         day="Thu";
         break;
      case 5:
         day="Fri";
         break;
      case 6:
         day="Sat";
         break;
     }
   return(day);
  }
//+------------------------------------------------------------------+
//| Convert months to text                                           |
//+------------------------------------------------------------------+
string MonthToStr()
  {
   int ThisMonth=Month();
   string month="";
   switch(ThisMonth)
     {
      case 1:
         month="Jan";
         break;
      case 2:
         month="Feb";
         break;
      case 3:
         month="Mar";
         break;
      case 4:
         month="Apr";
         break;
      case 5:
         month="May";
         break;
      case 6:
         month="Jun";
         break;
      case 7:
         month="Jul";
         break;
      case 8:
         month="Aug";
         break;
      case 9:
         month="Sep";
         break;
      case 10:
         month="Oct";
         break;
      case 11:
         month="Nov";
         break;
      case 12:
         month="Dec";
         break;
     }
   return(month);
  }
 
string nextNews="...";
int total=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int UpcomingNewsImpact(string symb,int n)
  {
   nextNews="...";
   string MainSymbol=StringSubstr(symb,0,3);
   string SecondSymbol=StringSubstr(symb,3,3);
//---
   if(assignVal)
     {
      //--- BY AUTHORS WITH SOME MODIFICATIONS
      //--- define the XML Tags, Vars
      string sTags[7]= {"<title>","<country>","<date><![CDATA[","<time><![CDATA[","<impact><![CDATA[","<forecast><![CDATA[","<previous><![CDATA["};
      string eTags[7]= {"</title>","</country>","]]></date>","]]></time>","]]></impact>","]]></forecast>","]]></previous>"};
      int index=0;
      int next=-1;
      int BoEvent=0,begin=0,end=0;
      string myEvent="";
      //--- Minutes calculation
      datetime EventTime=0;
      int EventMinute=0;
      //--- split the currencies into the two parts
 
      //--- loop to get the data from xml tags
      while(true)
        {
         BoEvent=StringFind(sData,"<event>",BoEvent);
         if(BoEvent==-1)
            break;
         BoEvent+=7;
         next=StringFind(sData,"</event>",BoEvent);
         if(next == -1)
            break;
         myEvent = StringSubstr(sData,BoEvent,next-BoEvent);
         BoEvent = next;
         begin=0;
         for(int i=0; i<7; i++)
           {
            Event[index][i]="";
            next=StringFind(myEvent,sTags[i],begin);
            //--- Within this event, if tag not found, then it must be missing; skip it
            if(next==-1)
               continue;
            else
              {
               //--- We must have found the sTag okay...
               //--- Advance past the start tag
               begin=next+StringLen(sTags[i]);
               end=StringFind(myEvent,eTags[i],begin);
               //---Find start of end tag and Get data between start and end tag
               if(end>begin && end!=-1)
                  Event[index][i]=StringSubstr(myEvent,begin,end-begin);
              }
           }
         //--- filters that define whether we want to skip this particular currencies or events
 
         //if(!IsCurrency(Event[index][COUNTRY]))
         //continue;
         /*if(importance!=0 && Event[index][IMPACT]=="High")
            continue;
if(importance!=1 && Event[index][IMPACT]=="Medium")
continue;
if(importance!=2 && Event[index][IMPACT]=="Low")
continue;
if(!IncludeSpeaks && StringFind(Event[index][TITLE],"Speaks")!=-1)
continue;
if(!IncludeHolidays && Event[index][IMPACT]=="Holiday")
continue;*/
         if(Event[index][TIME]=="Tentative" ||
            Event[index][TIME]=="")
            continue;
 
         //--- sometimes they forget to remove the tags :)
         if(StringFind(Event[index][TITLE],"<![CDATA[")!=-1)
            StringReplace(Event[index][TITLE],"<![CDATA[","");
         if(StringFind(Event[index][TITLE],"]]>")!=-1)
            StringReplace(Event[index][TITLE],"]]>","");
         if(StringFind(Event[index][TITLE],"]]>")!=-1)
            StringReplace(Event[index][TITLE],"]]>","");
         //---
         if(StringFind(Event[index][FORECAST],"&lt;")!=-1)
            StringReplace(Event[index][FORECAST],"&lt;","");
         if(StringFind(Event[index][PREVIOUS],"&lt;")!=-1)
            StringReplace(Event[index][PREVIOUS],"&lt;","");
 
         //--- set some values (dashes) if empty
         if(Event[index][FORECAST]=="")
            Event[index][FORECAST]="---";
         if(Event[index][PREVIOUS]=="")
            Event[index][PREVIOUS]="---";
         //--- Convert Event time to MT4 time
         string evD=MakeDateTime(Event[index][DATE],Event[index][TIME]);
         EventTime=datetime(evD);
         index++;
        }
      //--- loop to set arrays/buffers that uses to draw objects and alert
      for(int ii=0; ii<index; ii++)
        {
         if(Event[index][TIME]=="All Day" && Event[ii][IMPACT]=="Holiday" && (MainSymbol==Event[ii][COUNTRY] || SecondSymbol==Event[ii][COUNTRY]))
            return 1;
         eTitle[i][n]    = Event[ii][TITLE];
         eCountry[ii][n]  = Event[ii][COUNTRY];
         eImpact[ii][n]   = Event[ii][IMPACT];
         eTime[ii][n]     = datetime(MakeDateTime(Event[ii][DATE],Event[ii][TIME]))-TimeGMTOffset();
         //Print(eTitle[i]);
        }
      total=index;
     }
 
 
   datetime tn=TimeLocal(); //TimeCurrent() vs TimeLocal()
   for(int qi=0; qi<total; qi++)
     {
      if(MainSymbol!=eCountry[qi][n] && SecondSymbol!=eCountry[qi][n])
         continue;
      if(news_High && (eImpact[qi][n]=="High"))
        {
         if(News_High_Line) {
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrRed,STYLE_SOLID);
            //TextCreate(0,"Text"+eTitle[i][n],0,eTime[qi][n],0,eTitle[i][n],clrRed);
            }
        }
      if(news_Medium && (eImpact[qi][n]=="Medium"))
        {
         if(News_Medium_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrOrange,STYLE_SOLID);
        }
      if(news_Low && (eImpact[qi][n]=="Low"))
        {
         if(News_Low_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrYellow,STYLE_SOLID);
        }
 
      if(news_High && (eImpact[qi][n]=="High") && eTime[qi][n]<(tn+minAfter*60) && eTime[qi][n]>(tn-minBefore*60))
        {
         return 1;
         if(News_High_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrRed,STYLE_SOLID);
        }
      if(news_Medium && (eImpact[qi][n]=="Medium") && eTime[qi][n]<(tn+minAfter1*60) && eTime[qi][n]>(tn-minBefore1*60))
        {
         return 1;
         if(News_Medium_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrOrange,STYLE_SOLID);
        }
      if(news_Low && (eImpact[i][n]=="Low") && eTime[i][n]<(tn+minAfter2*60) && eTime[qi][n]>(tn-minBefore2*60))
        {
         return 1;
         if(News_Low_Line)
            VLineCreate(0,"Tr_VLine"+TimeToString(eTime[qi][n]),0,eTime[qi][n],clrYellow,STYLE_SOLID);
        }
     }
   XMLUpcomingImpact = TimeToString(TimeLocal());  
   return(-1);
  }
//+------------------------------------------------------------------+
//|                     NEWS Values                                          |
//+------------------------------------------------------------------+
bool isNewsPause(string Symb,int n)
  {
   bool res=false;
   res=(UpcomingNewsImpact(Symb,n)==1);
   return res;
  }
void icomment() {
Comment(" ---------------------------------------------"
 
                 "\n ------------------------------------------------"
                 "\n :: News Status            : " + News_Trade_Status +
                 "\n :: nfs.faireconomy.media  : " + NewsURLChecking +
                 "\n :: Last News Downloaded   : " + XMLDownloadTime +
                 "\n :: Last News Read         : " + XMLReadTime +
                 "\n :: Last News Updated      : " + XMLUpdateTime +
                 "\n :: Last News Checked      : " + XMLUpdateTime +
                 "\n ------------------------------------------------");
 }