Группа "Стол заказов MQL"

Рейтинг 2087



РЕКОМЕНДУЮ



Спарсить число с сайта

Добрый день Андрей, спасибо больше вам за пример «как спарсить страничку сайта», изучил её внимательно и подумал что тут «нифик» делать, но когда сел и попробывал повторить на другой странички, оказалось всё не так легко как мне казалось на первый взгляд
И так к сути,
Нужно спарсить с ЭТОЙ странички
Данное число:

Я попытался и вот что у меня получилось:
P.S Думаю проблема в том что я не правильно задал параметр «SubString»
//+------------------------------------------------------------------+
//|                                                       Parser.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#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

input string URL="https://www.cmegroup.com/trading/fx/g10/euro-fx_performance_bonds.html#sortField=exchange&sortAsc=true&clearingCode=EC§or=FX&exchange=CME&pageNumber=1/";
input string SubString="cmeTableRight"; // самое начало и застрял, что тут писать??? возможно: class="" т.к оно уникально
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
// Скачивает исходный код страницы HTML  в текстовую переменную      |
//                и возвращает как результат                         |
//+------------------------------------------------------------------+
string ReadHTML()
  {
   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("");
     }
   int cBuffer[256];
   int dwBytesRead[1];
   string TXT="";
   while(!IsStopped())
     {
      bool bResult=InternetReadFile(hURL,cBuffer,1024,dwBytesRead);
      if(dwBytesRead[0]==0)
         break;
      string text = "";
      string text0= "";
      for(int i=0; i<256; i++)
        {
         text0=CharToStr((char)(cBuffer[i]&0x000000FF));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(8  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(16  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(24  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

        }
      TXT=TXT+text;
      Sleep(1);
     }
   InternetCloseHandle(hInternetSession);
   return(TXT);
  }
//+------------------------------------------------------------------+
// ВЫВЕСТИ ЦИФРЫ(В ДАННОМ ПРИМЕРЕ 1800) В LABEL
//+------------------------------------------------------------------+
bool Label(const long                    chart_ID=0,               // ID графика
                 const string            name="Label",             // имя метки
                 const int               sub_window=0,             // номер подокна
                 const int               x=0,                      // координата по оси X
                 const int               y=0,                      // координата по оси Y
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                 const string            text="Label",             // текст
                 const string            font="Arial",             // шрифт
                 const int               font_size=10,             // размер шрифта
                 const double            angle=0.0,                // наклон текста
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
                 const bool              back=false,               // на заднем плане
                 const bool              selection=false,          // выделить для перемещений
                 const bool              hidden=true,              // скрыт в списке объектов
                 const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- создадим текстовую метку
   ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0);
//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrGreen);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  } 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int r=0;
   string s=ReadHTML();
   int sf=StringFind(s,SubString);
   string level=StringSubstr(s,sf+1,5);
   
   Label(0,"label",0,233,1,CORNER_LEFT_UPPER,(StringToInteger(level)),"Tahoma",8,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);

   
   Comment("\n Начало подстроки: ",sf,
           "\n Уровень: ",level);
  }
В данном виде на экране выводится 0
Ниже я прикладываю этот же файл:
Parser.mq4 (14 Kb)
Андрей, если возможно сделайте пожалуйста данный заказ в виде индикатора, а не советника
Спасибо что дочитали до конца
  • 0
  • Просмотров: 1433
  • 24 ноября 2019, 19:54
  • lafler356
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник. Попытка №2.
Следующая запись в группе  
Magic к советнику
24 ноября 2019
24 ноября 2019

Комментарии (10)

+
0
26-го посмотрю
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 24 ноября 2019, 21:36
+
0
Спасибо большое
avatar

  9  lafler356 Автор Сообщений: 305

  • 25 ноября 2019, 02:50
+
0
ошибка функции: InternetAttemptConnect(). теперь это видимо не работает. нужно копать заново
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 25 ноября 2019, 19:18
+
0
спарсил число с главной страницы:






//+------------------------------------------------------------------+
//|                                                    ParserCME.mq4 |
//|                                              Copyright 2019, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

input string URL="https://www.cmegroup.com/";
input string SubString="cmeTableRight";// data-ce-key="19452"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string cookie=NULL,headers;
   char   post[],result[];
//--- для работы с сервером необходимо добавить URL "https://www.cmegroup.com/"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы
   int res=WebRequest("GET",URL,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+URL+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }


   string s=CharArrayToString(result,0,ArraySize(result));
   int sf=StringFind(s,SubString);
   string num=StringSubstr(s,sf+20,5);

   Comment("\n Num: ",num,
           "\n",
           "\n",s);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+



avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 25 ноября 2019, 22:14
+
0
Спасибо большое, уже хоть сдвинулись, а возможно ли вывести то что я попросил? Андрей спасибо! еще раз. Или уже большая работа была проделана и нужен новый заказ со следующего месяца? Спасибо
avatar

  9  lafler356 Автор Сообщений: 305

  • 26 ноября 2019, 01:58
+
0
поставил тот что вы сделали, но у меня выводится не то что нужно, даже не 111.8
avatar

  9  lafler356 Автор Сообщений: 305

  • 26 ноября 2019, 02:39
комментарий был удален 2019-11-26 02:56:47 lafler356

+
0
Чтобы я не делал у меня не получается найти определенное число, как я понял нужно в определенной строке искать а он ищет с самого начала
avatar

  9  lafler356 Автор Сообщений: 305

  • 26 ноября 2019, 03:29
+
0
с главной страницы еще можно что то вытащить. а когда переводишь в строку страницу из тз, там только шапка сайта. этим методом ничего оттуда не спарсишь. скорее всего страница формируется динамически, там нужны другие методы
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 26 ноября 2019, 17:27
+
0
блин((( очень жаль((( вы не знаете эти другие методы? посоветуйте что нибудь пожалуйста
avatar

  9  lafler356 Автор Сообщений: 305

  • 27 ноября 2019, 15:10

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари