Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 17

 
PapaYozh #:

Наверное, надо в эту ветку поместить Ваше описание. Иначе есть риск, что разработчики не заметят.

Рашид (@Rashid Umarov) уже не реагирует на Ваши сообщения, хотя ошибка, как говорится, на лицо.

Я молча читаю и поражаюсь. Все это многократно уже обсуждалось - что в процессе работы терминала количество баров может выходить за пределы MaxBars. Бары  не обрезаются.

 
PapaYozh #:

В этом и есть ошибка.

Ошибка-то и есть ошибка. А как всё написано, я вчера не стал даже пытаться разобраться. Так-же и Рашид поступил. 

Ведь в коде берётся time[0] и iTime(,, rates_total-1] и попробуй всё это сложить в одно целое. Разве что с похмелюги…

 
Rashid Umarov #:

Я молча читаю и поражаюсь. Все это многократно уже обсуждалось - что в процессе работы терминала количество баров может выходить за пределы MaxBars. Бары  не обрезаются.

Рашид, проблема описана как-то непонятно. Потому и реакция Ваша такая. Проблема в том, что время текущего бара не определяется.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Alexey Viktorov, 2023.02.07 09:07

Конечно код у вас написан, простите через……… Зачем было так выворачиваться, ведь достаточно написать простой цикл

   datetime arr_time=0, i_time=0;
//---
   for(int i=rates_total-1; i_time<=0 && i>0; i--) {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,i);
      printf("i: %d   rates_total-%d: %d   time: %I64d   iTime: %I64d   Error: %d", i, i, rates_total-i, arr_time, i_time, GetLastError());
   }

и получить значения самого свежего бара.

На снимке видно невооружённым взглядом, что на отладке, i = rates_total-1. При этом время time[i] равно текущему часу. А время iTime(_Symbol,PERIOD_CURRENT,i) того-же бара не найдено.

И на следующем баре тоже не найдено…


 
Alexey Viktorov #:

Конечно код у вас написан, простите через……… Зачем было так выворачиваться, ведь достаточно написать простой цикл

Простите конечно, Алексей, за мои 5 копеек. Но ваш код (при i=rates_total-1) проверяет для time[i] - значение самого свежего бара, а iTime(_Symbol,PERIOD_CURRENT,i) - значение самого старого бара. Какой смысл их сравнивать?

   datetime arr_time=0, i_time=0;
//---
   for(int i=rates_total-1; i_time<=0 && i>0; i--) {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,i);
      printf("i: %d   rates_total-%d: %d   time: %I64d   iTime: %I64d   Error: %d", i, i, rates_total-i, arr_time, i_time, GetLastError());
   }
Но факт остаётся фактом. Старые бары iTime(...) не видит. И в этом проблема.
 
Вот здесь описал всё вроде доходчиво и понятно... Ну как смог ))
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2023.02.07
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Rashid Umarov #:

Я молча читаю и поражаюсь. Все это многократно уже обсуждалось - что в процессе работы терминала количество баров может выходить за пределы MaxBars. Бары  не обрезаются.

То что количество баров выходит за пределы MAXBARS по подсчёту индикатора, это уже очевидно. Но почему индикатор их видит, а функции нет. Вот где косяк. Как можно работать с функциями, если iBars(...) считает те бары, которые не видит iTime(...)

Вот, изменил код. Так вообще интересно. Вместо rates_total поставил iBars(...)

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   datetime arr_time=0, i_time=0;
//---
   for(int i=0; i_time<=0 && i<iBars(_Symbol,_Period); i++) 
     {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,iBars(_Symbol,_Period)-1-i);
      printf("i: %d   iBars(_Symbol,_Period)-%d: %d   time: %s   iTime: %s   Error: %d", i, i, iBars(_Symbol,_Period)-i, TimeToString(arr_time), TimeToString(i_time), GetLastError());
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Вот что получается

CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 0   iBars(_Symbol,_Period)-0: 10005   time: 2022.12.19 15:05   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 1   iBars(_Symbol,_Period)-1: 10004   time: 2022.12.19 15:10   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 2   iBars(_Symbol,_Period)-2: 10003   time: 2022.12.19 15:15   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 3   iBars(_Symbol,_Period)-3: 10002   time: 2022.12.19 15:20   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 4   iBars(_Symbol,_Period)-4: 10001   time: 2022.12.19 15:25   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:24.934    iError_iTime (EURUSD,M5)        i: 5   iBars(_Symbol,_Period)-5: 10000   time: 2022.12.19 15:30   iTime: 2022.12.19 15:30   Error: 0
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 0   iBars(_Symbol,_Period)-0: 10005   time: 2022.12.19 15:05   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 1   iBars(_Symbol,_Period)-1: 10004   time: 2022.12.19 15:10   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 2   iBars(_Symbol,_Period)-2: 10003   time: 2022.12.19 15:15   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 3   iBars(_Symbol,_Period)-3: 10002   time: 2022.12.19 15:20   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 4   iBars(_Symbol,_Period)-4: 10001   time: 2022.12.19 15:25   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.296    iError_iTime (EURUSD,M5)        i: 5   iBars(_Symbol,_Period)-5: 10000   time: 2022.12.19 15:30   iTime: 2022.12.19 15:30   Error: 0
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 0   iBars(_Symbol,_Period)-0: 10005   time: 2022.12.19 15:05   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 1   iBars(_Symbol,_Period)-1: 10004   time: 2022.12.19 15:10   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 2   iBars(_Symbol,_Period)-2: 10003   time: 2022.12.19 15:15   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 3   iBars(_Symbol,_Period)-3: 10002   time: 2022.12.19 15:20   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 4   iBars(_Symbol,_Period)-4: 10001   time: 2022.12.19 15:25   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:25.575    iError_iTime (EURUSD,M5)        i: 5   iBars(_Symbol,_Period)-5: 10000   time: 2022.12.19 15:30   iTime: 2022.12.19 15:30   Error: 0
CS      0       11:57:27.321    iError_iTime (EURUSD,M5)        i: 0   iBars(_Symbol,_Period)-0: 10005   time: 2022.12.19 15:05   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:27.321    iError_iTime (EURUSD,M5)        i: 1   iBars(_Symbol,_Period)-1: 10004   time: 2022.12.19 15:10   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:27.322    iError_iTime (EURUSD,M5)        i: 2   iBars(_Symbol,_Period)-2: 10003   time: 2022.12.19 15:15   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:27.322    iError_iTime (EURUSD,M5)        i: 3   iBars(_Symbol,_Period)-3: 10002   time: 2022.12.19 15:20   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:27.322    iError_iTime (EURUSD,M5)        i: 4   iBars(_Symbol,_Period)-4: 10001   time: 2022.12.19 15:25   iTime: 1970.01.01 00:00   Error: 4401
CS      0       11:57:27.322    iError_iTime (EURUSD,M5)        i: 5   iBars(_Symbol,_Period)-5: 10000   time: 2022.12.19 15:30   iTime: 2022.12.19 15:30   Error: 0
Файлы:
 

То что при MAXBARS равным  Unlimited все функции всё показывают, это не вызывает вопросов. Но стоит поставить какое то значение MAXBARS, не перегружая терминал, и все старые бары для iTime(...) и других становятся недоступными. В то время как индикатор и iBars(...) их считают.

Вероятно, то что такое происходит, может инициировать ошибки в индикаторах или программах, которые используют iBars(...) и iTime(...), iOpen(...), iHigh(...) и другие одновременно.

 
Andrey Kaunov #:

Простите конечно, Алексей, за мои 5 копеек. Но ваш код (при i=rates_total-1) проверяет для time[i] - значение самого свежего бара, а iTime(_Symbol,PERIOD_CURRENT,i) - значение самого старого бара. Какой смысл их сравнивать?

Но факт остаётся фактом. Старые бары iTime(...) не видит. И в этом проблема.

Да, тормознул…

зы: Вывод один… Как мне сразу не понравилось, что внесли в mql5 эти функции из mql4 так они и показывают себя. Видимо надёжней пользоваться функциями Copy****

 
Alexey Viktorov #:

Да, тормознул…

зы: Вывод один… Как мне сразу не понравилось, что внесли в mql5 эти функции из mql4 так они и показывают себя. Видимо надёжней пользоваться функциями Copy****

А на них уже в документации наложено это ограничение, не более MAXBARS.

 
Andrey Kaunov #:

А на них уже в документации наложено это ограничение, не более MAXBARS.

А зачем больше MAXBARS?

Получает количество баров равное rates_total

    datetime ctime[];
    int copyTime = CopyTime(_Symbol, PERIOD_CURRENT, 0, INT_MAX, ctime);