//+------------------------------------------------------------------+
//|                                                  Urdala_News.mq4 |
//|                                        Сергей (urdala) Рашевский |
//|                                                   urdala@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Сергей (urdala) Рашевский"
#property link      "urdala@mail.ru"

#property indicator_chart_window
#property indicator_buffers 1

extern int MinDo=30; //Срабатывание минут до новости     
extern int MinPosle= 30; //Срабатывание минут до новости
extern int ChasPoyasServera=3; // часовой пояс. 0-GMT 
extern bool Vhigh=true;//Установка важности новостей
extern bool Vmedium=true;//Установка важности новостей
extern bool Vlow=true;//Установка важности новостей 
extern bool RisovatLini=true;// Рисовать линии?
extern bool Next=false;// Рисовать только линии будущих новостей?  
extern bool Signal=false;// Сигналить о предстоящей новости?
extern color highc= Red;// цвет важных новостей
extern color mediumc= Blue;// цвет обычных новостей
extern color lowc= Lime;// цвет незначительных новостей 
extern int Style=2;//Стиль линии  
//--------------------------------------------------------------------
#import "wininet.dll"
int InternetAttemptConnect (int x);
  int InternetOpenA(string sAgent, int lAccessType, 
                    string sProxyName = "", string sProxyBypass = "", 
                    int lFlags = 0);
  int InternetOpenUrlA(int hInternetSession, string sUrl, 
                       string sHeaders = "", int lHeadersLength = 0,
                       int lFlags = 0, int lContext = 0);
  int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, 
                       int& lNumberOfBytesRead[]);
  int InternetCloseHandle(int hInet);
#import
//---------------------------------------------------------------------
  double Torg[1];
  datetime TimeNews[300];
  string Valuta[300];
  string News[300];
  string Vazn[300];
  int Now=0;
  int nom;
  color Col;

