Чтение из CodeBase программным путем WinInet.DLL

 

Есть небольшая задачка, читать из CodeBase определенные индикаторы скрипты эксперты, в названии или описании к которым есть некое ключевое слово.

Собственно не обязательно из CodeBase , можно приспособить куда угодно.

Простой перебор с использованием WebRequest наткнулся на блокировку по IP , вывод либо использовать большую задержку ,либо заходить через некоторый список прокси.


работа через WinInet.DLL , которая позволяет работать через прокси.   

Использование WinInet.dll для обмена данными между терминалами через Интернет
Использование WinInet.dll для обмена данными между терминалами через Интернет
  • www.mql5.com
MetaTrader 5 открывает уникальные возможности для пользователей, применяя в своем арсенале новые элементы пользовательского интерфейса. Благодаря этому, ранее недоступный функционал можно использовать по максимуму. В этом уроке мы научимся: использовать базовые интернет технологии; обмениваться данными между терминалами посредством сервера...
 

Небольшой пример работы методом GET

#property link      "https://www.mql5.com" 
#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);
   int InternetConnectW(int hInternet, string szServerName, int nServerPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags, int& dwContext[]);
   int HttpOpenRequestW(int hConnect, string Verb, string _ObjectName, string Version, string Referer, string AcceptTypes, uint dwFlags, int& dwContext[]);
   int HttpSendRequestW(int hRequest, string lpszHeaders, int dwHeadersLength, uchar &lpOptional[], int dwOptionalLength);
   int HttpQueryInfoW(int hRequest, int dwInfoLevel, int &lpvBuffer[], int &lpdwBufferLength[], int &lpdwIndex[]);
   int InternetReadFile(int hFile, uchar &sBuffer[], int lNumBytesToRead, int &lNumberOfBytesRead[]);
   int InternetCloseHandle(int hInet);
#import
#import "kernel32.dll"
   int GetLastError(void);
#import

//+------------------------------------------------------------------+
#define INTERNET_FLAG_CACHE_IF_NET_FAIL         0x00010000
#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID    0x00001000
#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID  0x00002000
#define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP   0x00008000
#define INTERNET_FLAG_KEEP_CONNECTION           0x00400000
#define INTERNET_FLAG_PRAGMA_NOCACHE            0x00000100
#define INTERNET_FLAG_RELOAD                    0x80000000
#define INTERNET_FLAG_SECURE                    0x00800000

#define INTERNET_SERVICE_HTTP  3
 
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
void OnTick()
{
}

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{  
   if (lparam == 'T') TestBinanceApi();
}

//+------------------------------------------------------------------+
void TestBinanceApi()
{
   //Open session
   int sessionHandle = 0; 
   string sAgent = "MQL"; 
   string sProxyName = ""; 
   string sProxyBypass = "";
   sessionHandle = InternetOpenW(sAgent, 0, sProxyName, sProxyBypass, 0);
   Print("sessionHandle = ", sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError());

   //Connect to host
   int connectionHandle = 0; 
   string szServerName = "api.binance.com"; 
   string lpszUsername = ""; 
   string lpszPassword = ""; 
   int dwContext[1] = {0};
   connectionHandle = InternetConnectW(sessionHandle, szServerName, 443, lpszUsername, lpszPassword, INTERNET_SERVICE_HTTP, 0, dwContext);
   Print("connectionHandle = ", sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError());   

   //Open request
   int requestHandle = 0; 
   string Verb = "GET"; 
   string _ObjectName = "/api/v1/time"; 
   string Version = "HTTP/1.1"; 
   string Referer = NULL; 
   string AcceptTypes = NULL; 
   requestHandle = HttpOpenRequestW(connectionHandle, Verb, _ObjectName, Version, Referer, AcceptTypes, INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_SECURE, dwContext);
   Print("requestHandle = ", requestHandle, sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError());
   
   //Send request
   bool isSentRequest = false; 
   string lpszHeaders = ""; 
   uchar lpOptional[];
   isSentRequest = HttpSendRequestW(requestHandle, lpszHeaders, StringLen(lpszHeaders), lpOptional, ArraySize(lpOptional) - 1);
   
   //Read request
   bool isReadRequest = true; 
   uchar sBuffer[100]; 
   int lNumberOfBytesRead[1] = {0}; 
   string readString = "";
   
   while (true && !IsStopped()) 
   {
      isReadRequest = InternetReadFile(requestHandle, sBuffer, 100, lNumberOfBytesRead); 
      if (isReadRequest == false || lNumberOfBytesRead[0] <= 0) break;
      
      readString += CharArrayToString(sBuffer, 0, lNumberOfBytesRead[0]);
   }
   
   Print("readString = ", readString);
  
   //Close handles
   bool idClosedRequest = false; 
   if(requestHandle > 0) idClosedRequest = InternetCloseHandle(requestHandle);    
   Print("idClosedRequest = ", idClosedRequest, sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError());
   
   bool isClosedConnection = false; 
   if(connectionHandle > 0) isClosedConnection = InternetCloseHandle(connectionHandle);
   Print("isClosedConnection = ", isClosedConnection, sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError()); 

   bool isClosedSession = false; 
   if(sessionHandle > 0) isClosedSession = InternetCloseHandle(sessionHandle);
   Print("isClosedSession = ", isClosedSession, sessionHandle, " errorKernel = ", kernel32::GetLastError(), " errorMql = ", GetLastError());
}
 

Юра, хочу напомнить что в правилах есть пункт:

3.7. Вы соглашаетесь использовать сайт www.mql5.com только с помощью интерфейса, предоставленного компанией MetaQuotes Ltd на сайте www.mql5.com или посредством интерфейса в програмном обеспечении MetaQuotes Software, кроме случаев, когда отдельным соглашением с компанией MetaQuotes Ltd Вам разрешено иное. Вы, в частности, соглашаетесь не использовать для доступа к сайту www.mql5.com автоматизированные средства, включая сценарии, сканеры и подобные технологии.

По этой причине бросил ваять скрипт системы оценки истории сигналов...