//+------------------------------------------------------------------+ //| News.mq4 | //| * | //| * | //+------------------------------------------------------------------+ #property copyright "Булагин Андрей" #property link "andre9@ya.ru" #property indicator_chart_window #property indicator_buffers 0 //---- #import "wininet.dll" int InternetAttemptConnect (int x); int InternetOpenW(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0); int InternetOpenUrlW(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 extern bool lines = true; // показывать вертикальные линии в моменты выхода новостей extern bool texts = true; // показывать текстовые надписи с описаниями новостей extern bool comments = true; // показывать список ближайших будущих и прошедших новостей extern int total_in_list = 10; // количество новостей в списке extern bool high = true; // показывать важные новости extern bool medium = true; // показывать новости средней важности extern bool low = true; // показывать новости малой важности extern int update = 15; // обновлять список новостей каждые 15 минут extern bool auto = true; // авто-выбор новостей, подходящих для валютной пары графика extern bool eur = true; // показывать новости для определенных валют extern bool usd = true; extern bool jpy = true; extern bool gbp = true; extern bool chf = true; extern bool cad = true; extern bool aud = true; extern bool nzd = true; extern color high_color = Maroon; // цвет важных новостей extern color medium_color = Sienna; // цвет обычных новостей extern color low_color = DarkSlateGray; // цвет незначительных новостей extern bool russian = true; // использовать файл перевода для руссификации новостей extern int server_timezone = 2; // часовой пояс сервера (Alpary - GMT+2) extern int show_timezone = 4; // показывать время для часового пояса (Москва - GMT+4) extern bool alerts = true; // предупреждать о выходе новостей звуковыми сигналами extern int alert_before = 5; // предупреждать за 5 минут до выхода новостей extern int alert_every = 30; // звуковые сигналы каждые 30 секунд // ----------------------------------------------------------------------------------------------------------------------------- int TotalNews = 0; string News[1000][10]; datetime LastUpdate = 0; int NextNewsLine = 0; int LastAlert = 0; string Translate[1000][2]; int TotalTranslate = 0; // ----------------------------------------------------------------------------------------------------------------------------- int init() { if(auto) // авто-выбор новостей, подходящих для текущей валютной пары { string sym = Symbol(); if(StringFind(sym, "EUR") != -1) eur = true; else eur = false; if(StringFind(sym, "USD") != -1) usd = true; else usd = false; if(StringFind(sym, "JPY") != -1) jpy = true; else jpy = false; if(StringFind(sym, "GBP") != -1) gbp = true; else gbp = false; if(StringFind(sym, "CHF") != -1) chf = true; else chf = false; if(StringFind(sym, "CAD") != -1) cad = true; else cad = false; if(StringFind(sym, "AUD") != -1) aud = true; else aud = false; if(StringFind(sym, "NZD") != -1) nzd = true; else nzd = false; } if(russian) // подготовка шаблонов перевода новостей { int fhandle = FileOpen("translate.txt", FILE_READ); if(fhandle>0) { int i = 0; while(!FileIsEnding(fhandle)) { string str = FileReadString(fhandle); if(str == "") break; Translate[i][0] = str; Translate[i][1] = FileReadString(fhandle); if(Translate[i][1] == "") Translate[i][1] = Translate[i][0]; i++; } TotalTranslate = i; FileClose(fhandle); } } return(0); } // ----------------------------------------------------------------------------------------------------------------------------- int deinit() { for(int i=0; i= LastUpdate+update*60) // обновление списка новостей { for(int i=0; i time) break; NextNewsLine = i; LastAlert = 0; if(comments) // создание списка новостей на графике { int start = 0; if(NextNewsLine >= 5) start = NextNewsLine - 5; string com = ""; for(i=start; i= next_time) // вышла следующая новость { LastUpdate = time - update*60 + 60; // обновить список новостей через минуту после выхода очередной новости for(i=0; i time) break; NextNewsLine = i; LastAlert = 0; if(comments) { start = 0; if(NextNewsLine >= 5) start = NextNewsLine - 5; com = ""; for(i=start; i= next_time - alert_before*60) // скоро выйдет следующая новость { if(time >= LastAlert + alert_every) { if(alerts) PlaySound("alert.wav"); Print("Следующая новость выйдет через " + (((next_time-time)-(next_time-time)%60)/60) + " минут(ы) " + ((next_time-time)%60) + " секунд(ы)."); LastAlert = time; } } return(0); } // ----------------------------------------------------------------------------------------------------------------------------- int Explode(string str, string delimiter, string& arr[]) { int i = 0; int pos = StringFind(str, delimiter); while(pos != -1) { if(pos == 0) arr[i] = ""; else arr[i] = StringSubstr(str, 0, pos); i++; str = StringSubstr(str, pos+StringLen(delimiter)); pos = StringFind(str, delimiter); if(pos == -1 || str == "") break; } arr[i] = str; return(i+1); } // ----------------------------------------------------------------------------------------------------------------------------- string ReadWebPage(string url) { if(!IsDllsAllowed()) { Alert("Необходимо в настройках разрешить использование DLL"); return(""); } int rv = InternetAttemptConnect(0); if(rv != 0) { Alert("Ошибка при вызове InternetAttemptConnect()"); return(""); } int hInternetSession = InternetOpenW("Microsoft Internet Explorer", 0, "", "", 0); if(hInternetSession <= 0) { Alert("Ошибка при вызове InternetOpenW()"); return(""); } int hURL = InternetOpenUrlW(hInternetSession, url, "", 0, 0, 0); if(hURL <= 0) { Alert("Ошибка при вызове InternetOpenUrlW()"); InternetCloseHandle(hInternetSession); return(0); } int cBuffer[256]; int dwBytesRead[1]; string TXT = ""; while(!IsStopped()) { for(int i = 0; i<256; i++) cBuffer[i] = 0; bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead); if(dwBytesRead[0] == 0) break; string text = ""; for(i = 0; i < 256; i++) { text = text + CharToStr(cBuffer[i] & 0x000000FF); if(StringLen(text) == dwBytesRead[0]) break; text = text + CharToStr(cBuffer[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); } TXT = TXT + text; Sleep(1); } if(TXT == "") Alert("Нет считанных данных"); InternetCloseHandle(hInternetSession); return(TXT); } // -----------------------------------------------------------------------------------------------------------------------------