//---------------------------------------------------------------------
int init()
  {
   IndicatorBuffers(1); 
   SetIndexBuffer(0,Torg);
//----------Находим последнее воскресенье(последний загруженый на сайт календарь)
   int DayFile=TimeDay(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   if (DayFile<10)string DF="0"+DayFile;
       else DF=DayFile;
   int MonthFile=TimeMonth(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   if (MonthFile<10)string MF="0"+MonthFile;
       else MF=MonthFile;
   int YearFile=TimeYear(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   string DateFile=MF+"-"+DF+"-"+YearFile;
   string FileName=DateFile+".csv";
   int handle;
   handle=FileOpen(FileName,FILE_CSV|FILE_READ,";");

   if (handle<0)
   {
//-----Скачиваем календарь ---------------------------------------------------------------------   
   string url="http://www.dailyfx.com/files/Calendar-"+DateFile+".csv";  
//-------Функция читает исходный код страницы сайта в строку------------------------------------
   if(!IsDllsAllowed())
   {
      Alert("Необходимо в настройках разрешить использование DLL");
      return(0);
   }
   int rv = InternetAttemptConnect(0);
   if(rv != 0)
   {
      Alert("Ошибка при вызове InternetAttemptConnect()");
      return(0);
   }
   int hInternetSession = InternetOpenA("Microsoft Internet Explorer", 
                                        0, "", "", 0);
   if(hInternetSession <= 0)
     {
       Alert("Ошибка при вызове InternetOpenA()");
       return(0);         
     }
   int hURL = InternetOpenUrlA(hInternetSession, 
              url, "", 0, 0, 0);
   if(hURL <= 0)
     {
       Alert("Ошибка при вызове InternetOpenUrlA()");
       InternetCloseHandle(hInternetSession);
       return(0);         
     }
//------------------------------------------------------------------------      
   handle=FileOpen(FileName,FILE_CSV|FILE_WRITE,";");
   int dwBytesRead[1],N1,N2,N3,N4; 
   string text = "";
   string Str[10];
   for(int y=0;y<9;y++)Str[y]="";
   nom=0;
   int x=0;
   while(!IsStopped())
      {
       int cBuffer[256];
       bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);
       if(dwBytesRead[0] == 0) break;
       for(int i = 0; i < 256; i++)
         {
          
          N1=cBuffer[i] & 0x000000FF;
          N2=cBuffer[i] >> 8 & 0x000000FF;
          N3=cBuffer[i] >> 16 & 0x000000FF;
          N4=cBuffer[i] >> 24 & 0x000000FF;
          if (N1!=44 && N1!=10)Str[x]=Str[x]+CharToStr(N1);
             else x++;
          if (N1==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
          if ((i*4)==dwBytesRead[0])break;
          if (N2!=44 && N2!=10)Str[x]=Str[x]+CharToStr(N2);
             else x++;
          if (N2==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
          if ((i*4)+1==dwBytesRead[0])break;
          if (N3!=44 && N3!=10)Str[x]=Str[x]+CharToStr(N3);
             else x++;
          if (N3==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
          if ((i*4)+2==dwBytesRead[0])break;
          if (N4!=44 && N4!=10)Str[x]=Str[x]+CharToStr(N4);
             else x++;
          if (N4==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
          if ((i*4)+3==dwBytesRead[0])break;
         }
      }
   InternetCloseHandle(hInternetSession);
   FileSeek(handle,0,SEEK_SET);
   FileWrite(handle,nom);
   }
   FileClose(handle);
//-----------Заносим данные из файла в массивы.---------------------------------
   handle=FileOpen(FileName,FILE_CSV|FILE_READ,";");
   nom=StrToInteger(FileReadString(handle));
   string Hand;
   for(i=1;i<=8;i++)Hand=FileReadString(handle);
   string data,time,month,poyas,valuta;
   
   for(i=1;i<=nom;i++)
      {
       data=FileReadString(handle);
       time=FileReadString(handle);
       month=StringSubstr(data,4,3);
       if(month=="Jan") month="01";
       if(month=="Feb") month="02";
       if(month=="Mar") month="03";
       if(month=="Apr") month="04";
       if(month=="May") month="05"; 
       if(month=="Jun") month="06"; 
       if(month=="Jul") month="07";
       if(month=="Aug") month="08";
       if(month=="Sep") month="09";
       if(month=="Oct") month="10";
       if(month=="Nov") month="11";
       if(month=="Dec") month="12";
       TimeNews[i]=StrToTime(YearFile+"."+month+"."+StringSubstr(data,8,2)+" "+time)+ChasPoyasServera*3600;
       
       text=FileReadString(handle);
       
       valuta=FileReadString(handle);
       if(valuta=="eur" ||valuta=="EUR")Valuta[i]="EUR";
       if(valuta=="usd" ||valuta=="USD")Valuta[i]="USD";
       if(valuta=="jpy" ||valuta=="JPY")Valuta[i]="JPY";
       if(valuta=="gbp" ||valuta=="GBP")Valuta[i]="GBP";
       if(valuta=="chf" ||valuta=="CHF")Valuta[i]="CHF";
       if(valuta=="cad" ||valuta=="CAD")Valuta[i]="CAD";
       if(valuta=="aud" ||valuta=="AUD")Valuta[i]="AUD";
       if(valuta=="nzd" ||valuta=="NZD")Valuta[i]="NZD";
       
       News[i]=FileReadString(handle);
       News[i]=StringSubstr(News[i],0,60);
       
       Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);

       while(!IsStopped())
            {
             text=FileReadString(handle);
             if (FileIsLineEnding(handle))break;
            }
      }
   
//------------Выход из функции--------------------------------------------------
   FileClose(handle);
   return(0);
  }
//------------------------------------------------------------------------------
int deinit()
  {
   ObjectsDeleteAll(0,OBJ_VLINE);
   return(0);
  }
//-------------------------------------------------------------------------------
int start()
  {
//---Рисуем линии новостей на графике--------------------------------------------
   if (RisovatLini)
      {
       for(int i=1;i<nom-1;i++)
          {
           if (News[i]!="")if (ObjectFind(News[i])==0)continue;
           if (StringFind(Symbol(),Valuta[i])<0)continue;
           if (TimeNews[i]<TimeCurrent() && Next)continue;
           
           
           if ((Vazn[i]=="High" || Vazn[i]=="HIGH") && Vhigh==false)continue;
           
           if ((Vazn[i]=="Medium" || Vazn[i]=="MEDIUM"  || Vazn[i]=="MED") && Vmedium==false)continue;
           
           if ((Vazn[i]=="Low" || Vazn[i]=="LOW") && Vlow==false)continue;
           
           //if (Vazn[i]=="High")Print (TimeToStr(TimeNews[i]),Valuta[i],Vazn[i],News[i]);
           
           

           if (News[i]!="")ObjectCreate(News[i],0,OBJ_VLINE,TimeNews[i],0);
           if (Vazn[i]=="High" || Vazn[i]=="HIGH")Col=highc;
           if (Vazn[i]=="Medium" || Vazn[i]=="MEDIUM"  || Vazn[i]=="MED")Col=mediumc;
           if (Vazn[i]=="Low" || Vazn[i]=="LOW")Col=lowc;
           if (News[i]!="")ObjectSet(News[i],OBJPROP_COLOR,Col);
           if (News[i]!="")ObjectSet(News[i],OBJPROP_STYLE,Style);
          }
       }
//---------------Обработка событий------------------------------------
for(i=1;i<nom;i++)
   {if ((Vazn[i]=="High" || Vazn[i]=="HIGH") && Vhigh==false)continue;
    if ((Vazn[i]=="Medium" || Vazn[i]=="MEDIUM"  || Vazn[i]!="MED") && Vmedium==false)continue;
    if ((Vazn[i]=="Low" || Vazn[i]=="LOW") && Vlow==false)continue;
   if (TimeCurrent()+MinDo*60>TimeNews[i] && TimeCurrent()-MinPosle*60<TimeNews[i] && (StringSubstr(Symbol(),0,3)==Valuta[i] || StringSubstr(Symbol(),3,3)==Valuta[i])) 
       {Torg[0]=1;
        break;
       }
    else Torg[0]=0;
   
   }
   if (Torg[0]==1 && i!=Now && Signal) {Alert ("Через ",(TimeNews[i]-TimeCurrent())/60," минут выйдет новость ",News[i]);Now=i;}
 
 
//-------------------------------------------------------------------------------
   return(0);
  }
//+------------------------------------------------------------------+