Ошибки, баги, вопросы - страница 3716

 

Это нормально?


 
Alain Verleyen #:
Подтверждено и передано в MetaQuotes.

WebRequest не вычитывает большие ответы. Тайм-аут не работает.
В реальном использовании моя конечная точка возвращает примерно 42 000 байт, но ответ не читается полностью.

Вот тестовый пример большого ответа.
Таймаут не работает.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   //Stream n JSON responses
   string n = "50"; 
   
   string url = "https://httpbin.org/stream/"+n;
   string header;
   char   body[];   
   char   result[];
   string res_header;
   
   
   ResetLastError();
   if(WebRequest("GET", url, header, 30000, body, result, res_header) < 0)
   {
      Print("Failed to complete WebRequest, error ", _LastError);
      return;
   }       
                
   Print(res_header);
   Print(CharArrayToString(result));

}
DO      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Date: Wed, 25 Feb 2026 15:36:18 GMT
IH      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Content-Type: application/json
KO      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Transfer-Encoding: chunked
KD      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Connection: keep-alive
DS      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Server: gunicorn/19.9.0
GK      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Access-Control-Allow-Origin: *
GQ      0       20:36:19.331    TEST_Rest (EURUSD,M1)   Access-Control-Allow-Credentials: true
JG      0       20:36:19.331    TEST_Rest (EURUSD,M1)   
GR      0       20:36:19.331    TEST_Rest (EURUSD,M1)   {"url": "https://httpbin.org/stream/50", "args": 
                                                         ... etc }
                                                         ...
                                                         ...
                                                         ...
LP      0       20:36:19.332    TEST_Rest (EURUSD,M1)   {"url": "https://httpbin.org/stream/50", 
                                                         "args": {}, 
                                                         "headers": {"Host": "httpbin.org", 
                                                                     "X-Amzn-Trace-Id": "Root=1-699f16f2-772574300043c4145c3899ce", 
                                                                     "Accept": "*/*", 
                                                                     "Accept-Encoding": "gzip, deflate", 
                                                                     "Accept-Language": "ru,en;q=0.5", 
                                                                     "User-Agent": "MetaTrader 5 Terminal/5.5640 (Windows NT 11.0.22631; x64)"}, 
                                                                     "origin": "0.000.000.0", ?????
 
Aleh Sasonka #:

Это нормально?


Вероятно кому-то в той организации лень нормально настроить MetaTrader Server и заполнить через MetaTrader Administrator все поля правильно, человеческий фактор :)

Напишите им об этом, вдруг они забыли или может бэкап не тот накатили.

 
Roman #:

WebRequest не вычитывает большие ответы. Тайм-аут не работает.
В реальном использовании моя конечная точка возвращает примерно 42 000 байт, но ответ не читается полностью.

Вот тестовый пример большого ответа.
Таймаут не работает.

How is your code related to timeout ? Such request take less than 1 second to return.

2026.02.25 13:04:25.220    Script (EURUSD,M1)    WebRequest executed in 766 ms

Running your code, I don't have any issue.

 
Alain Verleyen #:

How is your code related to timeout ? Such request take less than 1 second to return.

2026.02.25 13:04:25.220    Script (EURUSD,M1)    WebRequest executed in 766 ms

Running your code, I don't have any issue.

The data is not fully read. Look at the end of the response body, it is not fully read.
 
Roman # :
The data is not fully read. Look at the end of the response body, it is not fully read.

Данные в порядке. Проблема в том, что вырезается (печатается) лог, ответ корректный.

Извините, я забыл перевести свой предыдущий ответ.

 
Alain Verleyen #:

Данные в порядке. Проблема в том, что вырезается (печатается) лог, ответ корректный.

Извините, я забыл перевести свой предыдущий ответ.

I have written the data to a file. Everything is really correct, please excuse me.
 
В Учебнике такая фраза.
Функция возвращает количество скопированных элементов массива либо -1 в случае ошибки, код которой можно узнать из _LastError. В частности, ошибка возникнет, если задан несуществующий символ, интервал не содержит данных на сервере или выходит за ограничение по количеству баров на графике (TerminalInfoInteger(TERMINAL_MAXBARS)).
Но у меня не возникает ошибки.
void OnStart()
{
  MqlRates Rates[];
  
  Print(CopyRates(_Symbol, PERIOD_M1, D'1970.01.01', D'2100.01.01', Rates)); // 5000
  Print(_LastError); // 0
}
Как понять, что бары не все получены из-за низкого MaxBars?
Учебник по MQL5: Получение котировок в виде массива структур MqlRates / Создание прикладных программ
Учебник по MQL5: Получение котировок в виде массива структур MqlRates / Создание прикладных программ
  • www.mql5.com
Для запроса массива котировок, включающего все характеристики баров, предназначена функция CopyRates , имеющая несколько перегрузок. int...
 
fxsaber #:
В Учебнике такая фраза. Но у меня не возникает ошибки. Как понять, что бары не все получены из-за низкого MaxBars?
Через костыль.
datetime NextMonth( const datetime Time )
{
  MqlDateTime sTime = {};

  if (::TimeToStruct(Time, sTime))
  {
    if (sTime.mon++ == 12)
    {
      sTime.year++;
      sTime.mon = 1;
    }

    sTime.day = 1;

    sTime.hour = 0;
    sTime.min = 0;
    sTime.sec = 0;
  }

  return(::StructToTime(sTime));
}

bool IsFull( const string Symb, const MqlRates &Rates[] )
{
  datetime Month[] = {0};
  
  return(ArraySize(Rates) && CopyTime(Symb, PERIOD_MN1, (datetime)0, 1, Month) && (NextMonth(Month[0]) > Rates[0].time));
}

void OnStart()
{
  MqlRates Rates[];
  
  if (CopyRates(_Symbol, PERIOD_M1, 0, INT_MAX, Rates) && !IsFull(_Symbol, Rates))
    Alert("MaxBars!");
}
Есть нормальные решения?
 
fxsaber #:
Через костыль. Есть нормальные решения?

 //--- максимально баров в Терминале
      int terminal_maxbars = TerminalInfoInteger(TERMINAL_MAXBARS);
      //--- время на которое приходится самый первый бар Треминала
      datetime first_bar_time=iTime(_Symbol,_Period,terminal_maxbars-1);

сравниваем запрос и first_bar_time ?