작업: 온라인 디스플레이를 사용하여 MQL5에서 일일 분석 구현 - 페이지 7

 
누구든지 이 기능으로 작업한 예가 있습니까? 그렇지 않으면 이 주제에 대한 설명서가 없습니다!
 
IvanIvanov :
누구든지 이 기능으로 작업한 예가 있습니까? 그렇지 않으면 이 주제에 대한 설명서가 없습니다!

그것이 얼마나 조용한지, 모든 것이 거기에 그려져 있습니다.

머랭 코드에는 여기에서 유사하게 WinInet으로 작업하는 예가 있으며, 작동하고 입증된 예가 있습니다.

 void OnStart ()
  {
   string cookie= NULL ,headers;
   char post[],result[];
   int res;
//--- для работы с сервером необходимо добавить URL "https://www.google.com/finance" 
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
   string google_url= "https://www.google.com/finance" ;
//--- обнуляем код последней ошибки
   ResetLastError ();
//--- загрузка html-страницы с Google Finance
   res=WebRequest( "GET" ,google_url,cookie, NULL , 50 ,post, 0 ,result,headers);
//--- проверка ошибок
   if (res==- 1 )
     {
       Print ( "Ошибка в WebRequest. Код ошибки  =" , GetLastError ());
       //--- возможно URL отсутствует в списке, выводим сообщение о необходимости его добавления
       MessageBox ( "Необходимо добавить адрес '" +google_url+ "' в список разрешенных URL во вкладке 'Советники'" , "Ошибка" , MB_ICONINFORMATION );
     }
   else
     {
       //--- успешная загрузка
       PrintFormat ( "Файл успешно загружен, Размер файла =%d байт." , ArraySize (result));
       //--- сохраняем данные в файл
       int filehandle= FileOpen ( "GoogleFinance.htm" , FILE_WRITE | FILE_BIN );
       //--- проверка ошибки
       if (filehandle!= INVALID_HANDLE )
        {
         //--- сохраняем содержимое массива result[] в файл
         FileWriteArray (filehandle,result, 0 , ArraySize (result));
         //--- закрываем файл
         FileClose (filehandle);
        }
       else Print ( "Ошибка в FileOpen. Код ошибки =" , GetLastError ());
     }
  }
 


 
sanyooooook :

그것이 얼마나 조용한지, 모든 것이 거기에 그려져 있습니다.

그래서, 전부는 아닙니다. 레나트가 말했다

그것으로 무엇이든 할 수 있습니다 ...

도움말에 POST 요청의 예가 있습니까? 아니면 파일을 다운로드 하시겠습니까?

 
fyords :

그래서, 전부는 아닙니다. 레나트가 말했다

도움말에 POST 요청의 예가 있습니까? 아니면 파일을 다운로드 하시겠습니까?

GET도 거기에 작성됩니다. 이는 GET 요청을 의미하며 POST이면 POST 요청입니다(게시 요청과 함께 더 많은 요청 매개변수를 보낼 수 있음).

결과 변수는 링크에 있는 내용에 기록됩니다.

 https://www.google.com/finance

그런 다음 결과가 파일에 기록되고 쓰기 위한 파일이 바이너리로 열립니다.

추신: 코드 기반에서 WinInet이 있는 예제를 찾으십시오. 여기에서도 마찬가지입니다.

 
sanyooooook :

GET도 거기에 작성됩니다. 이는 GET 요청을 의미하며 POST이면 POST 요청입니다(게시 요청과 함께 더 많은 요청 매개변수를 보낼 수 있음).

결과 변수는 링크에 있는 내용에 기록됩니다.

그런 다음 결과가 파일에 기록되고 쓰기 위한 파일이 바이너리로 열립니다.

잘 이해했습니다. 도움말에는 예가 없습니다.
또한 POST 요청으로 텍스트가 아닌 데이터를 로드하는 것이 중요합니다.

추적된 요청, 항상 헤더로 전달

Content-Type: application/x-www-form-urlencoded

이미지를 업로드해야 할 것 같지만

Content-Type: multipart/form-data;
Content-Type: image/jpeg
 

예전에 이렇게 해봤는데 안되고 사진에 안뜨네요.

 //+------------------------------------------------------------------+
//|                                                     HttpPOST.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link        "http://www.metaquotes.net"
#define INTERNET_FLAG_PRAGMA_NOCACHE                                             0x00000100    // не кешировать страницу
#define INTERNET_FLAG_KEEP_CONNECTION                                           0x00400000    // не разрывать соединение
#define INTERNET_FLAG_SECURE                                             0x00800000 
#define INTERNET_FLAG_RELOAD                                                                             0x80000000    // получать страницу с сервера при обращении к ней
#define INTERNET_OPEN_TYPE_PRECONFIG   0    // use registry configuration
#define INTERNET_FLAG_KEEP_CONNECTION   0x00400000    // use keep-alive semantics
#define INTERNET_SERVICE_HTTP   3

