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

 

Обнаружил ошибку в данных Таймсерий в МТ5.

При установленном параметре TERMINAL_MAXBARS на значение 10000 (для примера), в окне графика отображается ровно 10000 баров. Причём, при появлении нового бара, старый пропадает. Так что на графике их всегда 10000.

Но, эти бары, которые ушли в историю, "видит" индикатор. Общее количество (вместе с ними) показывает rates_total, и все массивы-таймсерии индикатора (time[], open[], high[] и т.д.) показывают данные этих баров.

Функция iBars(...) тоже вернёт значение 10000+бары, которые ушли в историю. Но функции iTime(), iOpen(), iHigh() и др. этих баров не видят. При запросе выдают ошибку  4401 - Запрашиваемая история не найдена.

Проверить это можно прилагаемым индикатором. Он проверяет бары с начала истории по значению rates_total, и при нахождении первого не нулевого значения функции iTime(...), останавливается. 

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<rates_total; i++) 
     {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,rates_total-1-i);
      printf("i: %d   rates_total-%d: %d   time: %s   iTime: %s   Error: %d", i, i, rates_total-i, TimeToString(arr_time), TimeToString(i_time), GetLastError());
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Сделайте следующим образом. Измените значение  TERMINAL_MAXBARS в настройках терминала, и (важно!) перезагрузите его. Затем установите на график индикатор (прикрепил к посту). Дождитесь появления нового бара, и вы увидите, что старый, который ушел в историю, видят только таймсерии индикатора. iTime(...) его не видит. На скрине ниже график, крайний бар которого в 19:40. Но индикатор видит и предыдущие бары. 

После перезагрузки терминала ничего не меняется. Индикатор и функция iBars(...) продолжает видеть ушедшие в историю бары. А iTime(...) и другие их не видят. Причём, если перед перезагрузкой изменить значение TERMINAL_MAXBARS, вся "память" индикатора на ушедшие в историю бары  сбросится. Но если просто увеличить значение TERMINAL_MAXBARS, без перезагрузки терминала, то iTime() и другие функции начнут видеть все бары, которые и видит индикатор, считает rates_total и функция iBars(...) .

При значении TERMINAL_MAXBARS равным Unlimited, такой ошибки не возникает.

Файлы:
 

Возможно ли во время выполнения кода в отладке сделать DebugBreak?

Непонятно, в каком месте иногда код подвисает. Хотелось бы во время подвисания сделать DebugBreak и увидеть, соответственно, причины.

 
fxsaber #:

Возможно ли во время выполнения кода в отладке сделать DebugBreak?

Непонятно, в каком месте иногда код подвисает. Хотелось бы во время подвисания сделать DebugBreak и увидеть, соответственно, причины.

Конечно можно по условию сделать DebugBreak, но какое условие поставить? Вот в чём вопрос…

 
Alexey Viktorov #:

Конечно можно по условию сделать DebugBreak, но какое условие поставить? Вот в чём вопрос…

Предполагал так действовать:

под отладчиком код завис - захожу в ME и нажимаю "принудительно прервать и начать отладку с места прерывания".

 
fxsaber #:

Предполагал так действовать:

под отладчиком код завис - захожу в ME и нажимаю "принудительно прервать и начать отладку с места прерывания".

Наверное лучше нажать паузу, а не прерывание.

 
Alexey Viktorov #:

Наверное лучше нажать паузу, а не прерывание.

Главное, смысл понятен - DebugBreak в месте текущего выполнения кода.

 
Во время отладки (тестер) при получении ошибки, не переходит на место ее возникновения в IDE. Тестер продолжает работать уже без отладки.
 

Прошу обратить внимание разработчиков на эту проблему:
Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)

Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited)

после загрузки все внутренние массивы очищаются с помощью ArrayFree()

но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) -  это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры  MqlRates) = 486 533 940 байт)

Причем эту занятую память никак не освободить и со временем она сама не очищается. 
Я понимаю зачем так сделано:
Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера. 
Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив  MqlRates. 
Спасибо

Файлы:
 
Nikolai Semko # :

Прошу обратить внимание разработчиков на эту проблему:
Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)

Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited )

после загрузки все внутренние массивы очищаются с помощью ArrayFree()

но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) -  это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры  MqlRates) =  486 533 940 байт)

Причем эту занятую память никак не освободить и со временем она сама не очищается. 

Это очищается через 30 минут.

Я понимаю зачем так сделано:
Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера. 
Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив  MqlRates. 
Спасибо

Полностью согласен, было бы неплохо иметь функцию.

 

А можно убрать вот эту двойку в редакторе при вызове Alt+M? Если это не оценка, конечно))

Опять двойка!

build 3550
Причина обращения: