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

 
Fia:

Здравствуйте господа разработчики!

А можно ли внести изменения в компилятор MQL5, чтоб хотя бы предупреждение выдавал,

на такого рода косяки в коде.

if(Flag_Exitl=true) {break;}


Тут не верно написано условие сравнения (должно быть == ) и поэтому всегда будет выполнятся break.

Как то эту ситуацию в компиляторе обозначить (если это возможно вообще), чтоб меньше шишек набивать при написании кода?

(подумал не получится, похоже разделить присваивание и сравнение в if, тогда вопрос снят).

Сделать можно, если в условии булево присвоение с константой справа.
Переменные типа bool можно не сравнивать с true/false, а использовать напрямую (по сути это флаг да/нет) 
if(Flag_Exitl) {break;}
По Вашему получается масло масленое
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
notused:

У меня регулярно появляется ошибка  4401  

ERR_HISTORY_NOT_FOUND

Следующий код индикатора

выдаст ошибку сразу при старте (если кинуть не на D1). Вернее, один раз после запуска терминала и открытия графика - нацепить индикатор, получим ошибку. Если терминал не закрывать, то больше ошибки такой на старте не происходит.

Но через некоторое время (пару часов - мне хватило 2 часа)  увидим, что и на уже давно открытом графике получаем ошибку. (запускал на m30)

Представители, MetaQuotes, прокомментируйте, пожалуйста, это так и должно быть?
 
struct SDaylyRange {double min, max, open, close;};
struct SNoDaylyRange {
   uint x;
   double y;
 };

void OnStart()
  {
   SNoDaylyRange tmp;
   SDaylyRange tmp2 = tmp;
  }
Этот код компилится без единого warning. Хотя, наверное, даже компилиться не должен
 
notused:
..регулярно появляется ошибка  4401 

справко:

Организация доступа к данным

Доступность данных

Наличие данных в формате HCC или даже в готовом для использования формате HC не всегда означает безусловную доступность этих данных для отображения на графике или для использования в mql5-программах.

При доступе к ценовым данным или к значениям индикаторов из mql5-программ следует помнить, что не гарантируется их доступность в определенный момент времени, либо с определенного момента времени. Это связано с тем, что в целях экономии ресурсов в MetaTrader 5 не хранится полная копия требуемых данных для mql5-программы, а дается прямой доступ к базе данных терминала.

Ценовая история по всем таймфреймам строится из общих данных формата HCC и любое обновление данных с сервера приводит к обновлению данных по всем таймфреймам и пересчету индикаторов. Вследствие этого, в доступе к данным может быть отказано даже в том случае, если эти данные были доступны мгновение назад.

CopyRate

При запросе данных из индикатора, если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.
Похоже так и должно быть. До CopyRate SERIES_SYNCRONIZED можно проверить..
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - Документация по MQL5
 
Swan:

справко:

Похоже так и должно быть. До CopyRate SERIES_SYNCRONIZED можно проверить..

посыпаю голову пеплом - таки да. Спасибо.

 Хотя странно видеть запрос двух баров и недоступность истории, хотя меняется только нулевой бар. Ну да ладно - если описано в документации, значит не ошибка

 

в моей IsNewBar была ошибка выходит.

Вместо

CopyTime(sym, period, 0, 1, currentTime);

 нужно было писать

   if (CopyTime(sym, period, 0, 1, currentTime) < 1) return (false);

А я то думал, почему раз в пару часов получается IsNewBar(PERIOD_D1) == true -> отсюда и выяснил о недоступности истории, но не мог подумать на функцию, которую написал год или два назад. 

 
sergeev:

Почему индикатор не может работать с цветовыми типами (COLOR_ARROW, и т.д.) более чем с одним буфером

пример кода

Задаем два DRAW_COLOR_ARROW (buf1 и buf2) и к каждому дополнительный цветовой буфер (clr1, clr2)

При этом видим, что второй буфер buf2 хоть и получает значения High/Low баров,  но он не отображается на чарте. Складывается впечатление, что цвет стрелок этого буфера = clrNONE. То есть не работает задание цвета в clr2 буфер


вот скрин. видны только значения buf1/clr1.   Значения второго буфера не отображаются цветом хотя значения получают.


Где ошибка?

Вопрос просто создан для ответа "в ДНК MQL5".

Такая чепуха и на DRAW_FILLING, и даже на относительно нормальном DRAW_HISTOGRAM2 (не так стабильно конечно, но баги встречаются).

Вот как раз из нестабильности багов, я делаю вывод что без СД вам вряд ли ответят.

 

Bild 642 для Win32 

какая то проблема с трехмерными массивами double появляется если ошибочно выйти за пределы массива при выводе в ф-ции Print

скрипт уходит самостоятельно в бесконечный цикл. 

int i1,i2,i3;
double out[3][7][7];
for(i1=0;i1<7;i1++) out[0][0][i1] = inp[i1];
double sum;
sum = 0.0;
for(i3=0;i3<3;i3++){
   for(i2=0;i2<7;i2++){
      for(i1=1;i1<7;i1++)  sum += W[i3][i2][i1] * out[i3][i2][i1-1];
      out[i3][i2][i1] = f(sum + WT[i3][i2]);
      sum = 0.0;
      Print("out[",i3,"][",i2,"][",i1,"] = ",out[i3][i2][i1]);
   }
}
Print("sum = ",sum);

}
//-------------------------------------------------------
double f(double x){return(1/(1+MathExp(-x)));}
 
IgorM:

Bild 642 для Win32 

какая то проблема с трехмерными массивами double появляется если ошибочно выйти за пределы массива при выводе в ф-ции Print

Вообще выход за пределы происходит на две строчки раньше

а вы при этом вызываете экспоненту от несуществующего элемента, скорее всего нуля.

смотрите в журнал

 
sergeev:

Вообще выход за пределы происходит на две строчки раньше

а вы при этом вызываете экспоненту от несуществующего элемента, скорее всего нуля.

смотрите в журнал

да, я знаю, и привел код который не вызывает ошибку при выполнении, а зацикливает скрипт