Navigation:Home > Content >

NewsInd.mq4

Time: 2018-05-04 | Download file:NewsInd.mq4

//+------------------------------------------------------------------+
//|                                                      NewsInd.mq4 |
//|                                                                * |
//|                                                                * |
//+------------------------------------------------------------------+

#property indicator_chart_window 
#property indicator_buffers 3

#include 

#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

#import "kernel32.dll"
   int _lopen(string path, int of);
   int _lcreat(string path, int attrib);
   int _llseek(int handle, int offset, int origin);
   int _lread(int handle, int& buffer[], int bytes);
   int _lwrite(int handle, string buffer, int bytes);
   int _lclose(int handle);
#import

extern bool lines    = true;        // показывать на графике вертикальные линии в моменты выхода новостей
extern bool texts    = true;        // показывать текстовые надписи с описаниями новостей
extern bool comments = true;        // показывать список ближайших будущих и прошедших новостей
int old_news      = 10;      // количество предыдущих новостей в списке
int total_in_list = 30;      // всего новостей в списке

extern bool high     = true;        // показывать важные новости
extern bool medium   = true;        // показывать новости средней важности
extern bool low      = true;        // показывать новости малой важности

extern int update = 60;             // обновлять список новостей каждые 60 минут

extern bool eur = false;             // показывать новости для определенных валют
extern bool usd = true;
extern bool jpy = false;
extern bool gbp = false;
extern bool chf = false;
extern bool cad = false;
extern bool aud = false;
extern bool nzd = false;

extern color high_color    = Maroon;         // цвет важных новостей
extern color medium_color  = Sienna;         // цвет обычных новостей
extern color low_color     = DarkSlateGray;  // цвет незначительных новостей

extern int server_timezone = 0;     // часовой пояс сервера (центральная европа зимнее - GMT+1, летнее - GMT+2)

extern int  beforeNewsMinutes = 30;
extern int  beforeNewsSeconds = 0;


// -----------------------------------------------------------------------------------------------------------------------------
int TotalNews = 0;
string News[1000][10];
datetime LastUpdate = 0;
int NextNewsLine = 0;
int LastAlert = 0;
string Translate[1000][2];
int TotalTranslate = 0;

double Buffer1[], Buffer2[], Buffer3[];

int prev_time = 0;

// -----------------------------------------------------------------------------------------------------------------------------
int init() 
{ 
   IndicatorShortName("News");
   IndicatorBuffers(3);
   SetIndexBuffer(0,Buffer1);
   SetIndexLabel(0,"News signal"); 
   SetIndexStyle(0,DRAW_NONE);   
   SetIndexBuffer(1,Buffer2);
   SetIndexLabel(1,"Previous News"); 
   SetIndexStyle(1,DRAW_NONE);    
   SetIndexBuffer(2,Buffer3);
   SetIndexLabel(2,"Next News"); 
   SetIndexStyle(2,DRAW_NONE);     
   return(0); 
} 

// -----------------------------------------------------------------------------------------------------------------------------
int deinit() 
{ 
   for(int i=0; i Period()*60)
      time = Time[0];
   if(time >= LastUpdate+update*60)    // обновление списка новостей
   {
      for(int i=0; i time) break;
      NextNewsLine = i;

      if(comments) // создание списка новостей на графике
         Comment(News_List());   
   } // конец обновления списка новостей
   
   datetime next_time = StrToTime(News[NextNewsLine][0]+" "+News[NextNewsLine][1]);
   if(time >= next_time) // вышла следующая новость
   {
      LastUpdate = time - update*60 + 60;  // обновить список новостей через минуту после выхода очередной новости
      for(i=0; i time) break;
      NextNewsLine = i;

      if(comments)
         Comment(News_List());   
   }

   next_time = StrToTime(News[NextNewsLine][0]+" "+News[NextNewsLine][1]);
   if(NextNewsLine - 1 >= 0)
      prev_time = StrToTime(News[NextNewsLine - 1][0]+" "+News[NextNewsLine - 1][1]);
   else 
      prev_time = 0;
   // Comment(TimeToStr(next_time));
   if(time >= next_time - beforeNewsMinutes*60 - beforeNewsSeconds && time <= next_time /*&& NextNewsLine <= total_in_list*/ ) // скоро выйдет следующая новость
   {
      Buffer1[0] = next_time;
   }
   Buffer2[0] = prev_time;
   if(TotalNews != NextNewsLine)
      Buffer3[0] = next_time;
   else
      Buffer3[0] = 0;
   return(0);
}

