← К каталогу
Исходный код · ID 3522

news.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека MQL5 для получения и обработки экономических новостей из веб-источников. Содержит классы для выполнения HTTP-запросов, парсинга HTML-контента и управления коллекцией новостей. Основной класс CNewsInvesting наследует функциональность веб-запросов и обеспечивает загрузку, фильтрацию и хранение новостей по валютам и уровню важности.

Класс CWebRequest реализует методы отправки POST и GET-запросов, а также загрузки данных с удалённых серверов с обработкой ошибок и таймаутов. Класс CTag предоставляет инструменты для извлечения нужных фрагментов из HTML/XML текста по шаблонам. Структура CNewsStruct описывает формат хранения данных о каждой новости.

Функция GetTimeOffset вычисляет временное смещение между различными часовыми поясами. Класс CNewsInvesting позволяет настраивать фильтрацию по валютам и уровням важности новостей, а также управлять жизненным циклом новостных событий.

Состав библиотеки

Классов: 4 · методов: 21 · конструкторов: 4 · деструкторов: 4 · отдельных функций: 1

Классы
Класс class CNewsStruct

Класс-структура для хранения данных об одной новости: время, валюта, важность, событие, фактическое значение, прогноз и предыдущее значение.

Класс class CWebRequest

Класс для выполнения HTTP-запросов (POST, GET) и загрузки данных с удалённых серверов.

Класс class CTag

Класс для парсинга HTML/XML текста: извлечение фрагментов по начальным и конечным шаблонам.

Класс class CNewsInvesting

Основной класс библиотеки для управления экономическими новостями: загрузка, парсинг, фильтрация по валютам и важности, хранение в коллекции.

Функции
Функция int GetTimeOffset(_enum_time_mode eTimeMode,int gmtModificator)

Вычисляет временное смещение в секундах между локальным, брокерским или GMT-временем с учётом коррекции и дня недели.

Методы и конструкторы
Конструктор · CNewsStruct CNewsStruct()

Конструктор класса CNewsStruct для создания пустого значения.

Деструктор · CNewsStruct ~CNewsStruct()

Деструктор класса CNewsStruct.

Конструктор · CWebRequest CWebRequest()

Конструктор класса CWebRequest для создания пустого значения.

Деструктор · CWebRequest ~CWebRequest()

Деструктор класса CWebRequest.

Метод · CWebRequest string GetBuffer()

Возвращает текстовый буфер с результатом последнего HTTP-запроса.

Метод · CWebRequest void OnInit(string swww)

Инициализирует параметр веб-запроса, сохраняя ссылку для последующего использования.

Метод · CWebRequest bool POST(string slink,string str)

Отправляет POST-запрос на указанный URL с переданными данными и сохраняет ответ в буфер.

Метод · CWebRequest bool GET(string slink)

Отправляет GET-запрос на указанный URL и сохраняет ответ в буфер.

Метод · CWebRequest bool Download(string slink,string savefile)

Загружает файл с указанного URL и сохраняет его локально на диск.

Метод · CWebRequest int Load(string sLink)

Выполняет GET-загрузку данных по ссылке и передаёт результат в метод OnLoad для обработки.

Метод · CWebRequest int OnLoad(string &buffer)

Базовый метод обработки загруженного текстового буфера — требует переопределения в наследнике.

Конструктор · CTag CTag()

Конструктор класса CTag для создания пустого значения.

Деструктор · CTag ~CTag()

Деструктор класса CTag.

Метод · CTag string GetTag(string &sbuffer,int &istartend,string startPattern,string endPattern,bool bExclude)

Ищет в буфере фрагмент между начальным и конечным шаблонами и возвращает его текст, при необходимости удаляя шаблоны и пробелы.

Метод · CTag string GetText(string stag)

Извлекает текстовое содержимое из HTML-тега, находя текст между символами > и <.

Метод · CTag void RemoveSpace(string &stag)

Удаляет начальные и конечные пробелы из строки.

Конструктор · CNewsInvesting CNewsInvesting()

Конструктор класса CNewsInvesting для создания пустого значения с настройками по умолчанию.

Деструктор · CNewsInvesting ~CNewsInvesting()

Деструктор класса CNewsInvesting.

Метод · CNewsInvesting void OnInit(string swww,string slink)

Инициализирует URL для загрузки новостей и очищает массив данных.

