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

Alexey Petrov #:

Сначала вас должны переместить в "Выбранные" (а вы находитесь в "Кандидаты")

Спасибо, понял.

Верните назад дробные. Раньше не выдавало от такого целое число.

Comment(NormalizeDouble(4*100/319,2)); //выдает 1.0

покажет 1.0

выдает всегда целые.

пробовал и с (double) и без всегда одно число.

Comment(NormalizeDouble((double)4*100/319,2)); //выдает дробное только так, но ведь не переписывать тонну кода в старых программах, если  мне надо получить целое, для этого есть отдельные функции из группы Math


билд 3571.

Alexandr Gavrilin #:

Верните назад дробные. Раньше не выдавало от такого целое число.

покажет 1.0

выдает всегда целые.

пробовал и с (double) и без всегда одно число.

билд 3571.

Так было всегда. В соответствии с правилами приведения типов ошибки нет. Там даже есть пример демонстрирующий это.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5

Обнаружил ошибку в данных Таймсерий в МТ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. Тестер продолжает работать уже без отладки.