// -----------------------------------------------------------------------------------------------------------------------------
string LoadNews(datetime curr_time)
{ 
  bool reload = false;
  int pos = 0, pos1 = 0;
  int file = 0, file2 = 0;
  string str = "", str2 = "", calendar = "", str3 = "";
  int date = curr_time - 24*3600*(TimeDayOfWeek(curr_time));
  str3 = TimeToStr(date, TIME_DATE);
  calendar = "Calendar-" + StringSubstr(str3, 5, 2) + "-" + StringSubstr(str3, 8, 2) + "-" + DoubleToStr(TimeYear(date), 0) + ".csv";
  
  file = FileOpen(calendar, FILE_BIN|FILE_READ);
  if(file!=-1)
  {
    FileClose(file); 
    str2 = ReadFile(calendar);
        
    pos = StringFind(str2, "\n");
    int cache_time = StrToTime(StringSubstr(str2, 0, pos));
    str2 = StringSubstr(str2, pos+2);

    if(cache_time<=curr_time-update*60) reload = true;
  }
  else reload = true;

  LastUpdate = curr_time;
  if(reload)
  {
    str = ReadWebPage("http://cdn.dailyfx.com/files/" + calendar + "?week=&sort=dateDesc&timezone=¤cy=|&importance=|&time="+curr_time);
    if(str == "") return(0);
    Str_Replace("\n\n", "\n", str);
    str = StringTrimRight(str);
    WriteFile("news.csv", TimeToStr(curr_time, TIME_DATE|TIME_SECONDS)+"\n"+str);
  }  
  else
    str = StringTrimRight(str2);
  return (str);  
}

// -----------------------------------------------------------------------------------------------------------------------------
void Parce_News(string str)
{
  string arr[1000];
  TotalNews = Explode(str, "\n", arr)-1;
  int i = 0;
  for(int l=0; l= old_news) start = NextNewsLine - old_news;
  string com = "_____ Past news ______________________\n";
  for(int i=start; i> 8 & 0x000000FF);
      if(StringLen(text) == dwBytesRead[0]) break;
      text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);
      if(StringLen(text) == dwBytesRead[0]) break;
      text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);
    }
    str = str + text;
  }

  InternetCloseHandle(hInternetSession);
   
  return(str);
}

// -----------------------------------------------------------------------------------------------------------------------------
string ReadFile (string path) 
{
  path = TerminalPath() + "/experts/files/" + path;
  int buffer[], count, handle, i, result;
  string text = "";
  handle = _lopen(path, 0);
  if(handle < 0) 
  {
    Print("Ошибка открытия файла ", path); 
    return("");
  }
  count =_llseek (handle,0,2);          
  if(count < 0)  
  {
    Print("Ошибка установки указателя"); 
    return ("");
  }
  ArrayResize(buffer, 1+count/4);
  result = _llseek(handle, 0, 0);          
  if(result < 0) 
  {
    Print("Ошибка установки указателя"); 
    return("");
  }
  result = _lread(handle, buffer, count); 
  if(result < 0) 
  {
    Print("Ошибка чтения файла ", path); 
    return("");
  }
  result = _lclose(handle);              
  if(result < 0) 
  {
    Print("Ошибка закрытия файла ", path); 
    return("");
  }
  for(i=0; i> 8 & 0x000000FF)
      + CharToStr(buffer[i]>>16 & 0x000000FF)
      + CharToStr(buffer[i]>>24 & 0x000000FF);
  }
  text = StringSubstr(text,0,count);
  return(text);
}
 
// -----------------------------------------------------------------------------------------------------------------------------
void WriteFile (string path, string buffer) 
{
  path = TerminalPath() + "/experts/files/" + path;
  int handle, result, count = StringLen(buffer); 
  handle = _lopen(path, 1);
  if(handle < 0) 
  {
    handle = _lcreat(path, 0);
    if(handle < 0) 
    {
      Print("Ошибка создания файла ", path);
      return;
    }
    result = _lclose(handle);
  }
  handle = _lopen(path, 1);              
  if(handle < 0) 
  {
    Print("Ошибка открытия файла ", path); 
    return;
  }
  result = _llseek(handle, 0, 0);          
  if(result < 0) 
  {
    Print("Ошибка установки указателя"); 
    return;
  }
  result = _lwrite(handle, buffer, count); 
  if(result < 0) 
    Print("Ошибка записи в файл ", path, " ", count, " байт");
  result = _lclose (handle);              
  if(result < 0)  
    Print("Ошибка закрытия файла ", path);
}


string strToLow(string sText) {
  int iLen=StringLen(sText), i, iChar;
  for(i=0; i < iLen; i++) {
    iChar=StringGetChar(sText, i);
    if(iChar >= 65 && iChar <= 90) sText=StringSetChar(sText, i, iChar+32);
  }
  return(sText);  
}

Recommend