Метод · CNewsInvesting int VerifyNews(int i,long iOpenTimerSec,long iDeleteTimerSec)

Проверяет статус новости по индексу: не активна (0), активна (1) или завершена (2), на основе переданных таймеров открытия и удаления.

Метод · CNewsInvesting int LoadCurrency(string sList)

Загружает список валют для фильтрации новостей из строки через разделитель-пробел.

Метод · CNewsInvesting bool isCurrency(string sCurrency)

Проверяет, входит ли указанная валюта в список фильтра.

Метод · CNewsInvesting void LoadImp(bool bh,bool bm,bool bl)

Настраивает, какие уровни важности новостей (высокий, средний, низкий) будут приниматься при фильтрации.

Метод · CNewsInvesting bool FilterImp(int iimp)

Проверяет, проходит ли новость с указанным уровнем важности текущую фильтрацию.

Метод · CNewsInvesting void Save()

Сохраняет текущий буфер с полученными данными в тестовый файл для отладки.

Метод · CNewsInvesting int getSize()

Возвращает текущее количество новостей в коллекции.

Метод · CNewsInvesting CNewsStruct * getNews(int index)

Возвращает указатель на структуру новости по указанному индексу или NULL при некорректном индексе.

Метод · CNewsInvesting int OnLoad(string &buffer)

Обрабатывает загруженный HTML-буфер: извлекает таблицу с новостями, парсит каждую строку и заполняет массив данных.

Метод · CNewsInvesting void Add(string event,string cur,int imp,datetime tmTime,int itimeOffset)

Добавляет новость в коллекцию, если событие не пустое, валюта проходит фильтр, уровень важности допустим и время задано.

Получить полный код

Поиск по коду файла

/*
необходимо на investing сформировать запрос для отображения на сайте и сюда взять ссылку для получения данных
string sWWWlink=""; //эту ссылку выводим для добавления в настройки WebRequest

string sLink="";
input int     Delay=1;

input int     GMT_Offset=3;

*/

#ifndef __CNEWS__
#define __CNEWS__ sovetnikov_net_news_23424dsfsdf23433324fdfdgg

#ifdef __LIB_GUI__
#include <sovetnikovGUI\defines.mqh>
#include <sovetnikovGUI\Time.mqh>
#else
#include <sovetnikovNET\defines.mqh>
#include <sovetnikovNET\Time.mqh>
#endif 

class CNewsStruct
  {
public:
                     CNewsStruct() {}
                    ~CNewsStruct() {}

   datetime          time;
   string            cur;
   int               imp;
   string            event;

   string            actual;
   string            forecast;
   string            previos;
  };