#import "wininet.dll"
         int InternetAttemptConnect( int x);
   int InternetOpenA( string sAgent, int lAccessType, string sProxyName= "" , string sProxyBypass= "" , int lFlags = 0 );
         int InternetConnectA( int hInternet, string lpszServerName, /*WORD*/ int nServerPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags,   int dwContext);
   int HttpOpenRequestA( int hConnect, string lpszVerb, string lpszObjectName, string lpszVersion, string lpszReferer, string lplpszAcceptTypes, int dwFlags, int dwContext);
   int HttpSendRequestA( int hRequest, string lpszHeaders, int dwHeadersLength, int & lpOptional[], int dwOptionalLength);
   int InternetCloseHandle( int hInet);
//  int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]);
int InternetReadFile( int hFile, string sBuffer, int lNumBytesToRead, int & lNumberOfBytesRead[]);
#import
        
         string Host= "secure.indx.ru" ;
         string Path= "/api/v1/tradejson.asmx" ;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
         int h= FileOpen ( "text.txt" , FILE_BIN | FILE_READ ); if (h< 0 ) return ;
         FileSeek (h, 0 , SEEK_SET );       int size= MathFloor ( FileSize (h)/ 4 ); if ( FileSize (h)% 4 != 0 )size++;
         int data[], i= 0 ;         ArrayResize (data, size); // изменили размер
         while (! FileIsEnding (h)) { data[i]= FileReadInteger (h, LONG_VALUE); i++; }
         FileClose (h); // 
         // выводим прочитанный массив для проверки
         string st= "" ;
         for (i= 0 ; i<size; i++) 
        {
                st=st+CharToStr(data[i]& 255 ); st=st+CharToStr(data[i]>> 8 & 255 ); 
                st=st+CharToStr(data[i]>> 16 & 255 ); st=st+CharToStr(data[i]>> 24 & 255 ); 
        }
         Print ( "Размер файла: " +size* 4 + "  байт" );
         Print ( "Данные: " +st);
         int hInternetSession, hConnectHandle, hResourceHandle, result;
         if (InternetAttemptConnect( 0 )!= 0 ) { Print ( "error InternetAttemptConnect" ); return ( 0 ); }
        hInternetSession=InternetOpenA( "Microsoft Internet Explorer" ,  INTERNET_OPEN_TYPE_PRECONFIG, "" , "" , 0 ); 
         if (hInternetSession<= 0 ) { Print ( "error InternetOpenA()" ); return ( 0 ); }
        
        hConnectHandle=InternetConnectA(hInternetSession, Host, 80 , "" , "" , INTERNET_SERVICE_HTTP, 0 , 0 ); 
         if (hConnectHandle<= 0 ) { Print ( "error InternetConnect()" ); return ( 0 ); }
        
        hResourceHandle=HttpOpenRequestA(hConnectHandle, 
                                         "POST" , 
                                         Path, 
                                         "" , 
                                         "" , 
                                         "Accept: text/json\r\n" , 
                                         INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 
                                         0 ); 
         if (hResourceHandle<= 0 ) { Print ( "error HttpOpenRequest()" ); return ( 0 ); }
         Print (hResourceHandle);
         string Head= "Content-Type: application/x-www-form-urlencoded" ;
   int Len= StringLen (Head);
        result=HttpSendRequestA(hResourceHandle, Head, Len, data, size);
         Print (result);
         if (result<= 0 ) { Print ( "error HttpSendRequestA()" ); return ( 0 ); }
         //Print("Сука вот я дебил!!! )))");
   int      lReturn[]  = { 1 };
   string   sBuffer    = "" ;
   string strWebPage= "" ;
   int I= 0 ;
   while (! IsStopped ()) {
     if (InternetReadFile(hResourceHandle, sBuffer, 128 , lReturn) <= 0 || lReturn[ 0 ] == 0 ) {
     //Print(sBuffer);
       break ;
    }
    I++;
     Print (I);
    strWebPage = StringConcatenate (strWebPage, StringSubstr (sBuffer, 0 , lReturn[ 0 ]));
  }
     Print (strWebPage);
   InternetCloseHandle(hResourceHandle);
        InternetCloseHandle(hConnectHandle);
        InternetCloseHandle(hInternetSession);     
   return ( 0 );
  }
//+------------------------------------------------------------------+
 

아니요, DLL을 사용하면 무엇이든 할 수 있습니다.
예를 들어 주셔서 감사합니다.

저는 일반 도구인 WebRequest 에 관심이 있습니다.

 
fyords :

아니요, DLL을 사용하면 무엇이든 할 수 있습니다.

저는 일반 도구인 WebRequest에 관심이 있습니다.

내가 이해하는 것처럼 WinInet을 사용하는 것과 유추하여 수행하십시오. 헤더의 정확성에 문제가 있습니다.
 
sanyooooook :
내가 이해하는 것처럼 WinInet을 사용하여 유추하여 수행하십시오. 헤더의 정확성에 문제가 있습니다.
아니요, 문제는 WebRequest 가 자체 헤더를 생성하는 것을 허용하지 않는다는 것입니다.
 
어디에 게시해야합니까?