class CWebRequest
  {
protected:
   string            m_buffer;
   string            m_link,m_WebRequest;
public:
                     CWebRequest()
     {
      m_link=NULL;
      m_WebRequest=NULL;
      m_buffer=NULL;
     }

                    ~CWebRequest()
     {
     }

   string            GetBuffer()
     {
      return m_buffer;
     }

   virtual void      OnInit(string swww)
     {
      // код доступен только после оплаты
   }

   virtual bool      POST(string slink,string str)
     {

      m_link=slink;

      string cookie=NULL,headers="content-type: text/plain;charset=UTF-8",referer = NULL;

      int res;
      uchar data[],result[];
      m_buffer="";

      int ilen=StringLen(str);

      ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1);

      /*ArrayResize(data,ilen);
      for(int i=0;i<ilen;i++){
         data[i]=(uchar)StringGetChar(str,i);
      }*/
      int isize=ArrayRange(data,0);

      ResetLastError();
      int j=0;

      while(!IsStopped() && j<5)
        {

         int itimeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета сделан таймаут в 5 секунд

         res=WebRequest("POST",m_link,cookie,referer,itimeout,data,isize,result,headers);

         int ierror=GetLastError();

         if(ierror==ERR_WEBREQUEST_REQUEST_FAILED || ierror==ERR_WEBREQUEST_INVALID_ADDRESS || ierror==ERR_WEBREQUEST_CONNECT_FAILED)
           {

            break;
           }

         if(res==-1)
           {
            if(ierror==4060 || ierror==4014)
              {
               if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
                  MessageBox("Вам нужно добавить адрес: "+m_WebRequest+" в Разрешить WebRequest для следующих URL. Меню 'Сервис->Настройки' на вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
               else
                  MessageBox("You need to add the address: "+m_WebRequest+" to Allow WebRequest for listed URL. Menu 'Tools->Options' on 'Experts Advisors' tab","Error",MB_ICONINFORMATION);
              }

            PrintFormat("%s error code: %d",__FUNCTION__,ierror);

            break;
           }
         else
           {
            if(res==200)
              {

               string sBuffer="";
               sBuffer=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //сохраним в UTF8

               if(sBuffer!="")
                 {

                  m_buffer=sBuffer;
                  StringReplace(m_buffer,"\"","");//уберем \"
                  return true;
                 }
              }

            Sleep(5000); //таймаут при ошибках чтения
           }

         j++;
        }

      return false;
     }

   virtual bool      GET(string slink)
     {
      m_link=slink;

      string cookie=NULL,headers;
      int res;
      char post[],result[];
      m_buffer=NULL;

      ResetLastError();
      int j=0;

      while(!IsStopped() && j<5)
        {

         int itimeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета сделан таймаут в 5 секунд

         ResetLastError();

         res=WebRequest("GET",m_link,cookie,NULL,itimeout,post,0,result,headers);

         int ierror=GetLastError();

         if(res==-1)
           {

            if(ierror==4060 || ierror==4014)
              {
               if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
                  MessageBox("Необходимо добавить адрес: '"+m_WebRequest+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
               else
                  MessageBox("You need to add the address: '"+m_WebRequest+"' to the list of allowed URLs on the 'Experts' tab","Error",MB_ICONINFORMATION);
              }

            PrintFormat("%s error code: %d",__FUNCTION__,ierror);

            break;
           }
         else
           {

            string sBuffer="";
            sBuffer=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //сохраним в UTF8

            if(sBuffer!="")
              {

               m_buffer=sBuffer;
               StringReplace(m_buffer,"\"","");//уберем \"
               return true;
              }
            Sleep(5000); //таймаут при ошибках чтения
           }

         j++;
        }

      return false;
     }

   virtual bool      Download(string slink,string savefile)
     {
      m_link=slink;

      string cookie=NULL,headers;
      int res;
      char post[],result[];
      m_buffer=NULL;

      ResetLastError();
      int j=0;

      while(!IsStopped() && j<5)
        {

         int itimeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета сделан таймаут в 5 секунд

         ResetLastError();

         res=WebRequest("GET",m_link,cookie,NULL,itimeout,post,0,result,headers);

         int ierror=GetLastError();

         if(res==-1)
           {

            if(ierror==4060 || ierror==4014)
              {
               if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
                  MessageBox("Необходимо добавить адрес: '"+m_WebRequest+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
               else
                  MessageBox("You need to add the address: '"+m_WebRequest+"' to the list of allowed URLs on the 'Experts' tab","Error",MB_ICONINFORMATION);
              }

            PrintFormat("%s error code: %d",__FUNCTION__,ierror);

            break;
           }
         else
           {
            string sBuffer="";

            int filehandle=FileOpen(savefile,FILE_WRITE|FILE_BIN);
            if(filehandle!=INVALID_HANDLE)
              {
               FileWriteArray(filehandle,result,0,ArraySize(result));
               FileClose(filehandle);
               Print("Load success");
               return true; //загрузили файл
              }
            else
              {
               PrintFormat("Error load file %s:%d",m_link,GetLastError());
              }
            Sleep(5000); //таймаут при ошибках чтения
           }

         j++;
        }

      return false;
     }

   virtual int       Load(string sLink)
     {
      m_link=sLink;

      if(GET(m_link))
        {

         string buffer=GetBuffer();

         if(buffer!="")
           {
            return OnLoad(buffer);
           }

         return 0;
        }

      return INT_MAX;
     }

   virtual int       OnLoad(string &buffer)
     {
      Print("Необходимо реализовать ",__FUNCSIG__);
      return 0;
     }

  };

enum _enum_time_mode
  {
   eLocal, //Computer Time
   eBroker, //Terminal Time
   eGMT//GMT Time
  };

class CTag
  {
protected:
   int               FindTag(string spattern,string &sbuffer,int iStartPos)
     {
      int iStart=-1;

      iStart=StringFind(sbuffer,spattern,iStartPos);

      return iStart;
     }

   string            GetE

Показано первые 50% кода (символов: 9594)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
959,40₽ ≈ $11.73